Устранение дребезга с помощью millis()
Игнорируйте помехи в течение короткого окна стабильности.
«Устранение дребезга с помощью millis()» — бесплатный урок Arduino & IoT Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Arduino & IoT Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Arduino & IoT Academy содержит 4 уроков всего.
Почему бы просто не использовать delay()?
После нажатия можно приостановить работу с помощью delay(), но это заморозит всю плату. Более разумный инструмент для надёжной работы с кнопками — millis().
millis() — это секундомер
millis() возвращает количество миллисекунд с момента запуска платы. Сравнивая два показания, можно измерить прошедшее время без остановки работы.
unsigned long now = millis();План устранения дребезга
Идея проста: когда контакт меняет состояние, запустите таймер. Доверяйте новому состоянию только в том случае, если оно сохраняется неизменным в течение небольшого интервала.
Выберите интервал устранения дребезга
Классический выбор — задержка около 50 миллисекунд. Этого достаточно, чтобы переждать дребезг, но недостаточно, чтобы вы успели её заметить.
const unsigned long DEBOUNCE = 50;Запоминайте последнее изменение
Вам нужна переменная, в которой хранится информация о том, когда контакт в последний раз изменил состояние. При каждом проходе loop() сравнивайте это время с текущим.
unsigned long lastChange = 0;Отслеживайте два состояния
Храните отдельно необработанное показание и подтверждённое стабильное состояние. Необработанное показание содержит шум, а стабильному состоянию доверяет ваша логика.
int lastRaw = HIGH;
int stable = HIGH;Обнаружьте изменение
На каждом проходе loop() считывайте состояние контакта. Если оно отличается от последнего необработанного значения, сигнал только что изменился, поэтому сбросьте таймер.
int raw = digitalRead(BTN);
if (raw != lastRaw)
lastChange = millis();Дождитесь стабилизации
Если после последнего изменения прошло достаточно времени, показание стабилизировалось. Теперь его можно безопасно принять за реальное состояние.
if (millis() - lastChange > DEBOUNCE) {
stable = raw;
}Реагируйте на переход
Чтобы выполнять действие один раз за нажатие, отслеживайте изменение стабильного состояния на LOW. Этот единственный переход и есть чистое нажатие без дребезга.
if (stable == LOW && lastStable == HIGH)
Serial.println("clean press");Обновляйте данные для следующего прохода
В конце loop() сохраните текущие показания в переменные last. Так сравнение будет корректным при каждом следующем проходе.
lastRaw = raw;
lastStable = stable;Побеждает неблокирующий подход
Поскольку millis() не приостанавливает работу платы, датчики и выходы продолжают работать. Устранение дребезга выполняется, пока всё остальное продолжает работать. 🚀
Быстрая проверка
Давайте проверим, как устранение дребезга с помощью millis() определяет, что нажатие настоящее.
Итоги: чистые нажатия
Вы использовали millis(), чтобы игнорировать дребезг, не замораживая плату, и принимать нажатие только после стабилизации. Надёжный профессиональный ввод! ✅
Изучай C++ с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Устранение дребезга с помощью millis()» бесплатный?
Да — полный текст урока «Устранение дребезга с помощью millis()» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Arduino & IoT Academy, подпишись на CoddyKit PRO. Курс Arduino & IoT Academy содержит 4 уроков всего.
Чему я научусь в уроке «Устранение дребезга с помощью millis()»?
Игнорируйте помехи в течение короткого окна стабильности. Ты практикуешь Arduino & IoT Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Arduino & IoT Academy?
Предыдущий опыт не требуется. Arduino & IoT Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Устранение дребезга с помощью millis()»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Arduino & IoT Academy?
Да. Каждый урок Arduino & IoT Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему кнопки «дребезжат»
- Устранение дребезга с помощью millis()
- Сохранение значения в EEPROM
- Сохранение счётчика после сброса