State Change Detection (Edge Detection): считаем нажатия кнопки
Узнайте, как отслеживать момент нажатия кнопки (edge detection), считать нажатия и управлять светодиодом на Arduino.
Когда вы научились считывать состояние pushbutton, следующий шаг — реагировать не просто на факт нажатия, а на момент изменения состояния: кнопка была отпущена, и вот она нажата. Именно это событие называют state change detection или edge detection («обнаружение фронта сигнала»).
В этом уроке мы научимся:
- фиксировать переход кнопки из состояния OFF в ON;
- выводить информацию в Serial Monitor;
- считать нажатия и каждые четыре нажатия включать или выключать светодиод.
Почему просто digitalRead недостаточно
Если вы читаете состояние кнопки в каждом цикле loop() и реагируете на HIGH, то пока кнопка зажата, код будет срабатывать снова и снова — десятки или сотни раз в секунду. Для счётчика нажатий это катастрофа: одно физическое нажатие даст огромное число. Решение — сравнивать текущее состояние с предыдущим и реагировать только на момент смены.
Необходимые компоненты
- Arduino Board
- тактовая кнопка (momentary pushbutton)
- резистор 10 кОм
- соединительные провода
- макетная плата (breadboard)
Схема подключения

Схема подключения: кнопка и резистор на макетной плате, соединённые с Arduino UNO
Подключите три провода к плате:
- Один провод идёт от одной ноги кнопки через подтягивающий резистор вниз (pull-down, 10 кОм) к земле
GND. - Второй провод — от той же ноги кнопки к питанию
5V. - Третий провод — от второй ноги кнопки к цифровому пину
2(вход для чтения состояния).
Как это работает электрически:
- Кнопка отпущена → пин через резистор соединён с
GND→ читаем LOW. - Кнопка нажата → пин соединяется с
5Vнапрямую → читаем HIGH. Резистор ограничивает ток, не давая возникнуть короткому замыканию.
Важно: если оставить пин вообще без подключения («висящий» вход, floating), он будет хаотично возвращать то HIGH, то LOW — из-за наводок и статики. Именно поэтому подтягивающий резистор обязателен.
Принципиальная схема

Принципиальная схема: Arduino UNO с кнопкой и подтягивающим резистором 10 кОм
Код
Скетч непрерывно читает состояние кнопки и сравнивает его с состоянием на предыдущей итерации loop(). Если состояние изменилось и новое состояние равно HIGH — значит, произошло нажатие. Счётчик увеличивается на единицу. Когда счётчик кратен четырём, светодиод на пине 13 переключается.
Как работает алгоритм edge detection
Логика сводится к трём шагам, которые выполняются в каждом цикле loop():
- Прочитать текущее состояние кнопки.
- Сравнить с предыдущим состоянием.
- Если
текущее != предыдущееитекущее == HIGH→ зафиксировать нажатие. - Сохранить текущее состояние как «предыдущее» для следующей итерации.
Именно шаг 2 отличает edge detection от простого опроса: вы реагируете на фронт сигнала, а не на его уровень.
Типичные ошибки
- Забытый резистор. Без pull-down резистора пин «висит в воздухе» и даёт случайные значения. Используйте внешний резистор или встроенный pull-up через
pinMode(pin, INPUT_PULLUP)(но тогда логика инвертируется: нажатая кнопка даётLOW). - Дребезг контактов (bounce). Механические кнопки при нажатии могут несколько раз быстро замкнуть и разомкнуть контакт. Если счётчик прыгает на 2–3 вместо 1, добавьте
delay(50)после обнаружения фронта или используйте библиотеку Bounce2. - Сравнение в неправильном порядке. Убедитесь, что сохраняете
lastButtonStateв конце цикла, а не в начале — иначе вы потеряете информацию о предыдущем состоянии.
Как проверить результат
- Загрузите скетч и откройте Serial Monitor (скорость 9600 бод).
- Нажимайте кнопку — в мониторе должны появляться сообщения о каждом нажатии и текущее значение счётчика.
- После 4-го нажатия светодиод на пине
13должен включиться, после 8-го — выключиться, и так далее. - Если счётчик растёт слишком быстро при одном нажатии — вероятен дребезг контактов.
Где пригодится
Edge detection — фундаментальный приём, который используется везде: переключение режимов устройства по кнопке, подсчёт оборотов энкодера, регистрация импульсов датчиков. Понимание разницы между «кнопка нажата» и «кнопка только что нажалась» сэкономит вам много времени при отладке реальных проектов.
Дополнительные материалы
Больше базовых примеров вы найдёте в разделе built-in examples.
Подробное описание всех функций языка — в справочнике language reference.
Последнее обновление: 28.07.2015, SM