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

Arduino Подключение нескольких кнопок на аналоговый вход и антидребезг

Сегодня не большая заметка как подключить несколько кнопок к аналоговому входу Arduino и организовать защиту от дребезга контактов и электрических помех.

Arduino подключение кнопок к аналоговому входу
Arduino подключение кнопок к аналоговому входу

Данная схема удобна при подключении 5 кнопок. Резистор большого номинала 100 ком служит для подтяжки аналогового выхода к земле. Когда не нажата ни одна из кнопок на входе A0 у нас логический 0. 5 резисторов гораздо меньшего номинала чем подтягивающий резистор значением 1 ком образуют делитель напряжения который разбивает измеряемое напряжение на 5 значений:
- нажата кнопка 1 A0 ~ 1V
- нажата кнопка 2 A0 ~ 2V
- нажата кнопка 3 A0 ~ 3V
- нажата кнопка 4 A0 ~ 4V
- нажата кнопка 5 A0 ~ 5V
Читая значение АЦП с аналогового входа с помощью функции analogRead(0) мы можем определить какая из кнопок нажата.
Точное значение нам знать не обязательно - достаточно знать что напряжение болтается в определенном диапазоне для каждой кнопки. Можно конечно написать несколько условий для каждой кнопки - но по скольку данная схема разбивает напряжение 5V на равные отрезки достаточно будет разделить получаемое значение от АЦП на число 171 и в ответе мы сразу получим номер нажатой кнопки (число от 1 до 5).
uint8_t KeyValue = (analogRead(A0) / 171);
Соответственно если функция вернет 0 - ни одна из кнопок не нажата. Поскольку кнопки у нас механические то неизбежен дребезг контактов и чтобы АЦП не считал значение в момент дребезга и не выдал ложное значение будем считать что кнопка нажата только после получения 10 одинаковых значений подряд.
Практика:

Подключение кнопок к аналоговому входу Arduino
Подключение кнопок к аналоговому входу Arduino

Кнопки подключены по приведенной выше схеме. На текстовом экране будет отображаться количество нажатий на любую из кнопок. (в архиве к этой статье будет приложен код и без дисплея - отображение значений в мониторе порта Arduino) - можете скачать и протестировать подключив только кнопки.

Секция void setup()
Секция void setup()

Определяем 5 переменных для подсчета нажатий на кнопку, и переменную ABOld для того, чтобы программа не считала все время пока мы удерживаем кнопку. (нас интересует только одно нажатие-отпускание)

Функция устраняющая дребезг
Функция устраняющая дребезг

Функция устраняющая дребезг необходима чтобы прочитать именно значение нажатой кнопки, а не случайный шум который возникает при замыкании размыкании.

void loop()
void loop()

В секции loop() мы проверяем изменение значения на аналоговом пине и обрабатываем нажатие (отпускание) любой из 5 кнопок. Разумеется, что данная схема не может обрабатывать корректно одновременное нажатие сразу нескольких кнопок, но для тех задач где это приемлемо такое решение гораздо проще в аппаратной реализации чем например использование сдвиговых регистров.
Код из примеров и схему подключения можно скачать
ТУТ
Дополнительные подробности смотрите в видео на моем Ютуб канале:

Другие статьи:
Как организовать связь 2-х плат по шине SPI
Как сделать умное радиоуправление
Как сделать подводную лодку на радиоуправлении