Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Цифровые примеры chevron_right Debounce на кнопке: устранение дребезга контактов

Debounce на кнопке: устранение дребезга контактов

Узнайте, как устранить дребезг кнопки с помощью функции millis() и не дать ложным срабатываниям нарушить логику программы.

Механические кнопки — коварная вещь. При нажатии контакты не замыкаются мгновенно и «чисто»: из-за физических свойств металла происходит серия быстрых замыканий и размыканий за доли секунды. Arduino успевает считать это как несколько отдельных нажатий — и программа ведёт себя непредсказуемо. Этот эффект называется дребезгом контактов (bounce).

Данный урок показывает, как реализовать антидребезг (debounce) программными средствами: идея в том, чтобы дважды считать состояние кнопки с небольшим интервалом и убедиться, что сигнал стабилен. Для отсчёта времени используется функция millis() — она не блокирует выполнение программы, в отличие от delay().

Необходимые компоненты

  • Arduino Board
  • Кнопка-тактовая (momentary pushbutton)
  • Резистор 10 кОм
  • Провода для макетной платы
  • Макетная плата (breadboard)

Схема подключения

Кнопка подключается к цифровому пину 2 и через резистор 10 кОм к GND (подтяжка к земле). Второй вывод кнопки — к 5V. Светодиод на пине 13 будет менять состояние при каждом подтверждённом нажатии.

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

На схеме: КНОПКА (SWITCH) соединяет пин 2 с 5V, РЕЗИСТОР 10 кОм (10kΩ RESISTOR) подтягивает тот же пин к GND.

Код

Приведённый скетч основан на версии алгоритма Limor Fried, но с инвертированной логикой. В оригинале кнопка возвращает LOW при замыкании и HIGH при разомкнутом состоянии. Здесь же кнопка возвращает HIGH при нажатии и LOW в отпущенном состоянии.

Как это работает

Алгоритм антидребезга строится на простой идее:

  1. Фиксируем момент, когда состояние кнопки изменилось.
  2. Ждём небольшой интервал (обычно 50 мс) — за это время дребезг гарантированно затухает.
  3. Если по истечении интервала состояние кнопки совпадает с тем, что было зафиксировано, — считаем нажатие настоящим.

Функция millis() возвращает количество миллисекунд с момента старта программы. Разница между текущим значением и временем последнего изменения сигнала и есть наш «таймер ожидания».

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

  • Слишком маленький интервал дребезга. Если задать 5–10 мс, некоторые кнопки всё равно будут давать ложные срабатывания. Начните с 50 мс — это надёжный стандарт.
  • Использование delay() вместо millis(). delay() полностью останавливает выполнение скетча — другие задачи в это время не выполняются. millis() позволяет проверять несколько кнопок и параллельно делать другие вещи.
  • Неправильный подтягивающий резистор. Без резистора пин «висит в воздухе» и считывает случайные значения. Резистор 10 кОм обеспечивает чёткий уровень LOW в отпущенном состоянии.
  • Кнопка подключена не к тому пину. Проверьте, что в коде и на схеме совпадает номер пина.

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

Загрузите скетч и нажимайте кнопку — встроенный светодиод на пине 13 должен переключаться ровно один раз за каждое нажатие, без случайных двойных срабатываний. Если светодиод всё равно мигает хаотично — увеличьте значение задержки дебаунса в коде.

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

Антидребезг нужен везде, где пользователь управляет чем-то через кнопку: счётчики нажатий, переключение режимов, навигация по меню, управление реле. Без него надёжная работа устройства практически невозможна.

---

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

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

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

Последняя редакция: 2015/07/29, SM