Seja numa calculadora ou no interfone de um edifício, utilizamos frequentemente teclados numéricos. O teclado 4×4 é uma matriz de 16 botões cujos estados podem ser detectados por um microcontrolador.
Material
- Computador
- Arduino UNO
- Cabo USB A Macho/B Macho
- Teclado numérico 4×4
Princípio de funcionamento
O teclado numérico é um conjunto de 16 botões arranjados numa matriz, ou seja, todos os botões de uma mesma coluna estão ligados a uma entrada e todos os botões de uma mesma linha estão ligados a uma outra. Quando um botão é apertado, a entrada correspondente à linha é ligada à entrada correspondente à coluna, fechando o circuito. A vantagem deste tipo de arranjo é que possibilita gerir 16 botões com apenas 8 entradas do microcontrolador.
Esquema
O teclado numérico requer 8 pinos do Arduino. Pouco importa os pinos utilizados, mas evitamos se possível os pinos 0 e 1, utilizados para a ligação serial através da porta USB.
Código
Para gerir o teclado numérico, o princípio é definir cada entrada das colunas no estado high e ler o valor das entradas que correspondem às linhas. Se uma linha tiver o mesmo estado que a coluna, significa que um botão está pressionado. Na prática, podemos usar a biblioteca Keypad.h, que permite gerir uma matriz de botões de qualquer tamanho.
//Libraries #include <Keypad.h>//https://github.com/Chris--A/Keypad //Constants #define ROWS 4 #define COLS 4 //Parameters const char kp4x4Keys[ROWS][COLS] = {{'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}}; byte rowKp4x4Pin [4] = {9, 8, 7, 6}; byte colKp4x4Pin [4] = {5, 4, 3, 2}; //Variables Keypad kp4x4 = Keypad(makeKeymap(kp4x4Keys), rowKp4x4Pin, colKp4x4Pin, ROWS, COLS); void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); } void loop() { readKp4x4(); } void readKp4x4() { /* function readKp4x4 */ //// Read button states from keypad char customKey = kp4x4.getKey(); if (customKey) { Serial.println(customKey); } }
Resultado
Quando uma tecla do teclado é pressionada, observamos o caractere associado ser corretamente exibido no monitor serial.
Bônus: Salvar os caracteres numa tabela e compará-los
Para armazenar os caracteres, vamos criar uma matriz dos dígitos do tamanho desejado (digits) e uma variável contendo o número de teclas pressionadas (index). Quando a cadeia de caracteres atinge o seu tamanho máximo, comparamos com outra cadeia de caracteres usando strcmp(), e a redefinimos para zero.
//Libraries #include <Keypad.h>//https://github.com/Chris--A/Keypad //Constants #define ROWS 4 #define COLS 4 #define DLENGTH 2 //Parameters const char kp4x4Keys[ROWS][COLS] = {{'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}}; byte rowKp4x4Pin [4] = {9, 8, 7, 6}; byte colKp4x4Pin [4] = {5, 4, 3, 2}; char digits[DLENGTH]; char code[]="A0"; int index=0; //Variables Keypad kp4x4 = Keypad(makeKeymap(kp4x4Keys), rowKp4x4Pin, colKp4x4Pin, ROWS, COLS); void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); } void loop() { readKp4x4(); } void readKp4x4() { /* function readKp4x4 */ //// Read button states from keypad char customKey = kp4x4.getKey(); if (customKey) { //Serial.println(customKey); digits[index]=customKey; index=index+1; if(index==DLENGTH){ Serial.println(digits); index=0; if(strcmp(digits,code)==0){ Serial.println(F("Code bon !")); } } } }
Aplicações
- Criar uma interface com vários botões
- Criar uma fechadura acionada por teclado
- Desenvolver um alarme que pode ser ativado ou desativado com uma senha