Работа с кнопками

Урок 6: Работа с кнопками

Цели урока:

  1. Познакомиться с подключением кнопок и чтением их состояния.
  2. Научиться использовать конструкции if-else и switch-case для обработки нажатий кнопок.
  3. Закрепить знания на практике, создав проекты с использованием кнопок.

Теоретическая часть

Что такое кнопка и как она работает?

Кнопка — это простейшее устройство ввода, которое замыкает или размыкает электрическую цепь при нажатии. В Arduino кнопка используется для взаимодействия с пользователем, например, для включения светодиода или запуска определенной функции.

Как это работает:

  • Когда кнопка не нажата, цепь разомкнута, и на входном пине Arduino будет низкий уровень (LOW).
  • Когда кнопка нажата, цепь замыкается, и на входном пине Arduino будет высокий уровень (HIGH).

Подтягивающий резистор:

Чтобы избежать "плавающего" состояния пина, когда кнопка не нажата, используется подтягивающий резистор. В Arduino можно использовать встроенный подтягивающий резистор, установив режим пина как INPUT_PULLUP.

Подключение кнопки

Схема подключения (рисунок ниже):

  1. Подключите один контакт кнопки к цифровому пину на Arduino (например, 2).
  2. Подключите другой контакт кнопки к GND.
  3. Используйте встроенный подтягивающий резистор, установив режим пина как INPUT_PULLUP.
  4. Подключите светодиод к 13 пину.

Пример подключения:

  • Пин 2 → Кнопка → GND.
Схема подключения кнопки к Arduino Uno с использованием INPUT_PULLUP

Чтение состояния кнопки

Для чтения состояния кнопки используется функция digitalRead().

Пример кода:

void setup() {
  pinMode(2, INPUT_PULLUP); // Настройка пина 2 как входа с подтягивающим резистором
  pinMode(13, OUTPUT);      // Настройка пина 13 как выхода (светодиод)
}

void loop() {
  int buttonState = digitalRead(2); // Чтение состояния кнопки

  if (buttonState == LOW) { // Если кнопка нажата (LOW, так как используется INPUT_PULLUP)
    digitalWrite(13, HIGH); // Включить светодиод
  } else {
    digitalWrite(13, LOW);  // Выключить светодиод
  }
}

Объяснение кода:

  1. pinMode(2, INPUT_PULLUP);: Настраиваем пин 2 как вход с подтягивающим резистором.
  2. pinMode(13, OUTPUT);: Настраиваем пин 13 как выход (светодиод).
  3. int buttonState = digitalRead(2);: Читаем состояние кнопки.
  4. if (buttonState == LOW): Проверяем, нажата ли кнопка.
  5. digitalWrite(13, HIGH);: Включаем светодиод, если кнопка нажата.
  6. digitalWrite(13, LOW);: Выключаем светодиод, если кнопка не нажата.

Конструкция if-else

Конструкция if-else позволяет выполнять разные действия в зависимости от условия.

Синтаксис:

if (условие) {
  // Действие, если условие истинно
} else {
  // Действие, если условие ложно
}

Пример:

if (buttonState == LOW) {
  digitalWrite(13, HIGH); // Включить светодиод
} else {
  digitalWrite(13, LOW);  // Выключить светодиод
}

Конструкция switch-case

Конструкция switch-case используется для выполнения разных действий в зависимости от значения переменной.

Синтаксис:

switch (переменная) {
  case значение1:
    // Действие, если переменная равна значению1
    break;
  case значение2:
    // Действие, если переменная равна значению2
    break;
  default:
    // Действие по умолчанию
}

Пример:

int buttonState = digitalRead(2);

switch (buttonState) {
  case LOW:
    digitalWrite(13, HIGH); // Включить светодиод
    break;
  case HIGH:
    digitalWrite(13, LOW);  // Выключить светодиод
    break;
  default:
    // Действие по умолчанию
}

break – ключевое слово, которое предотвращает "проваливание" в следующий case. Если его не поставить, выполнение продолжится дальше, даже если следующий case не соответствует значению переменной.

default – необязательная секция, которая выполняется, если ни один из case не совпал.

Практическая часть

Светодиод включается при нажатии кнопки

Цель задания:

Создать проект, в котором светодиод включается при нажатии кнопки и выключается, когда кнопка отпущена.

Необходимые компоненты:

  • Кнопка.
  • Светодиод.
  • Резистор 220 Ом.
  • Провода.
  • Макетная плата (можно и без нее).

Схема подключения:

  1. Подключите один контакт кнопки к пину 2.
  2. Подключите другой контакт кнопки к GND.
  3. Подключите анод светодиода к пину 13 через резистор 220 Ом.
  4. Подключите катод светодиода к GND.

Код программы:

void setup() {
  pinMode(2, INPUT_PULLUP); // Настройка пина 2 как входа с подтягивающим резистором
  pinMode(13, OUTPUT);      // Настройка пина 13 как выхода (светодиод)
}

void loop() {
  int buttonState = digitalRead(2); // Чтение состояния кнопки

  if (buttonState == LOW) { // Если кнопка нажата (LOW, так как используется INPUT_PULLUP)
    digitalWrite(13, HIGH); // Включить светодиод
  } else {
    digitalWrite(13, LOW);  // Выключить светодиод
  }
}

Готовый проект по ссылке: кнопка

Управление светодиодом с помощью switch-case

Цель задания:

Создать проект, в котором светодиод включается и выключается с помощью кнопки, используя конструкцию switch-cas.

Схема подключения такая же как и в примере выше.

Код программы:

void setup() {
  pinMode(2, INPUT_PULLUP); // Настройка пина 2 как входа с подтягивающим резистором
  pinMode(13, OUTPUT);      // Настройка пина 13 как выхода (светодиод)
}

void loop() {
  int buttonState = digitalRead(2); // Чтение состояния кнопки

  switch (buttonState) {
    case LOW:
      digitalWrite(13, HIGH); // Включить светодиод
      break;
    case HIGH:
      digitalWrite(13, LOW);  // Выключить светодиод
      break;
    default:
      // Действие по умолчанию
  }
}

Готовый проект по ссылке: кнопка с использованием case.

Переключение режимов светодиода

Цель задания:

Создать проект, в котором светодиод переключается между режимами (включен, выключен, мигание) при каждом нажатии кнопки.

Схема подключения такая же как и в примере выше.

Код программы:

int mode = 0; // Переменная для хранения текущего режима
int buf_mode = 0; //Буферная переменная

void setup() {
  pinMode(2, INPUT_PULLUP); // Настройка пина 2 как входа с подтягивающим резистором
  pinMode(13, OUTPUT);      // Настройка пина 13 как выхода (светодиод)
}

void loop() {
  if (digitalRead(2) == LOW) { // Если кнопка нажата
    delay(200); //защита от дребезга (для переключения режима необходимо держать кнопку нажатой более 200 мс)
    if (mode == buf_mode){ //если условие выполняется 
      mode = (mode + 1) % 3; // Переключение режима (0, 1, 2)
    }
  }
  else{ //если условиен не выполняется
    buf_mode = mode;  //в буферную переменную записываем значение mode
  }

  switch (mode) {
    case 0:
      digitalWrite(13, LOW); // Выключить светодиод
      break;
    case 1:
      digitalWrite(13, HIGH); // Включить светодиод
      break;
    case 2:
      digitalWrite(13, HIGH); // Мигание светодиода
      delay(500);
      digitalWrite(13, LOW);
      delay(500);
      break;
  }
}

Объяснение кода:

  1. int mode = 0;: Переменная для хранения текущего режима.
  2. int buf_mode = 0;: Буферная переменная.
  3. if (digitalRead(2) == LOW): Проверяем, нажата ли кнопка.
  4. mode = (mode + 1) % 3;: Переключаем режим (0, 1, 2).
  5. switch (mode): Выполняем действия в зависимости от текущего режима.

Готовый проект по ссылке: переключение режимов.

Вопросы для закрепления:

  1. Как подключить кнопку к Arduino?
  2. Как работает подтягивающий резистор?
  3. В чем разница между if-else и switch-case?
  4. Как избежать дребезга кнопки?

Домашнее задание:

  1. Создайте проект, где светодиод мигает с разной частотой в зависимости от количества нажатий кнопки.
  2. Добавьте второй светодиод и заставьте его включаться только при длительном нажатии кнопки.

Советы по работе в Wokwi:

  1. Используйте встроенные компоненты в Wokwi.
  2. Экспериментируйте с разными режимами работы светодиода.
  3. Не бойтесь ошибаться — симулятор позволяет легко исправлять ошибки и пробовать новые идеи.

Итог:

Теперь вы знаете, как работать с кнопками в Arduino! Вы научились подключать кнопки, читать их состояние и использовать конструкции if-else и switch-case для обработки нажатий.