ELECTRONICS

Матричная клавиатура 4×4 и Arduino: схема подключения, библиотека Keypad и скетч

Клавиатуры и кнопкиСкетч проверен компиляцией

Шестнадцать кнопок, а выводов всего восемь — в этом весь смысл матричной клавиатуры. Кнопки стоят на пересечениях четырёх строк и четырёх столбцов, и каждая замыкает свою строку со своим столбцом. Плата по очереди опрашивает строки и смотрит, на каком столбце появился сигнал.

Плёночная клавиатура — это буквально наклейка толщиной меньше миллиметра с гибким шлейфом на восемь контактов. Её приклеивают на корпус, она не боится влаги и стоит дёшево. Расплата — невнятное нажатие: тактильной отдачи почти нет.

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

Наведите курсор на провод — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
Выводы 1–4Строки матрицы. Любые цифровые выводы, работают на выход.
Выводы 5–8Столбцы матрицы. Любые цифровые выводы, работают на вход с подтяжкой.
ПитаниеНе требуется. Внутри клавиатуры только кнопки, без электроники.

Характеристики

Количество кнопок
16 (4 × 4)
Занимает выводов
8
Толщина
менее 1 мм
Ресурс
около миллиона нажатий
Питание
не нужно
Защита от фантомных нажатий
нет — диодов внутри не предусмотрено

Как определить, где строки, а где столбцы

На шлейфе клавиатуры подписей обычно нет, а порядок выводов у разных производителей отличается. Надёжный способ — прозвонить мультиметром в режиме проверки цепи: нажмите кнопку в левом верхнем углу и найдите пару выводов, которая при этом замыкается. Один из них — первая строка, второй — первый столбец.

Способ без мультиметра: подключить наугад и загрузить скетч, который печатает нажатую кнопку. Если вместо цифр печатаются буквы или кнопки смещены, поменяйте местами группы проводов в описании массива в скетче — переподключать физически ничего не нужно.

Библиотека

KeypadСтавится через менеджер библиотек, автор Mark Stanley. Берёт на себя всё сканирование матрицы и подавление дребезга — вам остаётся только описать раскладку.

Готовый скетч

#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] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

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

const String PASSWORD = "1234";
String entered = "";

void setup() {
  Serial.begin(9600);
  Serial.println("Введите код и нажмите #");
}

void loop() {
  char key = keypad.getKey();
  if (!key) return;              // ничего не нажато

  if (key == '#') {
    if (entered == PASSWORD) {
      Serial.println("Верно");
    } else {
      Serial.println("Неверно");
    }
    entered = "";
  } else if (key == '*') {
    entered = "";                // сброс ввода
    Serial.println("Сброшено");
  } else {
    entered += key;
    Serial.print("*");           // не показываем сам код
  }
}

Скетч собирается arduino-cli под Arduino UNO

Функция getKey не ждёт нажатия, а мгновенно возвращает ноль, если ничего не нажато. Поэтому её можно вызывать в каждом проходе цикла, не блокируя остальную программу.

Частые ошибки

Нажимаешь одну кнопку, печатается другая

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

Часть кнопок не работает вовсе

Обычно это плохой контакт шлейфа в разъёме: плёночный шлейф тонкий и легко выскакивает. Проверьте прозвонкой каждую пару выводов.

При нажатии трёх кнопок появляется четвёртая

Фантомное нажатие — врождённое свойство матрицы без диодов. Лечится только диодом в каждой кнопке, чего в плёночных клавиатурах не бывает. На практике мешает редко: пароли набирают по одной кнопке.

Одно нажатие считается несколько раз

Дребезг контактов. Библиотека Keypad подавляет его сама, но если писать сканирование вручную, придётся добавлять задержку в несколько миллисекунд.

Клавиатура заняла все выводы, а нужен ещё дисплей

Восемь выводов из тринадцати — это много. Либо возьмите клавиатуру 4×3 и сэкономьте один вывод, либо подключите дисплей по I2C, который занимает всего два.

Что понадобится