sábado, 25 de fevereiro de 2017

Teclado Matricial

Teclado Matricial



O teclado matricial de membrana é um componente bastante utilizado em projeto que visam a necessidade de entrada de dados, como inserção de senhas alfanuméricas (limitando - se até a letra D) ou outros tipos de dados numéricos.
Sua membrana é formada por botões em sequência disposto em forma de matriz e divididos em linhas e colunas. A cada botão acionado faz - se acionar uma conexão entre linha e coluna correspondente informando ao microcontrolador a tecla ou sequência de teclas informada pelo usuário.

fonte: google sketchup





É bastante comum encontrar no mercado especializado de eletrônicos teclados matriciais de membrana de 4X3 e 4X4, cabendo ao usuário especificar qual o melhor modelo se adequa ao projeto.



Pinos do teclado matricial

Disponibilizado conforme a figura abaixo, as chaves do teclado matricial formam conexões entra as linhas e colunas correspondentes.

fonte: tutodonerd

Conforme o usuário necessitar, o acionamento de uma tecla faz a conexão necessária entra a linha e a coluna correspondente.


fonte: próprio autor

Integrando Arduino com teclado matricial

Circuito de ligação

Para a integração do Arduino com o teclado matricial vai ser utilizado uma membrana 4X4 e vai ser testado todas as chaves para comprovar o funcionamento correto do teclado. Com o componente em perfeito funcionamento deve ser implementado em um pequeno projeto.

O Arduino e o teclado devem ser conectados conforme demonstrado.


fonte: próprio autor

O código fonte

Feito as conexões, copie e cole o código na IDE do seu Arduino e  teste usando o monitor serial da plataforma para verificar o funcionamento das teclas.

/*
//==Codigo teste teclado matricial//
//mecatronizando@gmail.com//
*/

#include <Keypad.h>   //Biblioteca
const byte numRows=4; // linhas
const byte numCols=4; // colunas

char teclado [numRows][numCols]= // Definir as teclas
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'},
};

byte rowPins[numRows] = {9,8,7,6}; // Pinos digitais relacionados as linhas.
byte colPins[numCols] = {5,4,3,2}; // Pinos digitais relacionados as colunas.

Keypad meuteclado = Keypad(makeKeymap(teclado), rowPins, colPins, numRows, numCols);

void setup(){
  Serial.begin(9600);
}
void loop(){
  char keypressed = meuteclado.getKey();
  if(keypressed !=  NO_KEY)
{
Serial.println(keypressed); //Escreve na serial
  }
}







Depois de compilado, deve ser exibido no monitor serial o valor correspondente a tecla escolhida pelo usuário.



fonte: próprio autor

Senha de acesso

No projeto apresentado deve ser inserido uma combinação numérica que informa ao usuário permissão ou não de acesso a qualquer sistema.
No exemplo a senha de acesso é bem simples, a sequência 1,2,3 e 4. A tecla D (delete), limpa o visor LCD para que a senha seja corrigida ou caso seja necessária a inserção novamente .
Siga os passos de montagem conforme a figura.


fonte: próprio autor


O código fonte



No código fonte do projeto, é possível alterar a senha conforme a necessidade do usuário, está informado em combinação qual o numero de caracteres vão ser necessários para a senha e é preciso que a senha no código fonte seja inserido conforme a tabela ASCII para que o teclado possa ler, abaixo na tabela é possível ver a sequência 49, 50, 51 e 52 utilizada e está relacionada com 1, 2, 3 e 4.



fonte: internet

Copie e cole na IDE do Arduino o código abaixo e teste seu funcionamento.

/*
//==Acesso com senha teclado matricial===//
//mecatronizando@gmail.com//
Elaborado por Tony Emerson Marim
25/02/2017
*/

#include<Keypad.h>
#include <LiquidCrystal.h>

const int combinacao = 4;
int rightnumber[combinacao] = {49, 50, 51, 52};//this codes for 1,2,3,4 in ASCII. Had to use it because the library stores the input in decimal ASCII intead of a number.


int novonumero[combinacao];
char numero[combinacao];
int right = 0;
int verde = A1;
int verm = A2;
int novacomb = 0;
byte fulllcd[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111,};
int novacombfinal = 0;
int kposicao = 0;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'#','0','*','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal lcd(13,12,11,10,1,0);
void setup() {
  // put your setup code here, to run once:
 // Serial.begin(9600);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  lcd.createChar(0, fulllcd);
  lcd.begin(16,2);
  lcdstartup();
}

void loop() {
  // put your main code here, to run repeatedly:
  char k = keypad.getKey();
  if(k != 0){ //if you press something
   if(k == 68){
    kposicao = 0;
    lcdstartup();
  }
  else{
    numero[kposicao] = k; //save number in array
    kposicao++; //add to the combination digit position
    lcd.setCursor(kposicao - 1,1);
    lcd.print("*"); //writes a * each time you enter in a charcter
  delay(50);  //delay just cause i can
  if(kposicao == combinacao){ //checks if we pressed 4 numbers
   kposicao = 0;  //sets array write position to 0
   for(int g=0;g<combinacao;g++){//if each digit is right, add to the variable "right"
    if(numero[g] == rightnumber[g]){ right++;} //checks if all inputed digits are right
    }
    if(right == combinacao){
      rightaction();
      rightlcd();
      right = 0;
      }
    else{
      wrongaction();
      wronglcd();
      right = 0;
      }
   delay(100);
  }
  }
  }
}
void lcdstartup(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Combinacao :");
}
void lcdenter(){
  lcd.clear();
  lcd.print("Inserir novo :");
}
void lcdgranted(){
 lcd.clear();
 lcd.print("*****ACESSO******");
 lcd.setCursor(0,1);
 lcd.print("****PERMITIDO*****");
}
void rightlcd(){
 lcdgranted();
 while(novacombfinal == 0){
  delay(10);
  char o = keypad.getKey();
  if(o != 0){
    if(o == 67){
      digitalWrite(verde,LOW);
      lcdenter();
      while(novacomb == 0){
      entnovocod();}
      novacomb = 0;
    }
    if(o == 68){
      novacombfinal = 1;
      digitalWrite(verde,LOW);
    }
  }
  }
  novacombfinal = 0;
 lcd.clear();
 lcdstartup();
}
void entnovocod(){
 char novak = keypad.getKey();
 if(novak != 0){
    novonumero[kposicao] = novak;
    kposicao++;
    lcd.setCursor(kposicao,1);
    lcd.print(novak);
    if(novak == 68){
    lcd.setCursor(0,1);
    lcd.print("        ");
    kposicao = 0;
    }
    if(kposicao == combinacao){
      lcd.setCursor(kposicao + 1,1);
      lcd.write(byte(0));
      delay(1000);
      kposicao = 0;
      checknovocod();
    }
 }
}
void checknovocod(){
  lcd.clear();
  lcd.print("Voce tem certeza ?");
  while(novacomb == 0){
    char novac = keypad.getKey();
    if(novac != 0){
      if(novac == 65){
        lcd.clear();
        lcd.print("Novo cod.");
        lcd.setCursor(0,1);
        lcd.print("Aceito");
        novacomb = 1;
        novacombfinal = 1;
        for(int j=0;j<combinacao;j++){
          novonumero[j] = novonumero[j];
          }
          kposicao = 0;
          delay(1500);
      }
      if(novac == 66){
        delay(10);
        lcdgranted();
        novacomb = 1;
      }
    }
  }
}
void wronglcd(){
lcd.clear();
 lcd.print("*****ACESSO******");
 lcd.setCursor(0,1);
 lcd.print("*****NEGADO*****");
 while(novacombfinal == 0){
  delay(10);
  char o = keypad.getKey();
  if(o != 0){
    if(o == 68){
      novacombfinal = 1;
    }
  }
  }
  novacombfinal = 0;
 lcd.clear();
 lcdstartup();
 digitalWrite(verm,LOW);
}

void rightaction(){
      digitalWrite(verde,HIGH);
      digitalWrite(verm,LOW);
}
void wrongaction(){
      digitalWrite(verm,HIGH);
      digitalWrite(verde,LOW);
}


No vídeo é possível ver o comportamento do projeto, montado conforme o esquema.




Gostou?


Se for necessário baixe todos os arquivos e bibliotecas AQUI!

Bons Estudos!





Um comentário:

  1. boa noite, caso eu precise que seja resetado automaticamente
    ao inves de ter que precionar o D, como faço?

    ResponderExcluir