ESP32 и дребезг контактов: как победить в Arduino IDE?

.ESP32 и дребезг контактов: как победить  в Arduino IDE?

При работе с микроконтроллерами, такими как ESP32, и механическими кнопками часто возникает неприятный эффект, известный как "дребезг контактов". Он проявляется в виде множественных ложных срабатываний при одном нажатии на кнопку, что может привести к некорректной работе устройства. Эта новость, основанная на статье с сайта Arduino-tex, расскажет о причинах дребезга и эффективных методах его устранения в среде разработки Arduino IDE.

Что такое дребезг контактов и почему он возникает?

Дребезг – это кратковременное многократное замыкание и размыкание контактов кнопки при её нажатии или отпускании. Вместо мгновенного перехода из состояния LOW в HIGH (или наоборот), происходит серия быстрых "прыжков" сигнала. Это связано с физическими особенностями материалов и конструкции кнопок. В результате, ESP32 может интерпретировать одно нажатие как несколько, что приводит к ошибкам в работе программы.

дребезг кнопки посмотрим рисунок,

Как подключить кнопку к ESP32?

Для работы с кнопкой используется простая схема: один контакт подключается к цифровому выводу ESP32 (например, GPIO21), а другой – к общему проводу (GND). Для надежной работы необходимо использовать подтягивающий резистор (pull-up), который может быть как внешним, так и внутренним (активируется программно).

Программные методы борьбы с дребезгом:

В статье на Arduino-tex.ru подробно описаны несколько программных способов подавления дребезга:

  1. Простейший метод (без подавления): Этот метод демонстрирует проблему дребезга. При каждом изменении состояния кнопки в монитор порта выводится сообщение. Из-за дребезга при одном нажатии появляется несколько сообщений.
  2. Метод с использованием таймера: При обнаружении изменения состояния кнопки запускается таймер. Если в течение заданного времени (обычно 50-100 мс, константа DEBOUNCE_TIME) состояние остается стабильным, считается, что дребезг закончился, и регистрируется новое состояние. Этот метод эффективно отфильтровывает ложные срабатывания.
  3. Использование библиотеки EZButton: Библиотека EZButton значительно упрощает работу с кнопками, предоставляя готовые функции для обработки нажатий и отпусканий с учетом дребезга. Это особенно удобно при использовании нескольких кнопок. В статье приведены примеры кода для работы как с одной, так и с несколькими кнопками, используя эту библиотеку.

Примеры кода и пояснения:

В статье на Arduino-tex представлены подробные примеры кода на C/C++ для каждого из описанных методов. Каждый пример сопровождается комментариями, объясняющими назначение переменных и логику работы программы. Читатели могут скопировать код и протестировать его в своей среде Arduino IDE.

Пример с использованием библиотеки EZButton (для одной кнопки):

/*
*  ESP32 Arduino IDE. Подавление дребезга контактов кнопки.
* https://arduino-tex.ru/news/204/esp32-podavlenie-drebezga-kontaktov-knopki.html
*/
#include <EZButton.h>  // Подключение библиотеки EZButton для упрощения работы с кнопкой
#define DEBOUNCE_TIME 50  // Время подавления дребезга в миллисекундах, увеличьте это время, если дребезг все еще присутствует
#define BTN_1_PIN 21      //пину GPIO21
#define BTN_1 0
void ReadButtons(bool *states, int num) {
  //Read all button states however you want
  states[BTN_1] = !digitalRead(BTN_1_PIN);
}
//Считывайте состояния кнопок с помощью функции 'ReadButtons'
//Порог удержания: 500 мс
//Интервал удержания: 300 мс
//Время ожидания: 50 мс  DEBOUNCE_TIME
EZButton _ezb(1, ReadButtons, 1000, 200, DEBOUNCE_TIME);
void setup() {
  Serial.begin(115200);  // Инициализация последовательного соединения на скорости 115200 бит/с
  pinMode(BTN_1_PIN, INPUT_PULLUP);
  //subscribe to needed events
  _ezb.Subscribe(BTN_1, Btn1Pressed, PRESSED);
  _ezb.Subscribe(BTN_1, Btn1Released, RELEASED);
}
void loop() {
  _ezb.Loop(); // Необходимо вызывать функцию loop() для обработки состояний кнопки
}
void Btn1Pressed() { // Проверка, была ли кнопка нажата (переход из отпущенного состояния в нажатое)
  Serial.println("Кнопка нажата"); // Вывод сообщения в последовательный порт
}
void Btn1Released() { // Проверка, была ли кнопка отпущена (переход из нажатого состояния в отпущенное)
  Serial.println("Кнопка отпущена"); // Вывод сообщения в последовательный порт
}

(Полный код и примеры для нескольких кнопок доступны в оригинальной статье).

Дополнительные советы:

  • Значение DEBOUNCE_TIME может потребовать настройки в зависимости от типа используемой кнопки.
  • Описанные методы применимы и к другим механическим переключателям (тумблерам, герконам и т.д.).
  • Существуют и аппаратные методы (RC цепочки), но в статье Arduino-tex.ru не рассматриваются.

Использование библиотеки EZButton (несколько кнопок).

Заключение:

Дребезг контактов – распространенная проблема, но ее можно эффективно решить с помощью программных методов. Статья на предоставляет подробное руководство по подавлению дребезга в среде Arduino IDE при работе с ESP32. Использование библиотеки EZButton делает этот процесс еще проще и удобнее.


Понравилась новость ESP32 и дребезг контактов: как победить в Arduino IDE? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступать в группу Вконтакте.

Понравилась статья? Поделитесь ею с друзьями:

Вернуться в раздел: Новости Дата публикации 13 марта , 2025

Комментарии

Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.


Cлучайные товары

Посмотреть товар в Магазине »

Мы в соц сетях

Подпишись на канал Telegram

Portal-PK (Портал ПК) © 2015 - 2025
Разработка проектов
AT Block
DWIN Box