Найти в Дзене
Электроника, ESP32, Arduino

Борьба с дребезгом контактов (программно и без delay) ч2.

Перед тем как читать эту статью рекомендую ознакомиться с первой частью где подробно разбиралась что такое дребезг контактов и с чем его едят. Предложенный в прошлой статье алгоритм устранения данной проблемы обладает существенным недостатком - каждый раз после нажатия кнопки скетч будет останавливаться на задержку после того как кнопка нажата. Еще одна проблема возникает с масштабированием данного решения для обработки дребезга большого количества кнопок.

Простейший алгоритм устранения дребезга
Простейший алгоритм устранения дребезга

Попробуем оптимизировать данное решение. Для этого объявим 2-х байтовую переменную, запишем туда 1 бит и будем сдвигать его вправо - если кнопка не нажата, и влево если кнопка нажата. Как только бит доедет до упора - будем считать что состояние кнопки изменилось (дребезг прекратился)

B0000000000000001 DEC 1 (кнопка точно была отпущена)
B1000000000000000 DEC 32768 (кнопка точно была нажата)

Алгоритм обработки дребезга кнопок без delay()
Алгоритм обработки дребезга кнопок без delay()

Таким образом основной скетч мы сможем выполнить 16 раз, при этом параллельно опрашивая кнопку в течении 16 миллисекунд. А если в нем будут какие-либо трудоемкие операции (опрос датчиков, обновление данных на дисплее) - оператор delay(1) смело можно выкинуть - его нам заменит время потраченное на выполнение основного кода в цикле loop()

Схема подключения такая же как и предыдущем примере:

Кнопка замыкает PIN 4 на землю. Вместо платы ESP32 можно использовать Arduino
Кнопка замыкает PIN 4 на землю. Вместо платы ESP32 можно использовать Arduino

Пишем код и проверяем:

Антидребезг без delay();
Антидребезг без delay();

Одно нажатие - счетчик увеличился на 1 еденицу

-5

Код легко масштабировать для опроса большего количества кнопок - накладные расходы при этом практически не изменятся. Подключим еще одну кнопку к выводу 5, а сами операторы борьбы с дребезгом вынесем в отдельную функцию чтобы не засорять цикл loop лишним кодом.

-6

При нажатии на синюю кнопку счетчик будет увеличиваться, при нажатии на белую уменьшаться.

Функция refreshButtobs ()
Функция refreshButtobs ()
Цикл void loop()
Цикл void loop()

Теперь мы следим сразу за 2 кнопками, а задержка так и осталась 1 миллисекунда на цикл.

Все примеры кода скачивайте по этой ссылке. В одной из следующих статей разберем аппаратную реализацию борьбы с дребезгом.

Также вы можете ознакомиться с полным списком статей на моем канале.
Всем удачи!