Arduino & IoT Academy · Урок

Устранение дребезга с помощью millis()

Игнорируйте помехи в течение короткого окна стабильности.

Урок 2 из 413 шагов

«Устранение дребезга с помощью 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 — локальная установка не требуется.

Все уроки этого курса

  1. Почему кнопки «дребезжат»
  2. Устранение дребезга с помощью millis()
  3. Сохранение значения в EEPROM
  4. Сохранение счётчика после сброса
← Назад к Arduino & IoT Academy