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 в отпущенном состоянии.
Как это работает
Алгоритм антидребезга строится на простой идее:
- Фиксируем момент, когда состояние кнопки изменилось.
- Ждём небольшой интервал (обычно 50 мс) — за это время дребезг гарантированно затухает.
- Если по истечении интервала состояние кнопки совпадает с тем, что было зафиксировано, — считаем нажатие настоящим.
Функция millis() возвращает количество миллисекунд с момента старта программы. Разница между текущим значением и временем последнего изменения сигнала и есть наш «таймер ожидания».
Типичные ошибки
- Слишком маленький интервал дребезга. Если задать 5–10 мс, некоторые кнопки всё равно будут давать ложные срабатывания. Начните с 50 мс — это надёжный стандарт.
- Использование
delay()вместоmillis().delay()полностью останавливает выполнение скетча — другие задачи в это время не выполняются.millis()позволяет проверять несколько кнопок и параллельно делать другие вещи. - Неправильный подтягивающий резистор. Без резистора пин «висит в воздухе» и считывает случайные значения. Резистор 10 кОм обеспечивает чёткий уровень LOW в отпущенном состоянии.
- Кнопка подключена не к тому пину. Проверьте, что в коде и на схеме совпадает номер пина.
Как проверить результат
Загрузите скетч и нажимайте кнопку — встроенный светодиод на пине 13 должен переключаться ровно один раз за каждое нажатие, без случайных двойных срабатываний. Если светодиод всё равно мигает хаотично — увеличьте значение задержки дебаунса в коде.
Где пригодится
Антидребезг нужен везде, где пользователь управляет чем-то через кнопку: счётчики нажатий, переключение режимов, навигация по меню, управление реле. Без него надёжная работа устройства практически невозможна.
---
Дополнительные материалы
Больше базовых уроков можно найти в разделе built-in examples.
Подробное описание всех функций языка Arduino доступно в language reference.
Последняя редакция: 2015/07/29, SM