Toque no número: (18) 98206-3002 whatsapp

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

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);

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


Definição da senha

//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);

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.
 


Setup

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:");

}


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:”)


Loop

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

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

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



Loop – Switch Parte 1

 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;


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.



Loop – Switch Parte 2

//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;



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.



Loop – Switch Parte 3

  //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);



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.





Arquivos para download:


PDF

Nenhum comentário:

Tecnologia do Blogger.