Урок 13 Начинающий 40 минут

Матричная клавиатура 4×4

Подключите матричную клавиатуру к ESP32 и создайте кодовый замок с вводом PIN-кода.

1

Подготовка оборудования

Компоненты для урока: ESP32, матричная клавиатура 4×4, светодиод, провода

ESP32 DevKit

Любая версия (30/38 пинов)

⌨️

Клавиатура 4×4

Мембранная, 16 кнопок (0-9, A-D, *, #)

💡

Светодиод (опционально)

Для индикации правильного кода

🔗

Провода

Dupont «мама-папа» (8 проводов)

2

Как работает матричная клавиатура

Матричное сканирование

Клавиатура 4×4 содержит 16 кнопок, но использует только 8 проводов (4 строки + 4 столбца). Микроконтроллер поочерёдно подаёт LOW на каждую строку и считывает состояние столбцов — это называется матричным сканированием.

4 строки (Row) Выходы Поочерёдно подаём LOW
4 столбца (Col) Входы с Pull-Up Читаем состояние
💡

При нажатии кнопки в пересечении строки R2 и столбца C3 — провод R2 становится LOW, и на входе C3 появляется LOW. Так определяется нажатая кнопка.

Принцип матричного сканирования клавиатуры 4×4

Разъём клавиатуры

Разъём клавиатуры 4×4: 8 пинов — строки и столбцы
R1 Строка 1 → GPIO 19
R2 Строка 2 → GPIO 18
R3 Строка 3 → GPIO 5
R4 Строка 4 → GPIO 17
C1 Столбец 1 → GPIO 16
C2 Столбец 2 → GPIO 4
C3 Столбец 3 → GPIO 0
C4 Столбец 4 → GPIO 2
3

Схема подключения

Схема подключения матричной клавиатуры 4×4 к ESP32

Подключение 8 пинов клавиатуры к GPIO ESP32

1

Пин 1 (R1) → GPIO 19

2

Пин 2 (R2) → GPIO 18

3

Пин 3 (R3) → GPIO 5

4

Пин 4 (R4) → GPIO 17

5

Пин 5 (C1) → GPIO 16

6

Пин 6 (C2) → GPIO 4

7

Пин 7 (C3) → GPIO 0

8

Пин 8 (C4) → GPIO 2

4

Установка библиотеки Keypad

Для работы с клавиатурой нужна библиотека Keypad. Откройте Arduino IDE → Sketch → Include Library → Manage Libraries, найдите «Keypad» и установите «Keypad by Mark Stanley, Alexander Brevig».

#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;

// Раскладка клавиатуры
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

// Пины строк и столбцов
byte rowPins[ROWS] = {19, 18, 5, 17};
byte colPins[COLS] = {16, 4, 0, 2};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {
  Serial.begin(115200);
  Serial.println("Клавиатура готова. Нажимайте кнопки...");
}

void loop() {
  char key = keypad.getKey();
  if (key) {
    Serial.print("Нажата кнопка: ");
    Serial.println(key);
  }
}
5

Кодовый замок

Теперь реализуем настоящий кодовый замок: вводим PIN-код, подтверждаем нажатием #, сбрасываем нажатием *.

Serial Monitor: кодовый замок — ввод PIN, проверка, результат
#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {19, 18, 5, 17};
byte colPins[COLS] = {16, 4, 0, 2};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

const String PASSWORD = "1234"; // Ваш PIN-код
String inputBuffer = "";

void setup() {
  Serial.begin(115200);
  Serial.println("=== Кодовый замок ===");
  Serial.println("Введите PIN и нажмите #");
}

void loop() {
  char key = keypad.getKey();
  if (!key) return;

  if (key == '#') {
    // Проверка пароля
    if (inputBuffer == PASSWORD) {
      Serial.println("✓ Доступ разрешён! Замок открыт.");
    } else {
      Serial.println("✗ Неверный PIN. Попробуйте снова.");
    }
    inputBuffer = "";
  } else if (key == '*') {
    // Сброс ввода
    inputBuffer = "";
    Serial.println("Ввод сброшен");
  } else {
    inputBuffer += key;
    Serial.print("Введено символов: ");
    Serial.println(inputBuffer.length());
  }
}
6

Практическое применение

Применения матричной клавиатуры: кодовые замки, калькуляторы, роботы
🔒

Кодовые замки

Защита сейфов, дверей, ящиков от несанкционированного доступа

🖩

Системы ввода

Калькуляторы, системы учёта посещений, управление меню

🤖

Роботы и станки

Ввод координат, углов поворота или управляющих команд

7

Решение проблем

Типичные проблемы при подключении матричной клавиатуры к ESP32

❌ Кнопки не определяются

✓ Проверьте порядок подключения проводов — ошибка в одном проводе сдвигает все кнопки.

❌ Неверные символы при нажатии

✓ Проверьте массив rowPins и colPins — порядок пинов должен совпадать с физическим расположением.

❌ Несколько символов при одном нажатии

✓ Нормальная работа при дребезге. Добавьте keypad.setDebounceTime(50) в setup().

❌ Ошибка компиляции Keypad.h

✓ Убедитесь что библиотека установлена: Sketch → Include Library → Manage Libraries → «Keypad».

8

Что мы изучили

  • Принцип матричного сканирования клавиатуры 4×4
  • Подключение 8 проводов клавиатуры к GPIO ESP32
  • Чтение нажатий через библиотеку Keypad
  • Создание простого кодового замка с PIN-кодом
9

Цех Испытаний

Отточите мастерство на реальных кейсах. Каждая карта — это шаг к полному пониманию матричного ввода.

Время прохождения
~90 минут суммарно
⌨️
Уровень: Start 5m

Эхо клавиш

Самое простое: нажал кнопку — увидел символ в Serial.

Миссия

Подключите клавиатуру 4×4 к GPIO 19, 18, 5, 17 (строки) и GPIO 16, 4, 2, 15 (столбцы). Инициализируйте библиотеку Keypad. В loop() вызывайте char key = keypad.getKey(). Если key != NO_KEY — выводите символ в Serial.println(key). Проверьте все 16 клавиш.

01
🔦
Уровень: Easy 10m

Светосигналы

Три кнопки — три световых режима LED.

Миссия

Подключите светодиод к GPIO 13. При нажатии '1' — включить LED (digitalWrite(13, HIGH)). При нажатии '2' — выключить LED. При нажатии '*' — запустить мигание: 5 раз по 200мс вкл / 200мс выкл. При нажатии '#' — остановить мигание и выключить LED. Состояние мигания храните в переменной bool blinking.

02
🧮
Уровень: Normal 15m

Калькулятор +

Ввод двух чисел с клавиатуры и вывод их суммы.

Миссия

Реализуйте калькулятор сложения: пользователь вводит первое число (цифры 0–9, '#' — подтвердить), затем нажимает 'A' (оператор +), затем вводит второе число и нажимает '#'. Результат выводится в Serial: '12 + 34 = 46'. '*' сбрасывает ввод в любой момент. Числа могут быть многозначными (до 4 цифр).

03
🔐
Уровень: Hard 20m

Кодовый замок

PIN из 4 цифр с LED-индикацией результата.

Миссия

Подключите зелёный LED к GPIO 12, красный к GPIO 14. Правильный код: '1234'. Пользователь вводит 4 цифры подряд (без подтверждения). После 4-го нажатия: если код верный — зелёный LED горит 3 секунды; если нет — красный LED мигает 3 раза по 200мс. При вводе каждой цифры выводите '*' в Serial (маскировка). После результата буфер сбрасывается автоматически.

04
📱
Уровень: Expert 30m

Мини-телефон

Набор 7-значного номера с отображением на OLED и редактированием.

Миссия

Реализуйте набор телефонного номера: цифры 0–9 добавляются в строку (максимум 7 символов). '*' удаляет последний символ (аналог Backspace). '#' подтверждает набор и выводит 'Вызов: XXXXXXX' в Serial. 'A' сбрасывает всё. После каждого нажатия обновляйте отображение на OLED (библиотека Adafruit_SSD1306): первая строка 'Номер:', вторая — текущие цифры с курсором '_'.

05
🚀

Свой Проект

Создайте свою уникальную модель в онлайн-симуляторе. Ограничений нет!

Открыть Симулятор →

🎉 Урок завершён!

Теперь ESP32 умеет принимать ввод с матричной клавиатуры — откройте путь к кодовым замкам и интерактивным устройствам

Что вы изучили:

  • Принцип матричного сканирования клавиатуры 4×4
  • Подключение 8 проводов клавиатуры к GPIO ESP32
  • Чтение нажатий через библиотеку Keypad
  • Создание простого кодового замка с PIN-кодом