Библиотека Keypad для работы с клавиатурой на Arduino

Добавлено 19 ноября 2016 в 13:50

Описание

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

Библиотека 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():
void setup()  {
  Serial.begin(9600);
  digitalWrite(ledPin, HIGH);            // Включить светодиод.
  keypad.addEventListener(keypadEvent);  // Добавить слушателя события.
  keypad.setHoldTime(500);               // По умолчанию 1000 мс.
  keypad.setDebounceTime(250);           // По умолчанию 50 мс.
}
Здесь показано, что время устранения дребезга контактов при нажатии кнопки устанавливается равным 250 миллисекунд. Если за это время происходит несколько нажатий на кнопку (что и происходит при дребезге контактов кнопки), то дополнительные нажатия просто игнорируются.

Теги

ArduinoKeypadКлавиатураПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.