Корзина пуста
Наиболее популярные клавиатуры для Arduino – 16-ти кнопочные. Они позволяют опрашивать16 кнопок всего лишь 8-ю пинами. Используются обычно в проектах с вводом чисел: калькуляторах, кодовых замках. Наиболее распространены два варианта(в данной статье рассказывается о левом варианте, ссылка на правый http://umnaya-elektronika.ru/market/5/modul_klavia... ):
Данная клавиатура(Рис 1) представляет собой матрицу кнопок, то есть кнопки стоящие на пересечении проводов (в этом случае – дорожек, их можно видеть на плате). Схема представлена ниже. Она построена на тактовых кнопках и включает в себя все их достоинства и недостатки(дребезг, характерные щелчки).
Рис.1
Рис.2
Алгоритм работы с такой матрицей(Рис1.) следующий:
- Назначаем пины 1-4 на выход, а 5-8 на вход, создаем двухмерный массив типа char и вносим в него символы или числа. Соответсвующие нашим кнопкам.
- Подаем на первый пин логический 0, записываем его в переменную, на 2,3,4 – логическую 1
- Считываем сигнал с 5-го пина, если 0, то записываем его в переменную, если 1, то перебираем 6,7и 8 пины с тем же условием
Так мы выясним, нажата ли какая-нибудь кнопка в 1-ом столбце. 0 на 5-ом пине соответствует нажатая кнопка 1-го столбца 1-ой строки, 0 на 6-ом – нажатая кнопка 1-го столбца 2-ой строки и т.д.
- Повторяем операции 2) и 3) для 2,3 и 4 пинов
- В результате получим координаты кнопки: 1-я переменная хранит номер столбца, 2-я переменная хранит номер строки. Записываем эти переменные в массив как аргументы и получаем символ или число соответствующее нажатой кнопке.
ПРИМЕР ПРОГРАММЫ:
int PinOut[4] {5, 4, 3, 2}; // пины выходы
int PinIn[4] {9, 8, 7, 6}; // пины входа
int val = 0;
const char value[4][4]
{ {'1', '4', '7', '*'},
{'2', '5', '8', '0' },
{'3', '6', '9', '#'},
{'A', 'B', 'C', 'D'}
};
// двойной массив, обозначающий кнопку
int b = 0; // переменная, куда кладется число из массива(номер кнопки)
void setup()
{
pinMode (2, OUTPUT); // инициализируем порты на выход (подают нули на столбцы)
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, INPUT); //инициализируем порты на вход с подтяжкой к плюсу(принимают нули на строках)
digitalWrite(6, HIGH);
pinMode (7, INPUT);
digitalWrite(7, HIGH);
pinMode (8, INPUT);
digitalWrite(8, HIGH);
pinMode (9, INPUT);
digitalWrite(9, HIGH);
Serial.begin(9600); // открываем Serial порт
}
void matrix () // создаем функцию для чтения кнопок
{
for (int i = 1; i <= 4; i++) // цикл, передающий 0 по всем столбцам
{
digitalWrite(PinOut[i - 1], LOW); // если i меньше 4 , то отправляем 0 на ножку
for (int j = 1; j <= 4; j++) // цикл, принимающих 0 по строкам
{
if (digitalRead(PinIn[j - 1]) == LOW) // если один из указанных портов входа равен 0, то..
{
Serial.println( value[i - 1][j - 1]); // то b равно значению из двойного массива
delay(175);
}
}
digitalWrite(PinOut[i - 1], HIGH); // подаём обратно высокий уровень
}
}
void loop()
{
matrix(); // используем функцию опроса матричной клавиатуры
}
Можно использовать и более простой вариант, если подключить библиотеку Keypad. Ее нужно будет установить из интернета через менеджер библиотек, если кто не знает, то вот объяснение: http://robotosha.ru/arduino/install-libraries-ardu... . В таком случае нам не придется писать код для перебора кнопок, библиотечные функции сделают все сами и код будет занимать меньше места.
ПРИМЕР ПРОГРАММЫ:
#include <Keypad.h>
const byte ROWS = 4; // число строк
const byte COLS = 3; // число столбцов
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'#','0','*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //пины строк
byte colPins[COLS] = {8, 7, 6}; // пины столбцов
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // константная строчка инициализации
void setup(){
Serial.begin(9600);
}
void loop(){
char key = keypad.getKey(); // получение символа кнопки
if (key != NO_KEY){ // если какая-то из кнопок нажата(есть номер)
Serial.println(key); // выводим соответствующий ей символ в ком-порт
}
}
Пользоваться матрицей удобно, но нужно помнить, что возвращаемое значение функций опроса(символ, соответствующей нажатой кнопке) будет выдано в типе данных char, следовательно, мы получим символ, а не число. Если мы выведем его в ком-порт, то увидим символ поставленный нами в массиве между «‘ ‘», но если проведем с ним алгебраическое действие(к примеру, умножим на 10), то получим результат это действия проведенного с числом этого символа по таблице кодировок. Чтобы этого избежать нужно будет воспользоваться приведением типов, а именно написать int(key) в алгебраическом действии и в массиве записывать числа без «’ ‘». Проще говоря, результаты будут таковы:
Для: Serial.println(key);
Serial.println(key*10); // символ «1» кодируется, как 48
Получим: 1 480
А для: Serial.println(int(key));
Serial.println(int(key)*10); // приводим число 1 в символьном эквиваленте к целочисленному типу
Получим: 1 10
У данной библиотеки есть один подводный камень. В ней по умолчанию стоит ограничение в 10 строк и 10 столбцов. Это ограничит вашу матрицу размером 10х10 кнопок. Но если вам все же нужно подключить матрицу большего размера, то «особо отчаянные» могут в коде библиотеки найти это ограничивающее значение(оно устанавливается как #define) и изменить его на любое им угодное.
Ссылки:
http://mypractic.ru/urok-18-podklyuchenie-matricy-...
https://elekt.kz/arduino/modules-and-sensors/the-c...
https://lesson.iarduino.ru/page/urok-13-podklyuche...
Габариты (Д х Ш х В):
43мм х 39мм х 11мм
Вес:
11г.
Сообщения не найдены