
Arduino сразу узнаёт, какая клавиша нажата на 12-клавишной клавиатуре, похожей на кнопки телефона, и выводит её на экран компьютера. Цифры, а также клавиши звёздочки и решётки расположены сеткой из строк и столбцов, и Arduino проверяет эту сетку, чтобы найти нажатую клавишу. Первый шаг к проектам вроде кодового замка или калькулятора.
Видео
Схема

Исходный код
C++ (Arduino IDE)
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Работа с клавиатурой 3x4
4// ─────────────────────────────────────────
5// Нажатая на клавиатуре 3x4 клавиша читается и выводится в монитор порта
6// (9600 бод). Библиотека Keypad опрашивает строки и столбцы.
7//
8// Пины:
9// D8, D7, D6, D5 -> Строки клавиатуры 1-4
10// D4, D3, D2 -> Столбцы клавиатуры 1-3
11
12#include <Keypad.h>
13
14const byte ROWS = 4; // Количество строк
15const byte COLS = 3; // Количество столбцов
16
17// Раскладка клавиатуры
18char keys[ROWS][COLS] = {
19 {'1', '2', '3'},
20 {'4', '5', '6'},
21 {'7', '8', '9'},
22 {'*', '0', '#'}
23};
24
25byte rowPins[ROWS] = {8, 7, 6, 5}; // Пины строк
26byte colPins[COLS] = {4, 3, 2}; // Пины столбцов
27
28Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
29
30void setup() {
31 Serial.begin(9600);
32 Serial.println("Keypad Initialized...");
33}
34
35void loop() {
36 // Получить нажатую клавишу, NO_KEY, если нажатия нет
37 char pressedKey = keypad.getKey();
38
39 if (pressedKey != NO_KEY) {
40 Serial.print("Pressed Key: ");
41 Serial.println(pressedKey);
42 }
43}
44
Частые вопросы
Чем клавиатура 3x4 отличается от 4x4?
У клавиатуры 3x4 3 столбца + 4 строки (12 клавиш); у 4x4 — 4+4 (16 клавиш). Для компактных проектов хватает 3x4; если нужны дополнительные клавиши вроде букв (A, B, C, D), выбирают 4x4.
Как определить порядок выводов?
Посмотри на маркировку на обороте клавиатуры или в её даташите — обычно 7 выводов идут слева в порядке ROW1, ROW2, ROW3, ROW4, COL1, COL2, COL3. В коде сначала задай пины строк, затем пины столбцов.
Блокирует ли getKey() выполнение?
Нет, `keypad.getKey()` не блокирует; он возвращает нажатый символ, если он есть, а иначе `NO_KEY` (=0). Его можно постоянно вызывать в цикле, не останавливая другие задачи.
