Компоненты · 4 мин чтения

Матричная клавиатура 4x4 и Arduino: кодовый замок

Как работает матричная клавиатура? Подключение клавиатур 4x4 и 3x4, сканирование строк и столбцов, библиотека Keypad, чтение нажатий, ввод пароля и кодовый замок с сервоприводом, вывод на LCD, а также ESP32 и Pico.

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

Плёночная клавиатура 4x4
Плёночная клавиатура 4x4: цифры 0–9, буквы A–D и клавиши * и #; у шлейфа внизу 8 пинов.

Как работает клавиатура? Матрица строк и столбцов

Если бы у каждой из 16 кнопок был свой пин, понадобилось бы 16 пинов. Вместо этого кнопки клавиатуры собраны в матрицу: 4 строки и 4 столбца, каждая кнопка стоит на пересечении строки и столбца, а нажатие соединяет эту строку с этим столбцом. Arduino по очереди переводит строки в LOW и читает столбцы; столбец, на котором появился LOW при определённой строке в LOW, показывает, какая кнопка нажата. Такое сканирование идёт сотни раз в секунду, поэтому 16 кнопок читаются всего через 8 пинов.

ТипКнопкиПиныТипичное применение
Плёночная 4x416 (0–9, A–D, *, #)8Пароли, меню, калькуляторы
Плёночная 3x412 (0–9, *, #)7Ввод чисел, как на телефоне
Плёночная 1x445Простые меню и кнопки выбора

Распиновка и подключение клавиатуры

Если повернуть клавиатуру кнопками к себе, пины шлейфа слева направо обычно такие: R1, R2, R3, R4, C1, C2, C3, C4; первые четыре — строки, последние четыре — столбцы. Дополнительные резисторы не нужны: для столбцов библиотека использует встроенные подтягивающие резисторы Arduino.

Пин клавиатурыНазначениеArduino Uno
1R1 (1, 2, 3, A)D9
2R2 (4, 5, 6, B)D8
3R3 (7, 8, 9, C)D7
4R4 (*, 0, #, D)D6
5C1 (1, 4, 7, *)D5
6C2 (2, 5, 8, 0)D4
7C3 (3, 6, 9, #)D3
8C4 (A, B, C, D)D2
Если при нажатии 1 приходит D, а при нажатии 4 — C, значит, порядок строк и столбцов перепутан. Перепаивать провода не нужно: просто разверни порядок элементов в массивах rowPins и colPins в коде.

Чтение кнопок с библиотекой Keypad

В «Менеджере библиотек» (Library Manager) найди Keypad и установи библиотеку от Mark Stanley и Alexander Brevig. Код ниже выводит каждую нажатую кнопку в монитор порта:

C++ (Arduino IDE)
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 секунды. Как подключить сервопривод, читай в статье Что такое сервопривод?

C++ (Arduino IDE)
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}
Этот замок предназначен для учёбы и хобби-проектов. Для настоящей двери добавь блокировку на время после нескольких неверных попыток, храни пароль в EEPROM, а не открытым текстом в коде, и размести электронику там, где до неё нельзя добраться снаружи.

Вместе с 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 сканирование можно написать самостоятельно в несколько строк:

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
#61Новичок

Работа с клавиатурой 3x4

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

4.5(24)
31
Управление светодиодами клавиатурой 3x4
#62Средний
Premium

Управление светодиодами клавиатурой 3x4

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

4.6(29)
38
Работа с клавиатурой 4x4
#63Новичок
Premium

Работа с клавиатурой 4x4

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

4.5(27)
35
Кодовый замок с клавиатурой 4x4 и LCD
#64Продвинутый
Premium

Кодовый замок с клавиатурой 4x4 и LCD

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

4.8(59)
75
Клавиатура разработчика на Arduino
#65Средний
Premium

Клавиатура разработчика на Arduino

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

4.7(40)
52
Умный электронный сейф
#92Продвинутый
Premium

Умный электронный сейф

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

4.7(42)
63
Калькулятор на Arduino с I2C
#94Средний
Premium

Калькулятор на Arduino с I2C

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

5.0(31)
43