fbpixel
Etiquetas: ,
0
(0)

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

Fontes

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?