Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Цифровые примеры chevron_right State Change Detection (Edge Detection): считаем нажатия кнопки

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

Подключите три провода к плате:

  1. Один провод идёт от одной ноги кнопки через подтягивающий резистор вниз (pull-down, 10 кОм) к земле GND.
  2. Второй провод — от той же ноги кнопки к питанию 5V.
  3. Третий провод — от второй ноги кнопки к цифровому пину 2 (вход для чтения состояния).

Как это работает электрически:

  • Кнопка отпущена → пин через резистор соединён с GND → читаем LOW.
  • Кнопка нажата → пин соединяется с 5V напрямую → читаем HIGH. Резистор ограничивает ток, не давая возникнуть короткому замыканию.

Важно: если оставить пин вообще без подключения («висящий» вход, floating), он будет хаотично возвращать то HIGH, то LOW — из-за наводок и статики. Именно поэтому подтягивающий резистор обязателен.

Принципиальная схема

Принципиальная схема: Arduino UNO с кнопкой и подтягивающим резистором 10 кОм

Код

Скетч непрерывно читает состояние кнопки и сравнивает его с состоянием на предыдущей итерации loop(). Если состояние изменилось и новое состояние равно HIGH — значит, произошло нажатие. Счётчик увеличивается на единицу. Когда счётчик кратен четырём, светодиод на пине 13 переключается.

language reference

Как работает алгоритм edge detection

Логика сводится к трём шагам, которые выполняются в каждом цикле loop():

  1. Прочитать текущее состояние кнопки.
  2. Сравнить с предыдущим состоянием.
  3. Если текущее != предыдущее и текущее == HIGH → зафиксировать нажатие.
  4. Сохранить текущее состояние как «предыдущее» для следующей итерации.

Именно шаг 2 отличает edge detection от простого опроса: вы реагируете на фронт сигнала, а не на его уровень.

Типичные ошибки

  • Забытый резистор. Без pull-down резистора пин «висит в воздухе» и даёт случайные значения. Используйте внешний резистор или встроенный pull-up через pinMode(pin, INPUT_PULLUP) (но тогда логика инвертируется: нажатая кнопка даёт LOW).
  • Дребезг контактов (bounce). Механические кнопки при нажатии могут несколько раз быстро замкнуть и разомкнуть контакт. Если счётчик прыгает на 2–3 вместо 1, добавьте delay(50) после обнаружения фронта или используйте библиотеку Bounce2.
  • Сравнение в неправильном порядке. Убедитесь, что сохраняете lastButtonState в конце цикла, а не в начале — иначе вы потеряете информацию о предыдущем состоянии.

Как проверить результат

  1. Загрузите скетч и откройте Serial Monitor (скорость 9600 бод).
  2. Нажимайте кнопку — в мониторе должны появляться сообщения о каждом нажатии и текущее значение счётчика.
  3. После 4-го нажатия светодиод на пине 13 должен включиться, после 8-го — выключиться, и так далее.
  4. Если счётчик растёт слишком быстро при одном нажатии — вероятен дребезг контактов.

Где пригодится

Edge detection — фундаментальный приём, который используется везде: переключение режимов устройства по кнопке, подсчёт оборотов энкодера, регистрация импульсов датчиков. Понимание разницы между «кнопка нажата» и «кнопка только что нажалась» сэкономит вам много времени при отладке реальных проектов.

Дополнительные материалы

Больше базовых примеров вы найдёте в разделе built-in examples.

Подробное описание всех функций языка — в справочнике language reference.

Последнее обновление: 28.07.2015, SM