▷ Sistema de Control de Acceso con Tres Claves Alfanuméricas.

Sistema de seguridad para bloqueo de puertas con tres claves alfanuméricas utilizando Arduino. Esta es la versión 2.0, si quieren ver la primera versión hagan click aqui.

Este sistema se puede utilizar para controlar una cerradura electrónica la cual activaremos cuando cualquiera de las tres contraseñas haya sido ingresada correctamente.

Materiales:

  • Arduino UNO.
  • LCD 2x16.
  • Teclado matricial 4x4.
  • Resistencia 1kOhms.
  • Resistencia 330Ohms
  • Led RGB anodo común.

Diagrama de conexiones:

Funcionamiento:

Al momento de energizar el micro controlador nos aparecerá una un texto en el LCD el cual nos dice que seleccionemos una clave. Si presionamos la letra A de nuestro teclado, nos pide que ingresemos la clave de cuatro dígitos, si presionamos la letra B, la clave de cinco dígitos y si presionamos C, la clave de seis dígitos.

En cualquiera de los casos, si la clave ingresada coincide con la clave guardada en la memoria del Arduino: el led verde se activara por un segundo y luego se desactivará. Caso contrario: el led rojo titilara tres veces.

Explicación del código.

Primero agregamos las librerias para controlar el LCD y el teclado. También definimos los pines de conexión de los leds.

#include <Keypad.h>
#include <LiquidCrystal.h>
#define greenLed A4
#define redLed A5

Declaramos los pines de conexión para el LCD y para el teclado.

const int rs = 3, en = 4, d4 = A0, d5 = A1, d6 = A2, d7 = A3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const byte ROWS = 4; 
const byte COLS = 4; 
char keys[ROWS][COLS] = {
 {'1', '2', '3', 'A'},
 {'4', '5', '6', 'B'},
 {'7', '8', '9', 'C'},
 {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {12, 11, 10, 9};
byte colPins[COLS] = {8, 7, 6, 5};  
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  

Creamos un array de tipo string de 3 posiciones, en estas posiciones almacenaremos las contraseñas, de la siguiente manera.

String pass[3] = {"2A3B", "4C72D", "A8C5D3"};

En el void setup(), definimos los puertos de los leds como salidas e inicializamos el LCD. (Como yo estoy usando un led RGB de ánodo común, también definí que los leds tengan el estado lógico de "1").

void setup() {
 pinMode(greenLed, OUTPUT);
 pinMode(redLed, OUTPUT);
 digitalWrite(greenLed, 1);
 digitalWrite(redLed, 1);
 Serial.begin(9600);
 lcd.begin(16, 2);
}

void loop():

1.- Imprimimos en el LCD el mensaje de selección de clave.

2.- Llamamos al método getKey() del objeto Keypad, este método nos devuelve el caracter de la tecla pulsada, guardamos el caracter en la variable key.

3.- Verificamos si alguna tecla ha sido pulsada, si es así: entramos en un select case en el cual dependiendo de la tecla pulsada, llamamos a la función inputPassword() y le enviamos como parámetro una de las contraseñas que están almacenadas en el array previamente mencionado. Si se ha presionado una tecla que no sea 'A' 'B' o 'C', imprimimos "ERROR" en el LCD.

void loop() {
 //--- 1 ---
 lcd.setCursor(0, 0);
 lcd.print("SELECCIONE CLAVE");
 lcd.setCursor(2, 1);
 lcd.print("(A) (B) (C)");
 //--- 2 ---
 char key = keypad.getKey();
 //--- 3 ---
 if (key != NO_KEY) {
   switch (key) {
     case 'A':
       inputPassword(pass[0]);
       break;
     case 'B':
       inputPassword(pass[1]);
       break;
     case 'C':
       inputPassword(pass[2]);
       break;
     default:
       lcd.clear();
       lcd.setCursor(0, 0);
       lcd.print("ERROR");
       delay(600);
       lcd.clear();
   }
 }
 delay(10);
}

void inputPassword(String password)

En esta función tenemos lo siguiente:

1.- Declaramos una variable tipo string, en esta variable iremos almacenando en forma de string, el valor de las teclas que el usuario va pulsando.

2.- Esta variable la utilizamos para saltar una posición en el LCD para imprimir un nuevo caracter cada vez que el usuario presiona una tecla.

3.- Llamamos a la función printMsg(password.length()) y le enviamos como parámetro el valor de la longitud del string de la contraseña correspondiente, en esta función lo que hacemos es imprimir en el LCD el mensaje de "INGRESE LA CLAVE DE "n" DIGITOS", siendo n el valor de la longitud del string. Luego imprimimos en el LCD el texto "CLAVE".

void printMsg(int n) {
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("INGRESE LA CLAVE");
 lcd.setCursor(0, 1);
 lcd.print("DE ");
 lcd.print(n);
 lcd.print(" DIGITOS");
 delay(2000);
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("CLAVE:");
}

4.- Entramos en un ciclo while(), en este ciclo:

4.1.- Volvemos a llamar al método getKey() del objeto Keypad, esta vez almacenamos caracter en la variable keyPressed.

4.2.- Comprobamos si alguna tecla ha sido pulsada, si es así, entonces: añadimos a la variable keyString el valor del caracter de la tecla presionada, movemos el cursor un espacio utilizando la variable spaceJump, imprimimos el caracter '*', sumamos la variable spaceJump y ejecutamos la función blinkLed.

La función blinkLed(int led, byte pause, byte n) recibe tres parámetros: el primero es el led que queremos encender, el segundo la pausa para el parpadeo del led y el tercero es el numero de veces que queremos que el led parpadee.

void blinkLed(int led, byte pause, byte n){
 for(int i = 0; i < n; i++){
   digitalWrite(led,0);
   delay(pause);
   digitalWrite(led,1);
   delay(pause);
 }
}

5.- Llamamos a la función checkPassword(keyString, password), esta función recibe dos parámetros y también retorna un valor booleano. Los parámetros que recibe son: el string de caracteres que estamos ingresando y la contraseña respectiva. En esta función tenemos lo siguiente:

5.1.- Primero hacemos una comprobación para saber si la longitud del string de entrada (keyString) es igual a la longitud del string de la contraseña definida (password). Si esto es verdad entonces, comprobamos si el string de entrada (keyString) es igual a password (para esto utilizamos el metodo equals()),retornamos "true". Si el string de entrada (keyString) es igual a password entonces: imprimimos en el LCD; "CLAVE CORRECTA" y activamos el led verde por un segundo. Caso contrario: imprimimos en el LCD; "CLAVE INCORRECTA" y ejecutamos la función blinkLed.

5.2.- Retornamos "false".

boolean checkPassword(String keyString, String password){
 if (keyString.length() == password.length() ) { //5.1
   lcd.clear();
   lcd.home();
   if (keyString.equals(password)) {
     lcd.print("CLAVE CORRECTA");
     digitalWrite(greenLed, 0);
     delay(1000);
     digitalWrite(greenLed, 1);
   } else {
     lcd.print("CLAVE INCORRECTA");
     blinkLed(redLed,100,3);
     delay(1000);  
   }
   return true;
 }
 return false; // 5.2
}

6.- Comprobamos. Si la variable state == "true", rompemos el bucle while regresando así al void loop().

void inputPassword(String password) {
 String keyString = ""; // 1
 byte spaceJump = 0;// 2
 printMsg(password.length()); // 3
 while (true) { // 4
   char keyPressed = keypad.getKey();
   if (keyPressed != NO_KEY) {
     keyString += keyPressed;
     lcd.setCursor(spaceJump, 1);
     lcd.print('*');
     spaceJump++;
     blinkLed(greenLed,5,10);
   }
   boolean state = checkPassword(keyString, password); // 5
   delay(50);
   if (state == true) { // 6
     lcd.clear();
     break; 
   }
 }
}

Código completo:

0/Post a Comment/Comments