Включение и выключение светодиода кнопкой (вкл/выкл)

Видео
Схема

Исходный код
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Включение и выключение светодиода кнопкой (вкл/выкл)
4// ─────────────────────────────────────────
5// Каждое нажатие кнопки один раз переключает светодиод (вкл/выкл). Код
6// ловит только момент нажатия (LOW -> HIGH); если держать кнопку,
7// светодиод не мигает. Пауза 50 мс отсекает дребезг кнопки.
8//
9// Пины:
10// D13 -> Кнопка, другая ножка к 5V
11// D13 -> Резистор 10k к GND (стягивающий, pull-down)
12// D7 -> Светодиод (с резистором 330 ohm)
13
14int ledState = 0; // Состояние светодиода: 0 = выкл, 1 = вкл
15int lastButton = 0; // Предыдущее чтение кнопки
16
17void setup() {
18 pinMode(13, INPUT); // Вход кнопки (внешний pull-down)
19 pinMode(7, OUTPUT); // Выход светодиода
20}
21
22void loop() {
23 int button = digitalRead(13); // Прочитать кнопку
24 if (button != lastButton) { // Состояние кнопки изменилось
25 if (button == 1) { // Только в момент нажатия (LOW -> HIGH)
26 ledState = !ledState; // Инвертировать состояние
27 digitalWrite(7, ledState);
28 }
29 delay(50); // Короткая пауза против дребезга
30 lastButton = button; // Запомнить это чтение
31 }
32}
33
Частые вопросы
Что такое антидребезг и зачем он нужен?
При нажатии механическая кнопка за несколько миллисекунд несколько раз размыкается и замыкается (дребезг). Arduino может принять это за несколько нажатий, и светодиод оказывается в случайном состоянии. Антидребезг игнорирует этот дребезг, выжидая короткое время (например, 50 ms) после смены состояния.
Иногда светодиод не меняется или меняется дважды. Почему?
Обычно антидребезга нет или он слишком короткий. Кроме того, нужно ловить только момент «нажатия» (прежнее состояние LOW, новое — HIGH); если состояние меняется на каждом цикле, пока кнопка зажата, светодиод мерцает и оказывается в случайном состоянии.
Зачем нужна переменная состояния?
Она хранит, горит светодиод или нет. При каждом правильном нажатии переменная переворачивается (ledStatus = !ledStatus), и светодиод устанавливается по ней.
Можно ли управлять разными светодиодами несколькими кнопками?
Да, достаточно для каждой кнопки хранить отдельный пин, отдельное прежнее состояние и отдельную переменную состояния светодиода. Если кнопок много, код с массивами и антидребезгом на millis() будет аккуратнее.
