Сегодня не большая заметка как подключить несколько кнопок к аналоговому входу 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) - можете скачать и протестировать подключив только кнопки.
Определяем 5 переменных для подсчета нажатий на кнопку, и переменную ABOld для того, чтобы программа не считала все время пока мы удерживаем кнопку. (нас интересует только одно нажатие-отпускание)
Функция устраняющая дребезг необходима чтобы прочитать именно значение нажатой кнопки, а не случайный шум который возникает при замыкании размыкании.
В секции loop() мы проверяем изменение значения на аналоговом пине и обрабатываем нажатие (отпускание) любой из 5 кнопок. Разумеется, что данная схема не может обрабатывать корректно одновременное нажатие сразу нескольких кнопок, но для тех задач где это приемлемо такое решение гораздо проще в аппаратной реализации чем например использование сдвиговых регистров.
Код из примеров и схему подключения можно скачать ТУТ
Дополнительные подробности смотрите в видео на моем Ютуб канале:
Другие статьи:
Как организовать связь 2-х плат по шине SPI
Как сделать умное радиоуправление
Как сделать подводную лодку на радиоуправлении