Цели урока:
- Познакомиться с подключением кнопок и чтением их состояния.
- Научиться использовать конструкции
if-elseиswitch-caseдля обработки нажатий кнопок. - Закрепить знания на практике, создав проекты с использованием кнопок.
Теоретическая часть
Что такое кнопка и как она работает?
Кнопка — это простейшее устройство ввода, которое замыкает или размыкает электрическую цепь при нажатии. В Arduino кнопка используется для взаимодействия с пользователем, например, для включения светодиода или запуска определенной функции.
Как это работает:
- Когда кнопка не нажата, цепь разомкнута, и на входном пине Arduino будет низкий уровень (
LOW). - Когда кнопка нажата, цепь замыкается, и на входном пине Arduino будет высокий уровень (
HIGH).
Подтягивающий резистор:
Чтобы избежать "плавающего" состояния пина, когда кнопка не нажата, используется подтягивающий резистор. В Arduino
можно использовать встроенный подтягивающий резистор, установив режим пина как INPUT_PULLUP.
Подключение кнопки
Схема подключения (рисунок ниже):
- Подключите один контакт кнопки к цифровому пину на Arduino (например, 2).
- Подключите другой контакт кнопки к GND.
- Используйте встроенный подтягивающий резистор, установив режим пина как
INPUT_PULLUP. - Подключите светодиод к 13 пину.
Пример подключения:
- Пин 2 → Кнопка → GND.
Чтение состояния кнопки
Для чтения состояния кнопки используется функция 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); // Выключить светодиод
}
}
Объяснение кода:
pinMode(2, INPUT_PULLUP);: Настраиваем пин 2 как вход с подтягивающим резистором.pinMode(13, OUTPUT);: Настраиваем пин 13 как выход (светодиод).int buttonState = digitalRead(2);: Читаем состояние кнопки.if (buttonState == LOW): Проверяем, нажата ли кнопка.digitalWrite(13, HIGH);: Включаем светодиод, если кнопка нажата.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 Ом.
- Провода.
- Макетная плата (можно и без нее).
Схема подключения:
- Подключите один контакт кнопки к пину 2.
- Подключите другой контакт кнопки к GND.
- Подключите анод светодиода к пину 13 через резистор 220 Ом.
- Подключите катод светодиода к 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;
}
}
Объяснение кода:
int mode = 0;: Переменная для хранения текущего режима.int buf_mode = 0;: Буферная переменная.if (digitalRead(2) == LOW): Проверяем, нажата ли кнопка.mode = (mode + 1) % 3;: Переключаем режим (0, 1, 2).switch (mode): Выполняем действия в зависимости от текущего режима.
Готовый проект по ссылке: переключение режимов.
Вопросы для закрепления:
- Как подключить кнопку к Arduino?
- Как работает подтягивающий резистор?
- В чем разница между
if-elseиswitch-case? - Как избежать дребезга кнопки?
Домашнее задание:
- Создайте проект, где светодиод мигает с разной частотой в зависимости от количества нажатий кнопки.
- Добавьте второй светодиод и заставьте его включаться только при длительном нажатии кнопки.
Советы по работе в Wokwi:
- Используйте встроенные компоненты в Wokwi.
- Экспериментируйте с разными режимами работы светодиода.
- Не бойтесь ошибаться — симулятор позволяет легко исправлять ошибки и пробовать новые идеи.
Итог:
Теперь вы знаете, как работать с кнопками в Arduino! Вы научились подключать кнопки, читать их состояние и использовать конструкции if-else и switch-case для обработки нажатий.