Сегодня про так называемую резистивную клавиатуру или как подключить много кнопок на один аналоговый вход. Для этого был собран вот такой модуль, на котором 5 кнопок и несколько SMD резисторов, а так же 3 штырька для питания и выхода. В общем как это все устроено.
Я надеюсь все знают как работает делитель напряжения. Есть 2 резистора подключенных последовательно в цепь питания и от средней точки этих резисторов снимается напряжение, величина которого зависит от падения напряжения на этих самых резисторах. А если совсем просто, то если на входе й нас 5 вольт и 2 резистора по 1кОм, то со средней точки мы будем снимать 2,5 вольт.
Теперь к кнопкам, тут тот же самый делитель напряжения только второй резистор подтягивается соответствующей кнопкой. Номиналы у резисторов разные и соответственно напряжение на выходе будет различаться, и зависеть от нажатой кнопки. Конечно же такую клавиатуру не получится использовать для управления радиоуправляемыми моделями, так как в ней может быть нажата только одна кнопка, при нажатии двух сразу сработает совсем другой номер кнопки.
Есть еще и другой вариант подключения. В этом случае кнопкой подтягивается несколько последовательно соединенных резисторов. Если не одна кнопка не нажата, то 5 вольт через резистор подаются на аналоговый вход, а при нажатии на кнопку подкидываем резистор и втягиваем часть напряжения на массу.
Это даже можно продемонстрировать. Ниже пример, который отправляет значение в serial которое считывает функцией analogread на выходе А0 к которому подключена клавиатура. Когда ничего не нажато в мониторе порта будет 1023, если надавить на кнопку это значение будет отличаться и зависеть от нажатой кнопки.
Осталось только различать эти значения в коде без условия if здесь не обойтись, а лучше вообще это вынести в отдельную функцию. К примеру эта функция будет key() и возвращает она байт
byte key(){
int val = analogRead(0); // считываем значение с аналогового входа в переменную val
if (val < 50) return 1; // сверяем переменную, если val меньше 50 возвращаем 1 (первая кнопка)
else if (val < 150) return 2; // если val меньше 150 вторая кнопка и т.д.
else if (val < 350) return 5;
else if (val < 500) return 4;
else if (val < 800) return 3;
else return 0; // если ничего не подошло возвращаем 0
}
Дальше в цикле отправляем в serial, то что возвращает функция key
void loop() {
int sensorValue = analogRead(A0); // считываем значения с А0. Пригодится для отладки
Serial.print(key()); // выводим номер кнопки в serial
Serial.print(" ");
Serial.println(sensorValue); // выводим значения с А0. Пригодится для отладки
delay(1); // задержка между считываниями для стабильности
}
byte key(){
int val = analogRead(0);
if (val < 50) return 1;
else if (val < 150) return 2;
else if (val < 350) return 5;
else if (val < 500) return 4;
else if (val < 800) return 3;
else return 0;
}
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// print out the value you read:
Serial.print(key());
Serial.print(" ");
Serial.println(sensorValue);
delay(1); // delay in between reads for stability
}