8 (800) 350-30-16

Подключаем матричную клавиатуру

Дата: / Категория: Интерфейсы / Автор: DOC_tr

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

А в конце, как бонус, я покажу как сделать простенький калькулятор с помощью клавиатуры и экрана .

В нашей работе мы будем использовать библиотеки keyPad и plcLib, а также библиотеки для работы с экраном, которые можно взять из статьи "Подключение графического дисплея Nokia5110".

Схему подключения я описывать не буду (как подключать экран вы можете посмотреть в соответствующей статье), а подключение клавиатуры не должно вызвать вопросов. В данном примере пины клавиатуры 1-7 подключены к выходам Arduino 7-13:

А теперь ближе к делу:

#include <Keypad.h>
#include <plcLib.h>

// массив с данными клавиатуры
char keyMap[4][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};

// пины клавиатуры (с 7 по 1)
// Обратите внимание на последовательность.
byte rowsPins[4] = { 12, 13, 11, 10 };
byte colsPins[3] = { 9, 8, 7 };

Keypad key = Keypad( makeKeymap(keyMap), rowsPins, colsPins, 4, 3 );

void setup() {
Serial.begin(9600);
// стартовые настройки клавиатуры
setupPLC();
}

void loop()
{
// считываем нажатие клавиши
char isKeyPress = key.getKey();
if(isKeyPress){
Serial.println(isKeyPress);
}
}

 Теперь, при нажатии на кнопку, ее значение будет выводиться на нашем экране. Например, напечатаем телефон нашего магазина - 9888971:

А теперь немного изменим код - пусть нажатие на красные клавиши (* и #) очищают экран:

#include <Keypad.h>
#include <plcLib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// массив с данными клавиатуры
char keyMap[4][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};

// пины клавиатуры (с 7 по 1)
byte rowsPins[4] = { 12, 13, 11, 10 };
byte colsPins[3] = { 9, 8, 7 };

Keypad key = Keypad( makeKeymap(keyMap), rowsPins, colsPins, 4, 3 );
Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 5, 6);

void setup() {
Serial.begin(9600);
// стартовые настройки клавиатуры
setupPLC();
// задаем стартовые настройки экрана
display.begin();
display.clearDisplay();
display.display();
display.setContrast(60);
display.setCursor(0, 0);
display.setTextSize(2);
}

void loop()
{
// считываем нажатие клавиши
char isKeyPress = key.getKey();
// если клавиша * или # то очищаем дисплей
if(isKeyPress == '*' || isKeyPress == '#'){
display.clearDisplay();
display.display();
display.setCursor(0, 0);
}
// если клавиша другая, то пишем ее значение на дисплее
else if(isKeyPress){
Serial.println(isKeyPress);
display.write(isKeyPress);
display.display();
}
}

Как видите, все не так уж и сложно.

Но так как статья получилась ну совсем короткая, я решил набросать калькулятор. Кнопка * отвечает за переключение знаков, а кнопка # выводит ответ.

Так как он был написан на коленке, этот пример нельзя использовать в реальной практике (хотя кому понадобится такой калькулятор в реальной практике?). Но вы сами можете дописать все необходимые проверки, сброс значений или действия со многими числами.

#include <Keypad.h>
#include <plcLib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// массив с данными клавиатуры
char keyMap[4][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};

byte rowsPins[4] = { 12, 13, 11, 10 };
byte colsPins[3] = { 9, 8, 7 };

Keypad key = Keypad( makeKeymap(keyMap), rowsPins, colsPins, 4, 3 );
Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 5, 6);

int memory = 0;
String lastNumber = "";
String number = "";

void setup() {
Serial.begin(9600);
// стартовые настройки клавиатуры
setupPLC();
// задаем стартовые настройки экрана
display.begin();
display.clearDisplay();
display.display();
display.setContrast(60);
display.setCursor(0, 0);
display.setTextSize(2);
}

int num = 0;
char znak[4] = {'x', '-', '+', '/'};

void loop()
{
// считываем нажатие клавиши
char isKeyPress = key.getKey();
// если клавиша * или # то очищаем дисплей
if(isKeyPress == '*'){
// прокручиваем массив znak по кругу
num++;
if(num > 3){num = 0;}

writeDisplay(String(znak[num]));
if(number.length()){
lastNumber = number;
number = "";
}
}
else if(isKeyPress == '#'){
if(!lastNumber){
return;
}
int result = 0;
// выбираем действие по массиву znak
switch(num){
case 0:
result = lastNumber.toInt() * number.toInt();
break;
case 1:
result = lastNumber.toInt() - number.toInt();
break;
case 2:
result = lastNumber.toInt() + number.toInt();
break;
case 3:
result = lastNumber.toInt() / number.toInt();
break;
}
writeDisplay(String(result));
}
// если клавиша другая, то пишем ее значение на дисплее
else if(isKeyPress){
Serial.println(isKeyPress);
number = number + String(isKeyPress);
writeDisplay(number);
}
}

// функция вывода на экран с полной его очисткой.
void writeDisplay(String str){
display.clearDisplay();
display.setCursor(0, 0);
display.print(str);
display.display();
}

Вот и все. Надеюсь, данная статья оказалась полезной для вас.

Теги: #Arduino, #Nokia5110, #Матричная клавиатура

Ваша оценка:

Рейтинг: 10.0 (Оценок: 2)

Комментарии (2):

Антон
2016-05-05 22:44
очень помогло! смог подключить и управлять реле с помощью клавиш матричной клавиатуры 1 на 4
DOC_tr
2016-05-06 12:45
@Антон:Так напишите об этом статью ;) - https://robom.ru/page/akcii-i-skidki.html#states

Комментарий:

Copyright © RobOM.ru 2016 г. Все права защищены