Матричная клавиатура 4x4 и Arduino: кодовый замок
Как работает матричная клавиатура? Подключение клавиатур 4x4 и 3x4, сканирование строк и столбцов, библиотека Keypad, чтение нажатий, ввод пароля и кодовый замок с сервоприводом, вывод на LCD, а также ESP32 и Pico.
Матричная клавиатура (keypad) — недорогое устройство ввода, похожее на кнопки телефона: с её помощью в проект можно вводить цифры или буквы. На клавиатурах строят кодовые дверные замки, сейфы, калькуляторы, охранные панели и системы меню. Самые распространённые модели — тонкие плёночные клавиатуры с клейкой основой в раскладках 4x4 (16 кнопок) и 3x4 (12 кнопок).

Как работает клавиатура? Матрица строк и столбцов
Если бы у каждой из 16 кнопок был свой пин, понадобилось бы 16 пинов. Вместо этого кнопки клавиатуры собраны в матрицу: 4 строки и 4 столбца, каждая кнопка стоит на пересечении строки и столбца, а нажатие соединяет эту строку с этим столбцом. Arduino по очереди переводит строки в LOW и читает столбцы; столбец, на котором появился LOW при определённой строке в LOW, показывает, какая кнопка нажата. Такое сканирование идёт сотни раз в секунду, поэтому 16 кнопок читаются всего через 8 пинов.
| Тип | Кнопки | Пины | Типичное применение |
|---|---|---|---|
| Плёночная 4x4 | 16 (0–9, A–D, *, #) | 8 | Пароли, меню, калькуляторы |
| Плёночная 3x4 | 12 (0–9, *, #) | 7 | Ввод чисел, как на телефоне |
| Плёночная 1x4 | 4 | 5 | Простые меню и кнопки выбора |
Распиновка и подключение клавиатуры
Если повернуть клавиатуру кнопками к себе, пины шлейфа слева направо обычно такие: R1, R2, R3, R4, C1, C2, C3, C4; первые четыре — строки, последние четыре — столбцы. Дополнительные резисторы не нужны: для столбцов библиотека использует встроенные подтягивающие резисторы Arduino.
| Пин клавиатуры | Назначение | Arduino Uno |
|---|---|---|
| 1 | R1 (1, 2, 3, A) | D9 |
| 2 | R2 (4, 5, 6, B) | D8 |
| 3 | R3 (7, 8, 9, C) | D7 |
| 4 | R4 (*, 0, #, D) | D6 |
| 5 | C1 (1, 4, 7, *) | D5 |
| 6 | C2 (2, 5, 8, 0) | D4 |
| 7 | C3 (3, 6, 9, #) | D3 |
| 8 | C4 (A, B, C, D) | D2 |
Чтение кнопок с библиотекой Keypad
В «Менеджере библиотек» (Library Manager) найди Keypad и установи библиотеку от Mark Stanley и Alexander Brevig. Код ниже выводит каждую нажатую кнопку в монитор порта:
1#include <Keypad.h>
2
3const byte ROWS = 4, COLS = 4;
4char keys[ROWS][COLS] = {
5 {'1', '2', '3', 'A'},
6 {'4', '5', '6', 'B'},
7 {'7', '8', '9', 'C'},
8 {'*', '0', '#', 'D'}
9};
10byte rowPins[ROWS] = {9, 8, 7, 6}; // R1–R4
11byte colPins[COLS] = {5, 4, 3, 2}; // C1–C4
12Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
13
14void setup() {
15 Serial.begin(9600);
16}
17
18void loop() {
19 char key = keypad.getKey(); // tuş yoksa 0 döner / returns 0 if no key
20 if (key) {
21 Serial.println(key);
22 }
23}getKey() не блокирует программу: если в этот момент ничего не нажато, функция сразу возвращает 0, и в loop() можно заниматься другими делами. Дребезг контактов библиотека обрабатывает сама и сообщает о каждом нажатии только один раз. Если нужно дождаться нажатия, используй waitForKey().
Собираем кодовый замок
Теперь соберём нажатые кнопки в строку и сравним её с сохранённым паролем. Клавиша * стирает ввод, а клавиша # подтверждает его. Если пароль верный, сервопривод открывает замок на 3 секунды. Как подключить сервопривод, читай в статье Что такое сервопривод?
1#include <Keypad.h>
2#include <Servo.h>
3
4const byte ROWS = 4, COLS = 4;
5char keys[ROWS][COLS] = {
6 {'1', '2', '3', 'A'},
7 {'4', '5', '6', 'B'},
8 {'7', '8', '9', 'C'},
9 {'*', '0', '#', 'D'}
10};
11byte rowPins[ROWS] = {9, 8, 7, 6};
12byte colPins[COLS] = {5, 4, 3, 2};
13Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
14
15Servo lock;
16const String PASSWORD = "1234";
17String input = "";
18
19void setup() {
20 Serial.begin(9600);
21 lock.attach(10);
22 lock.write(0); // kilitli / locked
23}
24
25void loop() {
26 char key = keypad.getKey();
27 if (!key) return;
28 if (key == '*') { // temizle / clear
29 input = "";
30 } else if (key == '#') { // onayla / confirm
31 if (input == PASSWORD) {
32 Serial.println("Doğru, açılıyor / correct, opening");
33 lock.write(90);
34 delay(3000);
35 lock.write(0);
36 } else {
37 Serial.println("Yanlış şifre / wrong code");
38 }
39 input = "";
40 } else if (input.length() < 8) {
41 input += key;
42 Serial.print('*'); // tuşu gizle / hide the key
43 }
44}Вместе с LCD
С дисплеем гораздо проще понять, что происходит при вводе пароля. I2C LCD занимает только пины A4 и A5, поэтому не мешает 8 цифровым пинам клавиатуры. При каждом нажатии выводи звёздочку в нижней строке LCD, а после подтверждения показывай в верхней строке «Open» (открыто) или «Wrong» (неверно). Подключение дисплея и команды описаны в статье I2C LCD-дисплей с Arduino.
Меньше пинов: I2C- и аналоговые клавиатуры
Одна только клавиатура занимает 8 из 20 пинов Uno. Когда пинов не хватает, есть два решения: I2C-адаптер для клавиатуры на основе PCF8574 сокращает подключение всего до двух проводов и делит шину с LCD. В аналоговых клавиатурах каждая кнопка даёт своё сопротивление, и вся клавиатура читается одним аналоговым пином; проводов меньше, но два одновременных нажатия такая клавиатура распознать не может.
Клавиатура с ESP32 и Raspberry Pi Pico
Библиотека Keypad работает и на ESP32. Пины строк используются как выходы, а пины столбцов — как входы с подтяжкой, поэтому избегай GPIO 34–39: они не умеют работать на выход и не имеют подтягивающих резисторов. Например, для строк выбери 13, 12, 14 и 27, а для столбцов — 26, 25, 33 и 32. На Pico с MicroPython сканирование можно написать самостоятельно в несколько строк:
1from machine import Pin
2import time
3
4KEYS = ["123A", "456B", "789C", "*0#D"]
5rows = [Pin(n, Pin.OUT, value=1) for n in (2, 3, 4, 5)] # R1–R4
6cols = [Pin(n, Pin.IN, Pin.PULL_UP) for n in (6, 7, 8, 9)] # C1–C4
7
8def scan():
9 for r, row in enumerate(rows):
10 row.value(0) # bu satırı etkinleştir / activate this row
11 for c, col in enumerate(cols):
12 if col.value() == 0: # tuş basılı / key pressed
13 row.value(1)
14 return KEYS[r][c]
15 row.value(1)
16 return None
17
18last = None
19while True:
20 key = scan()
21 if key and key != last: # her basışı bir kez yaz / print each press once
22 print(key)
23 last = key
24 time.sleep_ms(50)Идеи проектов с клавиатурой
- Сейф с паролем: шкатулка, которая открывается после ввода кода, с сервоприводом, LCD и зуммером.
- Калькулятор: клавиши A–D отвечают за четыре арифметических действия, результат выводится на LCD.
- Выбор цвета: меняй цвет RGB-светодиода в зависимости от введённого числа.
- Охранная панель: ставь на охрану и снимай с неё сигнализацию с PIR-датчиком по коду.
- Игра «Угадай число»: найди число, загаданное Arduino, по подсказкам «больше» и «меньше».
- Клавиатура горячих клавиш: преврати каждую кнопку в сочетание клавиш для компьютера с помощью Arduino Leonardo.
Частые ошибки и как их исправить
- Читается не та кнопка, что нажата: перепутан порядок строк и столбцов; разверни порядок в массивах rowPins и colPins.
- Не читается ни одна кнопка: шлейф вставлен со сдвигом на один пин, или пины строк и столбцов не совпадают с указанными в коде.
- Некоторые кнопки никогда не срабатывают: плохой контакт в проводе строки или столбца; верный признак — не работают все кнопки одной строки или одного столбца.
- Используются пины 0 и 1: они нужны для последовательной связи по USB; загрузка кода при подключённой клавиатуре может не пройти.
- На ESP32 часть столбцов всегда выглядит нажатой: заняты GPIO 34–39 без подтяжки; перенеси подключение на другие пины.
- Ожидание повторов при долгом нажатии: getKey() сообщает о каждом нажатии один раз; чтобы заметить удержание кнопки, используй состояние HOLD из библиотеки.
По сути, клавиатура — это просто кнопки, собранные в матрицу; логика работы кнопок описана в статье Как подключить кнопку к Arduino. В приложении BlueGrays есть основы работы с клавиатурами 3x4 и 4x4, кодовый замок с LCD, умный электронный сейф, калькулятор на I2C и управление RGB-светодиодом с клавиатуры — со схемами подключения и кодом.
Частые вопросы
Сколько пинов занимает клавиатура 4x4?
Клавиатура 4x4 занимает 8 пинов: 4 строки и 4 столбца. Клавиатуре 3x4 нужно 7 пинов, а 1x4 — 5. Если пинов не хватает, с I2C-адаптером можно обойтись 2 проводами, а с аналоговой клавиатурой — одним аналоговым пином.
Нужны ли клавиатуре резисторы?
Нет. Библиотека Keypad включает встроенные подтягивающие резисторы Arduino на пинах столбцов, поэтому добавлять резисторы не нужно. Клавиатуру можно подключать прямо к цифровым пинам.
К каким пинам подключать клавиатуру?
Подойдут любые 8 цифровых пинов; аналоговые пины тоже можно использовать как цифровые. На Uno избегай пинов 0 и 1: они заняты последовательной связью по USB. На ESP32 не используй GPIO 34–39: они не умеют работать на выход и не имеют подтягивающих резисторов.
Можно ли распознать две кнопки, нажатые одновременно?
Да, функция getKeys() библиотеки Keypad распознаёт до 10 одновременно нажатых кнопок. Но на плёночных клавиатурах без диодов некоторые сочетания из трёх кнопок могут создать видимость нажатия кнопки, которую никто не нажимал (эффект «фантомных» нажатий, ghosting).
Если поменять пароль, не забудется ли он после отключения питания?
Пароль, который хранится в переменной, после перезапуска Arduino возвращается к значению по умолчанию из кода. Чтобы новый пароль сохранялся, записывай его в EEPROM и при запуске считывай оттуда.
Насколько долговечна плёночная клавиатура?
Плёночные клавиатуры обычно выдерживают около 1 миллиона нажатий на каждую кнопку, а поскольку они тонкие и лёгкие, их легко наклеить на корпус или крышку. От воды и пыли они защищены не полностью; на улице лучше ставить клавиатуры с металлическими или силиконовыми кнопками.
Что собрать после прочтения
Все проекты
Работа с клавиатурой 3x4
Arduino сразу узнаёт, какая клавиша нажата на 12-клавишной клавиатуре, похожей на кнопки телефона, и выводит её на экран компьютера. Цифры, а также клавиши звёздочки и решётки расположены сеткой из ст

Управление светодиодами клавиатурой 3x4
С клавиатурой, как на телефоне, ты управляешь тремя отдельными огнями. Клавиши 1, 2 и 3 включают зелёный, синий и жёлтый светодиоды, клавиши 4, 5 и 6 выключают те же огни, клавиша звёздочки включает в

Работа с клавиатурой 4x4
На клавиатуре 4x4, очень похожей на кнопки телефона, Arduino сразу узнаёт, какая клавиша нажата, и выводит её на экран компьютера. Кроме цифр, она распознаёт буквы A, B, C и D, а также клавиши звёздоч

Кодовый замок с клавиатурой 4x4 и LCD
Маленький электронный дверной замок, который не пускает тех, кто не знает кода. Ты нажимаешь клавишу решётки и вводишь код на клавиатуре; если он верный, экран сообщает, что доступ разрешён, загораетс

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

Умный электронный сейф
Маленький сейф для ценных вещей, который открывается кодом. Ты вводишь на клавиатуре свой четырёхзначный код; если он верный, сервопривод открывает замок, загорается зелёный свет, а экран показывает с

Калькулятор на Arduino с I2C
Калькулятор на Arduino, который выполняет сложение, вычитание, умножение и деление с помощью плёночной клавиатуры 4x4 и LCD-дисплея 16x2 с I2C. Благодаря I2C дисплей подключается всего 2 проводами, поэтому проводов меньше, а свободных пинов больше. Поддерживаются ввод дробных чисел и отрицательные числа.
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

