Перед тем как читать эту статью рекомендую ознакомиться с первой частью где подробно разбиралась что такое дребезг контактов и с чем его едят. Предложенный в прошлой статье алгоритм устранения данной проблемы обладает существенным недостатком - каждый раз после нажатия кнопки скетч будет останавливаться на задержку после того как кнопка нажата. Еще одна проблема возникает с масштабированием данного решения для обработки дребезга большого количества кнопок.
Попробуем оптимизировать данное решение. Для этого объявим 2-х байтовую переменную, запишем туда 1 бит и будем сдвигать его вправо - если кнопка не нажата, и влево если кнопка нажата. Как только бит доедет до упора - будем считать что состояние кнопки изменилось (дребезг прекратился)
B0000000000000001 DEC 1 (кнопка точно была отпущена)
B1000000000000000 DEC 32768 (кнопка точно была нажата)
Таким образом основной скетч мы сможем выполнить 16 раз, при этом параллельно опрашивая кнопку в течении 16 миллисекунд. А если в нем будут какие-либо трудоемкие операции (опрос датчиков, обновление данных на дисплее) - оператор delay(1) смело можно выкинуть - его нам заменит время потраченное на выполнение основного кода в цикле loop()
Схема подключения такая же как и предыдущем примере:
Пишем код и проверяем:
Одно нажатие - счетчик увеличился на 1 еденицу
Код легко масштабировать для опроса большего количества кнопок - накладные расходы при этом практически не изменятся. Подключим еще одну кнопку к выводу 5, а сами операторы борьбы с дребезгом вынесем в отдельную функцию чтобы не засорять цикл loop лишним кодом.
При нажатии на синюю кнопку счетчик будет увеличиваться, при нажатии на белую уменьшаться.
Теперь мы следим сразу за 2 кнопками, а задержка так и осталась 1 миллисекунда на цикл.
Все примеры кода скачивайте по этой ссылке. В одной из следующих статей разберем аппаратную реализацию борьбы с дребезгом.
Также вы можете ознакомиться с полным списком статей на моем канале.
Всем удачи!