Главная » Ардуино » Подключение нескольких кнопок к одному выводу Ардуино

Подключение нескольких кнопок к одному выводу Ардуино

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

Как вы знаете, самый простой и, вероятно, самый надежный способ подключения кнопок — это тот, при котором каждая кнопка подключается к отдельному контакту ввода/вывода. Однако иногда случается, что для реализации всех функций нашего устройства нам необходимо сохранить ценные цифровые выводы.

Мы можем, например, соединить 16 кнопок, используя всего 8 контактов, пересекая строки со столбцами. Еще один интересный вариант, в котором используется только один аналоговый вывод — это создание делителя напряжения.

Принцип работы и схема

Arduino Uno имеет до 6 аналоговых выводов (АЦП), способных измерять напряжение в диапазоне 0-5 В с точностью до 10 бит (что переводится в значения от 0 до 1023).

Зная закон Ома, мы можно создать делителя напряжения, то есть 5В (напряжение питания) можно разделить, например, на 1, 2, 3, 4 и 5 В. Для этого нам будет достаточно обычных резисторов (1,1кОм) соединенных последовательно. Один конец этой цепи подключаем к 5В, а другой к минусу питания.

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

Для того чтобы выбранное напряжение подавалось на аналоговый порт Arduino, достаточно подключить одну ножку кнопки к резистору, а другую — непосредственно к аналоговому выводу Ардуино. Кроме того, необходимо аналоговый вывод подключить к земле, чтобы всегда было определенное состояние даже если ни одна кнопка не нажата.

Кнопочное управление

Цель заключается в том, чтобы прочитать правильное значение на аналоговом порту. В качестве первого скетча — программа, которая в основном цикле выводит в монитор последовательного порта каждые 100 мс значение, считанное с АЦП.

Теперь, зная эти значения, мы можем объявить несколько полезных констант:

#define BTN_PIN A0
#define BTN1 255
#define BTN2 340
#define BTN3 512
#define BTN4 1023

Это значения, рассчитанные аналого-цифровым преобразователем. Следующая функция будет возвращать true или false в зависимости от того, нажата ли кнопка:

bool isAnalogBtnPressed (int analogVal, int btnValue) {
 return abs (btnValue - analogVal) <= 20;
}

Она принимает два параметра: analogVal, то есть значение, считываемое с помощью функции analogRead, и btnValue, то есть значение для нажатой кнопки.

Как видите, мы используем функцию abs (), чтобы проверить, насколько далеко фактическое показание АЦП от того значения, которую должна представлять кнопка. Если это расстояние не больше 20, функция вернет true. Мы установили здесь определенный порог ошибки из-за того, что измерение АЦП не всегда идеально.

Теперь мы можем написать основной цикл программы, в котором в монитор последовательного порта будет выводиться сообщение о нажатии соответствующей кнопки:

void loop () {
 int btnData = analogRead (BTN_PIN);
 if (isAnalogBtnPressed (btnData, BTN1)) {
 Serial.println («Button 1 pressed»);
 } else if (isAnalogBtnPressed (btnData, BTN2)) {
 Serial.println («Button 2 pressed»);
 } else if (isAnalogBtnPressed (btnData, BTN3)) {
 Serial.println («Button 3 pressed»);
 } else if (isAnalogBtnPressed (btnData, BTN4)) {
 Serial.println («Button 4 pressed»);
 }
 delay (100);
}

не забываем про соответствующую настройку в функции setup ():

void setup () {
 pinMode (BTN_PIN, INPUT);
 Serial.begin (9600);
}

Вот и все 🙂 Благодаря этой простой процедуре мы уменьшили количество контактов с 4 до 1, но при этом ничто не мешает добавить туда еще больше кнопок.

При использовании этого метода помните, что мы не сможем нажимать более одной кнопки за раз. Если мы нажмем кнопку одновременно с напряжением 4 В и кнопкой с 2 ​​В, то Arduino распознает кнопку с более высоким напряжением (т. е. выиграет меньше сопротивление).

Оставить комментарий

Ваш email нигде не будет показан. Обязательные для заполнения поля помечены *

*