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
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 .
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 .
Para realização do projeto vai ser necessário:
- 1 Arduino Uno ou similar
- 1 Teclado matricial ( 4X4 )
- Visor LCD 16 x 2
- Leds verde e vermelho ( ou outra cor que o usuário preferir)
- Resitores de 220 ohm
- 1 potênciometro 10 k
Montagem do circuito
Siga os passos de montagem conforme a figura.
fonte: próprio autor
O código fonte
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!
boa noite, caso eu precise que seja resetado automaticamente
ResponderExcluirao inves de ter que precionar o D, como faço?