KEYPAD - Senha de acesso
Galera, depois de algum tempo, consegui!!! Nem acreditei quando funcionou.
Segue abaixo o código fonte:
const int N_ line = 4; // define a quant de linhas
const int N_ column = 3; // define a quant de colunas
int check = 0; // garante que só 3 tecla compõe a senha
char password_default [3] = {'1', '5', '9'}; //senha de acesso
#define actionPin 10 // ativa acionamento se password ok
#define wrongPin 12 // LED de erro na senha
#define test_ led 13
#define start 11
int pause = 1000;
int solenoide = 3000;
int reset;
int count;
int debounce_Time = 25;
const char keymap[N_line][N_column] = { // montagem da matriz OBS.: const(constante) char(caracteres)
{ '1', '2', '3' } ,
{ '4', '5', '6' } ,
{ '7', '8', '9' } ,
{ '*', '0', '#' }
};
const int Pins_line[N_line] = { 2, 3, 4, 5 }; // define quais os pinos representam linha
const int Pins_column[N_column] = { 6, 7, 8 }; // define quais os pinos representam colunas
void setup()
{
Serial.begin(9600);
for (int row = 0; row < N_line; row++) //| configura as linhas com entrada
{ //|a cada loop do for, um valor é incrementado, ou seja row = 3
pinMode(Pins_line[row],INPUT); //|o Pins_line[3] será configurado com entrada
digitalWrite(Pins_line[row],HIGH); //|ativação do resistor de pull up
}
pinMode(actionPin,OUTPUT);
pinMode(wrongPin,OUTPUT);
pinMode(test_led,OUTPUT);
pinMode(start,INPUT);
pinMode(start,HIGH);
for (int column = 0; column < N_column; column++) //| configura as linhas com saída
{ //|a cada loop do for, um valor é incrementado, ou seja column = 3
pinMode(Pins_column[column],OUTPUT); //|o Pins_column[3] será configurado com saída
digitalWrite(Pins_column[column],HIGH); //|ativação o pinMode correspondente
}
}
void loop()
{
if(digitalRead(start) == 1 && check == 0)
{
digitalWrite(test_led,HIGH);
Serial.println(" ");
Serial.println("Waiting Password");
count=1;
reset=0;
}
if(count == 1)
{
while(check < 3 && reset == 0)
{
char key = getKey(); // criou sub rotina
if(key != 0)
{
if(key == password_default [check])
{
check += 1;
Serial.print(" X ");
}
else if(key != password_default [check])
{
Serial.println(" ");
Serial.println("Password Wrong -> wait 5 seconds . . .");
digitalWrite(test_led,LOW);
digitalWrite(wrongPin,HIGH);
delay(pause);
digitalWrite(wrongPin,LOW);
check = 0;
count = 0;
reset = 1;
}
}
}
}
if(check == 3)
{
digitalWrite(test_led,LOW);
digitalWrite(actionPin,HIGH);
delay(solenoide);
digitalWrite(actionPin,LOW);
check = 0;
count = 0;
}
}
////////////////////////////////////sub rotina 1//////////////////////////////////////////////
char getKey() // inicializando a subrotina
{
char key = 0; // define key em valor 0
for(int column = 0; column < N_column; column++) // teste o valor de N_column
{
digitalWrite(Pins_column[column],LOW); // DLG os pinos conforme valor column
for(int row = 0; row < N_line; row++) // teste o valor de N_column
{
if(digitalRead(Pins_line[row]) == LOW) // faz comparação, caso verdadeiro, inicia o comando
{
delay(debounce_Time); //delay 20ms
while(digitalRead(Pins_line[row]) == LOW); // valor lógico baixo,
key = keymap[row][column]; //mapeia a matriz
}
}
digitalWrite(Pins_column[column],HIGH); // aciona o pino corresp da coluna
}
return key; // traz o valor encontrado
}
///////////////////////////////////////////end//////////////////////////////////////////////////////
A programação não é difícil, o difícil foi fazer sem copiar, eu peguei a ideia e apliquei no que eu queria, esta sketch passou por 18 versões até rodar, penso em melhorar o programa criando algumas sub-rotinas e até usando a biblioteca de keypad do arduino, mas o meu desafio era justamente este, usar o minimo de recursos prontos.
Bom mas vamos lá. Se trata de um keypad sendo monitorado pelo Serial Monitor (em breve será um display de LCD) e que respeita a senha para ativar um dos pinos de saída.
Abaixo tem 2 vídeos o primeiro com o monitor e o segundo com a montagem.
Recomenda-se o uso de fones de ouvido.
Segue abaixo o código fonte:
const int N_ line = 4; // define a quant de linhas
const int N_ column = 3; // define a quant de colunas
int check = 0; // garante que só 3 tecla compõe a senha
char password_default [3] = {'1', '5', '9'}; //senha de acesso
#define actionPin 10 // ativa acionamento se password ok
#define wrongPin 12 // LED de erro na senha
#define test_ led 13
#define start 11
int pause = 1000;
int solenoide = 3000;
int reset;
int count;
int debounce_Time = 25;
const char keymap[N_line][N_column] = { // montagem da matriz OBS.: const(constante) char(caracteres)
{ '1', '2', '3' } ,
{ '4', '5', '6' } ,
{ '7', '8', '9' } ,
{ '*', '0', '#' }
};
const int Pins_line[N_line] = { 2, 3, 4, 5 }; // define quais os pinos representam linha
const int Pins_column[N_column] = { 6, 7, 8 }; // define quais os pinos representam colunas
void setup()
{
Serial.begin(9600);
for (int row = 0; row < N_line; row++) //| configura as linhas com entrada
{ //|a cada loop do for, um valor é incrementado, ou seja row = 3
pinMode(Pins_line[row],INPUT); //|o Pins_line[3] será configurado com entrada
digitalWrite(Pins_line[row],HIGH); //|ativação do resistor de pull up
}
pinMode(actionPin,OUTPUT);
pinMode(wrongPin,OUTPUT);
pinMode(test_led,OUTPUT);
pinMode(start,INPUT);
pinMode(start,HIGH);
for (int column = 0; column < N_column; column++) //| configura as linhas com saída
{ //|a cada loop do for, um valor é incrementado, ou seja column = 3
pinMode(Pins_column[column],OUTPUT); //|o Pins_column[3] será configurado com saída
digitalWrite(Pins_column[column],HIGH); //|ativação o pinMode correspondente
}
}
void loop()
{
if(digitalRead(start) == 1 && check == 0)
{
digitalWrite(test_led,HIGH);
Serial.println(" ");
Serial.println("Waiting Password");
count=1;
reset=0;
}
if(count == 1)
{
while(check < 3 && reset == 0)
{
char key = getKey(); // criou sub rotina
if(key != 0)
{
if(key == password_default [check])
{
check += 1;
Serial.print(" X ");
}
else if(key != password_default [check])
{
Serial.println(" ");
Serial.println("Password Wrong -> wait 5 seconds . . .");
digitalWrite(test_led,LOW);
digitalWrite(wrongPin,HIGH);
delay(pause);
digitalWrite(wrongPin,LOW);
check = 0;
count = 0;
reset = 1;
}
}
}
}
if(check == 3)
{
digitalWrite(test_led,LOW);
digitalWrite(actionPin,HIGH);
delay(solenoide);
digitalWrite(actionPin,LOW);
check = 0;
count = 0;
}
}
////////////////////////////////////sub rotina 1//////////////////////////////////////////////
char getKey() // inicializando a subrotina
{
char key = 0; // define key em valor 0
for(int column = 0; column < N_column; column++) // teste o valor de N_column
{
digitalWrite(Pins_column[column],LOW); // DLG os pinos conforme valor column
for(int row = 0; row < N_line; row++) // teste o valor de N_column
{
if(digitalRead(Pins_line[row]) == LOW) // faz comparação, caso verdadeiro, inicia o comando
{
delay(debounce_Time); //delay 20ms
while(digitalRead(Pins_line[row]) == LOW); // valor lógico baixo,
key = keymap[row][column]; //mapeia a matriz
}
}
digitalWrite(Pins_column[column],HIGH); // aciona o pino corresp da coluna
}
return key; // traz o valor encontrado
}
///////////////////////////////////////////end//////////////////////////////////////////////////////
Comentários
Postar um comentário