Сегодня мы познакомимся с матричной клавиатурой. Обычно, для того чтобы
подключить кнопку к Ардуино, мы брали кнопку и просто подключали её на
свободный пин. Но что если кнопок больше чем свободных выводов? Можно
ли подключить большее число кнопок, используя меньшее число выводов?
Оказывается можно, если кнопок больше 5-ти, то можно соединить их в
матрицу и тогда количество кнопок, которое мы можем подключить будет,
зависеть от того, сколько колонок и строк в нашей матрице. При использовании
матричного соединения кнопок, с помощью пяти проводов можно подключить
6 кнопок, при использовании 6 проводов - уже 9 кнопок, при использовании
7 проводов - 12 кнопок. Далее количество кнопок, которое мы можем подключить,
растет в геометрической прогрессии. Например, для подключения 16 кнопок,
необходимо всего 8 проводов, тогда как при обычном подключении в два
раза больше:
int i = 2; // переменная i будет перебирать выходы int j = 6; // переменная j будет перебирать входы void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, INPUT); pinMode(7, INPUT); pinMode(8, INPUT); pinMode(9, INPUT); Serial.begin(9600); //данные о нажатой кнопке будем выводить в монитор порта } void loop() { for (int i=2; i < 6; i++) // цикл for будет выполняться пока i < 5 { digitalWrite(i, 0); // на выходе i устанавливаем низкий уровень for (int j=6; j < 10; j++) // цикл for будет выполняться пока j < 10 { if(digitalRead(j)==0) // перебираем поочередно входы и если обнаруживаем низкий уровень, { // то выполняем условия в фигурных скобках if(i==2 && j==6) Serial.println("D"); // если низкий уровень на D2 и D6, то нажата кнопка D if(i==2 && j==7) Serial.println("C"); // если низкий уровень на D2 и D7, то нажата кнопка C if(i==2 && j==8) Serial.println("B"); // если низкий уровень на D2 и D8, то нажата кнопка B if(i==2 && j==9) Serial.println("A"); // если низкий уровень на D2 и D9, то нажата кнопка A if(i==3 && j==6) Serial.println("#"); // если низкий уровень на D3 и D6, то нажата кнопка # if(i==3 && j==7) Serial.println("9"); // если низкий уровень на D3 и D7, то нажата кнопка 9 if(i==3 && j==8) Serial.println("6"); // если низкий уровень на D3 и D8, то нажата кнопка 6 if(i==3 && j==9) Serial.println("3"); // если низкий уровень на D3 и D9, то нажата кнопка 3 if(i==4 && j==6) Serial.println("0"); // если низкий уровень на D4 и D6, то нажата кнопка 0 if(i==4 && j==7) Serial.println("8"); // если низкий уровень на D4 и D7, то нажата кнопка 8 if(i==4 && j==8) Serial.println("5"); // если низкий уровень на D4 и D8, то нажата кнопка 5 if(i==4 && j==9) Serial.println("2"); // если низкий уровень на D4 и D9, то нажата кнопка 2 if(i==5 && j==6) Serial.println("*"); // если низкий уровень на D5 и D6, то нажата кнопка * if(i==5 && j==7) Serial.println("7"); // если низкий уровень на D5 и D7, то нажата кнопка 7 if(i==5 && j==8) Serial.println("4"); // если низкий уровень на D5 и D8, то нажата кнопка 4 if(i==5 && j==9) Serial.println("1"); // если низкий уровень на D5 и D9, то нажата кнопка 1 delay(1000); } } digitalWrite(i, 1); //возвращаем выход i в высокоуровневое состояние } }
#include < Keypad.h> const byte ROWS = 4; // четыре строки в матричной клавиатуре const byte COLS = 4; // четыре колонки в матричной клавиатуре char hexaKeys[ROWS][COLS] = { // определяем названия кнопок на клавиатуре {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {9, 8, 7, 6}; // подключаем строки к соответвующим пинам контроллера byte colPins[COLS] = {5, 4, 3, 2}; // подключаем колонки к соответвующим пинам контроллера //инициализируем клавиатуру Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); void setup(){ Serial.begin(9600); } void loop(){ char customKey = customKeypad.getKey(); if (customKey){ Serial.println(customKey); } }Разбирать как работает библиотека мы не будем, но за счет баблиотеки программа получилась еще проще, фактически после инициализации программы мы просто постоянно обращаемся к ней и если нажата какая-то кнопка, то выводим название кнопки в монитор порта.