Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


Teclado matricial com display LCD e Arduino Uno



Este é um teclado matricial funcionando junto com um display LCD e um arduino uno, o mais básico que existe hoje. O objetivo dessa montagem é criar um programa que recebe uma senha digitada no teclado matricial, compara com a senha correta e exibe uma mensagem de confirmação no display.
Importante lembrar que tanto esse teclado matricial quanto esse display funcionam com o ESP8266 e com o ESP32.

 Como vocês podem ver, alimentamos o circuito, ou seja, o Arduino, com USB, já que não estamos usando uma fonte externa. A ligação do nosso teclado é feita por oito fios conectados nas portas do Arduino, de forma bem simples, pois este teclado não tem alimentação por ser passivo, o que facilita bastante as conexões.

O display está ligado com um Arduino pela UART, a porta serial, que também alimenta o dispositivo.
Em uma demonstração mostramos no vídeo o nosso circuito checando se a senha digitada no teclado é correta ou não.
 


No PDF utilizado no vídeo e disponibilizado aqui temos a pinagem completa do chip que está sendo utilizado.





Display Serial

Este é o display serial que comunica com a UART, que é a RS com um TXRX. Ele existe também em versões I2C, mas outros modelos que ficarão para uma próxima montagem. Neste caso, esse display funciona pela UART pela RS.



Teclado matricial


O exemplo do teclado matricial que a gente utiliza é esse da foto, está do lado direito. Mas, pegamos um diagrama que mostra como é que ele funciona. Na verdade, ele só tem 4x4 linhas. Ou seja, ele usa o mínimo de fios, ou seja, um fio para cada linha e coluna, então são oito fios no total.
Ele não precisa de alimentação porque funciona da seguinte forma: quando se aperta o 7, o teclado pega o 7 e conecta em relação à linha e coluna, o que possibilita sua identificação pelo algoritmo por varredura de forma automática.
Lembrando que qualquer teclado de 4x4 que seja matricial vai funcionar nesta montagem.

Montagem


No esquema geral conectamos oito fios direto nas portas do Arduino, já que o teclado não tem alimentação. No display temos um sinal da RS 232 e alimentação positiva e negativa. Ainda está presente o Backlight, que também já tá ligado (identificado por BKL).

Código Fonte

No código-fonte deste projeto você tem que fazer um include serial e um include Keypad. Tem um define RX_PIN e um TX_PIN, necessários ao software serial, e ainda o INVERTED 1. Este foi colocado embaixo para amplificar o sinal que usa entrada com lógica invertida.

//biblioteca responsável pela comunicação com o display LCD
#include <SoftwareSerial.h>
//biblioteca responsável por capturar a tecla que foi pressionada no teclado
#include <Keypad.h>
// pino invalido apenas usado no contrutor do SoftwareSerial
#define RX_PIN   255   
// pino TX da nossa ligação Arduino x Display LCD   
#define TX_PIN   3 
// inverte a lógica dos pinos Rx e Tx, tratando LOW como HIGH e vice-versa       
#define INVERTED 1

Comandos do Display

Importante: nesse display, não basta somente jogar uma string nele. Você precisa mandar caracteres de controle. No PDF está o link do site onde tem um manual desse display. Mas, se você tiver um display serial de uma outra marca é bom olhar esses códigos de controle próprios dele. Neste modelo, por exemplo, quando mandamos um determinado controle, uma informação para este display, precisamos mandar um prefixo, o número 254, para possibilitar a comunicação.




Comandos para o Display

Então, montamos um ARRAY, uma coleção de variáveis que são acessadas com um índice numérico, para facilitar.  Este será enviado para o display como uma configuração inicial.

//comando para limpar toda a tela do display
const char limparTela[ ] = {
  254,1};

//comandos de configuração inicial
/*
  254,254 --> acende o backlight
  254,1   --> limpa a tela
  254,253,1 --> configura o contraste em nível alto
  254,13   --> liga o cursor paraficar piscando
*/
const char configInicial[ ] = {
  254,254, 254,1, 254,253,1, 254,13};

Funcionamento do teclado

Como funciona o teclado? Primeiro, ele monta uma matriz. Essa matriz é do caracter que efetivamente vai ser exibido lá. Então, se eu colocar um X, quando apertar a primeira tecla esquerda na parte superior, estará esta exibida. Isso se trata do conteúdo do teclado, ou seja, o que ele vai mandar.
Outra coisa que temos a definição: número de linha 4, número de coluna 4, no caso do ARRAY deste teclado. Temos ainda pinos das linhas, que são os pinos do Arduino, e os pinos da coluna. Ainda temos um construtor Keypad customKeypad com os parâmetros de símbolos, pinos, da linha e da coluna.

const byte LINHAS = 4; //número de linhas do teclado
const byte COLUNAS = 4; //número de colunas do teclado

//define uma matriz com os símbolos que deseja ser lido do teclado
char SIMBOLOS[LINHAS][COLUNAS] = {
  {'A','1','2','3'},
  {'B','4','5','6'},
  {'C','7','8','9'},
  {'D','c','0','e'}
};

byte PINOS_LINHA[LINHAS] = {8, 9, 10, 11}; //pinos que indicam as linhas do teclado
byte PINOS_COLUNA[COLUNAS] = {4, 5, 6, 7}; //pinos que indicam as colunas do teclado

//instancia de Keypad, responsável por capturar a tecla pressionada
Keypad customKeypad = Keypad( makeKeymap(SIMBOLOS), PINOS_LINHA, PINOS_COLUNA, LINHAS, COLUNAS);

Definição da senha

Nessa parte definimos a senha e depois temos que ter uma senha a ser digitada, ou seja, uma string vazia. Abaixo colocamos a instância do softwareSerial.

//variáveis resposnsáveis por armazenar as senhas
const String SENHA_ESPERADA = "1234ABCD";
String SENHA_DIGITADA = "";

//instancia de SoftwareSerial para nos comunicar com o Display via serial
SoftwareSerial displaySerial =  SoftwareSerial(RX_PIN, TX_PIN, INVERTED);

Setup

Quanto ao Setup, aqui consta o displaySerial.begin(2.400), que se trata da velocidade, esta suficiente para mandar um byte. Na sequência, está uma espera de 700 milissegundos. incluímos o displaySerial.print(configInicial), da configuração inicial, com novo delay de 10 milissegundos e vamos à função início. Na função início, colocamos displaySerial.print(“senha:”).

void setup(){
    Serial.begin(2400);
    //inicializando a serial de comunicação com o display
    //importante o baud rate ser de 2400
    displaySerial.begin(2400);
    //tempo de espera pela inicialização do display
    delay(700); 
    //seta a configuração inicial do display
   displaySerial.print(configInicial); 
   delay(10);
   inicio();
}

//função responsável por imprimir na tela a mensagem para digitar a senha

//é chamada toda vez q a senha foi digitada e comparada, também quando 

//a tecla limpar display foi pressionada.

void inicio(){
    displaySerial.print("Senha:");

}

Loop

No loop, criamos uma customKey = customKeypad.getKey()  e na sequência, entramos em um comando Switch.

  //captura a tecla pressionada do teclado
  char customKey = customKeypad.getKey();

  //caso alguma tecla foi pressionada
  if (customKey){
    Serial.println(customKey);
    switch(customKey)
    {
       /.../
    }
}

Loop – Switch Parte 1

Por dentro do comando Switch: mostra a lista de possibilidades de teclas imprimíveis, caso pressionadas, e incrementa a senha: pega o customKey e concatena a senha digitada. Na sequência, o displaySerial.print(customKey) mostra o conteúdo da tecla.

 switch(customKey)
    {
      //caso alguma das teclas imprimíveis foi pressionada
      case 'A':
      case 'B':
      case 'C':
      case 'D':
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
            //concatena o novo símbolo a senha que estamos digitando
            SENHA_DIGITADA+=customKey;
            Serial.println(SENHA_DIGITADA);
            //imrpime na tela o símbolo pressionado
            displaySerial.print(customKey);
            break;


Loop – Switch Parte 2

Neste código mostramos um cenário caso a tecla CLEAR seja pressionada. Caso seja digitada a letra C, limpa a variável que guarda a senha que está sendo digitada. Chama o comando para limpar a tela e reinicia.

//caso a tecla CLEAR tenha sido pressionada      
      case 'c':
              //limpa a variável que guarda a senha que está sendo digitada
              SENHA_DIGITADA = "";
              //chama o comando para limpar a tela
              displaySerial.print(limparTela);
              //configura a mensagem para digitar a senha
              inicio();
              break;


Loop – Switch Parte 3

Uma outra possibilidade: se digitada a letra E. Neste caso será feita a limpeza da tela e analisada se a senha digitada é correta ou incorreta. Na sequência, daremos um novo delay de 2 segundos, limpamos a tela, zeramos a variável da senha digitada e voltamos ao início.

  //caso a tecla ENTER seja pressionada, devemos comparar as senhas
      case 'e':
              //limpa a tela
              displaySerial.print(limparTela);
              
              //se a senha digitada foi igual a ESPERADA              
              if(SENHA_ESPERADA==SENHA_DIGITADA)
              {
                Serial.println("Senha Correta!");
                //imprime mensagem de senha correta
                displaySerial.print("Senha Correta!!!");
              }
              //caso senha esteja errada
              else{
                Serial.println("Senha Incorreta!");
                //imprime mensagem de senha incorreta
                displaySerial.print("Senha Incorreta!");
              }
              //aguarda 2 segundos para limpar a tela novamente e esperar uma nova senha ser digitada
              delay(2000);
              displaySerial.print(limparTela);


Arquivos para download:
PDF



Postar um comentário

2 Comentários

  1. Olá bom dia tudo bem? Estou com dificuldade em fazer funcionar o matricial 4x4 o display 16x2 com o I2C o RFID é a Câmara. Gostei da sua ajuda para fazer todos esses modulos funcionar, tem como eu ligar todos de uma só vez no Arduino para funcionarem juntos.

    ResponderExcluir
  2. Poderia disponibilizar o link para a biblioteca do teclado matricial?

    ResponderExcluir