Библиотека Keypad для работы с клавиатурой на Arduino
Описание
Библиотека Keypad
служит для использования совместно с Arduino клавиатур матричного типа. Текущая версия библиотеки (3.1) поддерживает множественные нажатия.
Данная библиотека была создана для создания уровня абстракции для аппаратного обеспечения. Она улучшает читаемость кода, скрывая от пользователя вызовы функций pinMode
и digitalRead
.
Версия 3.0 (опубликована 19 июля 2012) была переписана для поддержки по умолчанию множественных нажатий. Но для тех, кому всё еще изначальная функциональность с одиночными нажатиями, библиотека обеспечивает полную обратную совместимость.
Вам нет необходимости использовать внешние резисторы или диоды, так как библиотека использует внутренние подтягивающие резисторы в микроконтроллере на Arduino и дополнительно обеспечивает высокое входное сопротивление на всех неиспользуемых выводах столбцов.
Загрузка, установка и импорт
Данная библиотека сейчас доступна через менеджер библиотека в Arduino IDE. Если вы используете современную IDE (версия 1.6.2 и выше), то можете просто использовать меню:
Скетч → Подключить библиотеку → Управлять библиотеками... А затем найти Keypad.
Когда найдете, нажмите на записи, и появится кнопка «Установка». ZIP файл приведен ниже для старых версий IDE.
Скачать библиотеку Keypad версия 3.1.
Поместите каталок Keypad в "arduino\libraries\".
В Arduino IDE создайте новый скетч (или откройте существующий) и выберите в меню «Скетч → Импорт библиотеки → Keypad».
Когда библиотека импортирована, строка "#include <Keypad.h>
" появится в начале вашего скетча.
Создание
Конструкторы:
Keypad(makeKeymap(userKeymap), row[], col[], rows, cols)
- Создает объект Keypad, который использует (в примере ниже) выводы 5, 4, 3, 2 как выводы строк и выводы 8, 7, 6 как выводы столбцов. Эта клавиатура имеет 4 строки и 3 столбца, в итоге 12 кнопок.
const byte rows = 4; // четыре строки const byte cols = 3; // три столбца char keys[rows][cols] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'#','0','*'} }; byte rowPins[rows] = {5, 4, 3, 2}; // подключить к выводам строк клавиатуры byte colPins[cols] = {8, 7, 6}; // подключить к выводам столбцов клавиатуры Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );
Функции
void begin(makeKeymap(userKeymap))
- Инициализирует внутреннюю раскладку клавиатуры, чтобы та соотвествовала
userKeymap
. char waitForKey()
- Данная функция будет ждать бесконечно, пока кто-нибудь не нажмет клавишу. Предупреждение: она блокирует весь остальной кода, пока кнопка не будет нажата. Это означает, что не будет происходить ни мигание светодиода, ни обновление LCD дисплея, ничего, кроме выполнения функций прерываний.
char getKey()
- Возвращает кнопку, которая нажата, если таковая имеется. Данная функция является неблокирующей.
KeyState getState()
- Возвращает текущее состояние любой из клавиш. Возвращается одно из четырех состояний:
IDLE
,PRESSED
,RELEASED
иHOLD
. boolean keyStateChanged()
- Дает вам знать, когда изменилось состояние кнопки. Например, вместо проверки нужной клавиши, вы можете проверить, когда клавиша была нажата.
setHoldTime(unsigned int time)
- Устанавливает количество миллисекунд, которое пользователь должен удерживать кнопку нажатой, чтобы было вызвано состояние HOLD.
setDebounceTime(unsigned int time)
- Устанавливает количество миллисекунд, которое клавиатура ждет перед тем, как применить новое нажатие кнопки или событие кнопки. Это «время задержки» в методе обработки дребезга контактов.
addEventListener(keypadEvent)
- Вызывает событие, если используется клавиатура.
#include <Keypad.h> const byte ROWS = 4; // четыре строки const byte COLS = 3; // три столбца char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte rowPins[ROWS] = {5, 4, 3, 2}; // подключить к выводам строк клавиатуры byte colPins[COLS] = {8, 7, 6}; // подключить к выводам столбцов клавиатуры Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); byte ledPin = 13; boolean blink = false; void setup(){ Serial.begin(9600); pinMode(ledPin, OUTPUT); // установить цифровой вывод на выход digitalWrite(ledPin, HIGH); // включить светодиод keypad.addEventListener(keypadEvent); // добавить слушателя события для данной клавиатуры } void loop(){ char key = keypad.getKey(); if (key) { Serial.println(key); } if (blink){ digitalWrite(ledPin,!digitalRead(ledPin)); delay(100); } } // обработать события: void keypadEvent(KeypadEvent key){ switch (keypad.getState()){ case PRESSED: switch (key){ case '#': digitalWrite(ledPin,!digitalRead(ledPin)); break; case '*': digitalWrite(ledPin,!digitalRead(ledPin)); break; } break; case RELEASED: switch (key){ case '*': digitalWrite(ledPin,!digitalRead(ledPin)); blink = false; break; } break; case HOLD: switch (key){ case '*': blink = true; break; } break; } }
Методы класса Keypad
и определения для работы с множественными нажатиями:
Key key[LIST_MAX]
- Список активных клавиш.
LIST_MAX
(равен 10) задает максимальное количество клавиш в активном списке. bool getKeys()
- Заполняет массив
key
активных клавиш (до 10 значений). Возвращаетtrue
при наличии любых активных клавиш. bool isPressed(char keyChar)
- Возвращает
true
, если кнопка с кодомkeyChar
нажата. int findInList(char keyChar)
- Поиск клавиши по коду в списке активных клавиш. Возвращает
-1
, если клавиша не найдена, или индекс в массиве активных клавиш.
Пример
#include <Keypad.h>
const byte ROWS = 4; //четыре строки
const byte COLS = 3; //три столбца
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'#','0','*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //подключить к выводам строк клавиатуры
byte colPins[COLS] = {8, 7, 6}; //подключить к выводам столбцов клавиатуры
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
Serial.begin(9600);
}
void loop(){
char key = keypad.getKey();
if (key != NO_KEY){
Serial.println(key);
}
}
FAQ
- Как я могу использовать несколько клавиатур?
Keypad –
это класс. Следовательно, для использования нескольких клавиатур вы должны создать объект класса для каждой из них. В примере выше экземпляр класса Keypad keypad был связан с цифровыми выводами 2, 3, 4, 5, 6, 7 и 8. Чтобы добавить клавиатуру, подключенную к цифровым выводам 9, 10, 11, 12, 13, 14, 15 и 16, вы можете создать следующий объект keypad2:
И теперь просто используйте нужные методы любой из клавиатур:const byte ROWS2 = 4; // четыре строки const byte COLS2 = 4; // четыре столбца char keys2[ROWS2][COLS2] = { {'.','a','d','1'}, {'g','j','m','2'}, {'p','t','w','3'}, {'*',' ','#','4'} }; byte rowPins2[ROWS2] = {12, 11, 10, 9}; // подключить к выводам строк клавиатуры byte colPins2[COLS2] = {16, 15, 14, 13}; // подключить к выводам столбцов клавиатуры Keypad keypad2 = Keypad( makeKeymap(keys2), rowPins2, colPins2, ROWS2, COLS2 );
void loop(){ char key1 = keypad.getKey(); char key2 = keypad2.getKey(); if (key1 != NO_KEY || key2 != NO_KEY){ Serial.print("You pressed: "); Serial.print(key1 != NO_KEY ? key1 : "nothing on keypad"); Serial.print(" and "); Serial.print(key2 != NO_KEY ? key2 : "nothing on keypad2"); Serial.println("."); } }
- Как я могу использовать
setDebounceTime(unsigned int time)
? - В Arduino IDE проследуйте по меню «Файл → Примеры → Keypad → DynamicKeypad». Когда скетч откроется, найдите функцию setup():
Здесь показано, что время устранения дребезга контактов при нажатии кнопки устанавливается равным 250 миллисекунд. Если за это время происходит несколько нажатий на кнопку (что и происходит при дребезге контактов кнопки), то дополнительные нажатия просто игнорируются.void setup() { Serial.begin(9600); digitalWrite(ledPin, HIGH); // Включить светодиод. keypad.addEventListener(keypadEvent); // Добавить слушателя события. keypad.setHoldTime(500); // По умолчанию 1000 мс. keypad.setDebounceTime(250); // По умолчанию 50 мс. }