Translate

sábado, 24 de agosto de 2013

KEYPAD - Senha de acesso

Galera, depois de algum tempo, consegui!!! Nem acreditei quando funcionou.

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