Site icon AranaCorp

Usar um teclado numérico 4×4 com o Arduino

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

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

Fontes

Exit mobile version