Проект 2: кнопка, счётчик, антидребезг
Второй проект — кнопка и счётчик. Он учит читать вход, бороться с дребезгом и хранить состояние.
Схема: кнопка между пином и землёй, подтяжка внутри (INPUT_PULLUP). Нажал — 0, отпустил — 1. Светодиод и резистор — как в первом проекте.
Код по шагам:
- Читать пин, хранить предыдущее состояние.
- Если состояние изменилось с 1 на 0 и прошло больше 20 мс — это нажатие.
- Увеличить счётчик, вывести в Serial.
- Отдельно — состояние для отпускания (иначе одно нажатие посчитается много раз).
Типичные ошибки:
— Нет антидребезга: счётчик прыгает на 3–5 за нажатие.
— Сравнение с HIGH вместо LOW (забыли, что подтяжка инвертирует).
— Обработка внутри прерывания с delay.
— Счётчик на int, который переполняется и уходит в минус — не критично, но полезно знать.
Что дальше: кнопка, которая переключает режимы (короткое нажатие / длинное), двойной клик, меню на экране.
Проверка: нажми 10 раз и убедись, что счётчик увеличился ровно на 10. Если больше — дребезг не побеждён.
Кнопка — первый настоящий ввод, и она показывает, почему «железо» требует антидребезга, а не просто чтения пина.
Собери счётчик нажатий. Сначала без антидребезга — посчитай, насколько врёт. Потом добавь задержку 20 мс и проверь снова.
Проверь себя
Почему при подтяжке к питанию нажатие даёт 0, а не 1?
Кнопка соединяет пин с землёй. Пока не нажата — резистор держит единицу. Нажали — пин прижат к нулю, и ток идёт через резистор в землю.
-
Wikipedia: Switch debouncer
антидребезг
-
ESP-IDF: GPIO и прерывания
чтение кнопки