ELECTRONICS

Библиотека Keypad

менеджер: KeypadMark Stanley, Alexander Brevigверсия 3.1.1

Матричные клавиатуры 3×4 и 4×4: сканирует строки и столбцы, гасит дребезг, отдаёт нажатый символ.

Мембранная клавиатура 4×4 — это восемь проводов: четыре строки и четыре столбца, а клавиша замыкает пересечение. Библиотека по очереди подаёт сигнал на строки, читает столбцы и возвращает символ из таблицы, которую вы ей задали. Дребезг и удержание обрабатываются внутри.

Таблица символов — ваша: вместо цифр можно задать любые буквы. Один вызов getKey() в цикле — и клавиатура работает.

Установка и подключение

В менеджере библиотек ищите Keypad автора Mark Stanley, Alexander Brevig. Если менеджер предложит поставить зависимости — соглашайтесь. Как открыть менеджер и что делать, если библиотека не находится, — в общей статье про библиотеки.

#include <Keypad.h>

Создание объекта — обычно до setup():

const byte ROWS = 4, 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(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

Методы

Только то, что нужно в обычном скетче. Сигнатуры сверены с версией 3.1.1.

getKey()
Символ только что нажатой клавиши или NO_KEY (0). Вызывать в loop() постоянно.
waitForKey()
Ждать нажатия, блокируя скетч, и вернуть символ.
getState()
Состояние последней клавиши: PRESSED, HOLD, RELEASED, IDLE.
isPressed(char key)
Удерживается ли конкретная клавиша сейчас.
setDebounceTime(uint ms)
Время подавления дребезга, по умолчанию 10 мс.
setHoldTime(uint ms)
Через сколько нажатие считается удержанием, по умолчанию 500 мс.
addEventListener(void (*f)(char))
Функция, которую вызовут при любом изменении состояния — вместо опроса.
getKeys()
Опросить с поддержкой нескольких нажатых клавиш сразу; результат в keypad.key[].

Пример

#include <Keypad.h>

const byte ROWS = 4, 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(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

String code = "";

void setup() { Serial.begin(9600); }

void loop() {
  char k = keypad.getKey();
  if (!k) return;
  if (k == '#') {                       // решётка — ввод
    Serial.println(code == "1234" ? "Открыто" : "Неверный код");
    code = "";
  } else if (k == '*') {
    code = "";                          // звёздочка — сброс
  } else {
    code += k;
  }
}

Провода клавиатуры слева направо — это строки, потом столбцы; если символы отдаются не те, поменяйте местами массивы rowPins и colPins.

На чём попадаются

Нажатие даёт не тот символ

Перепутаны строки и столбцы или их порядок. Нажимайте «1», «2», «3» подряд и смотрите, куда уезжает.

Клавиша срабатывает дважды

Дребезг сильнее обычного: увеличьте setDebounceTime() до 20–30 мс.

Не хватает выводов на UNO

Восемь под клавиатуру — это много. Есть клавиатуры с переходником I2C на PCF8574 и одноимённая библиотека Keypad_I2C.

Где используется на сайте

Что дальше