#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>
#include <Servo.h>
Servo servo1;
/* Funcion de configuracion de pines del modulo LCD/I2C
(Direccion,en,rw,rs,d4,d5,d6,d7,backlight,polaridad)*/
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte Filas = 4; //Cuatro filas
const byte Cols = 4; //Cuatro columnas
byte Pins_Filas[] = {13, 12, 11, 10};//Pines Arduino a las filasbyte
byte Pins_Cols[] = {9, 8, 7, 6}; // Pines Arduino a las columnas.
//no utilizar los pines 1 y 0 para no interferir en Rx y Tx
char Teclas [ Filas ][ Cols ] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
char codigoSecreto[4] = {'2','7','0','1'}; // Aqui va el codigo secreto
// Para cambiar el tamaño de la clave, solo hay que cambiar el tamaño del array
int posicion = 0; // necesaria para la clave
int cursor = 5; // posicion inicial de la clave en el LCD
int clave = 0; // para el LCD
int luz = 0; // para el LCD
int tiempo = 0; // para el LCD
int ledVerde = 2; // pin para el LED verde
int ledRojo = 3; // pin para el LED rojo
int buzzer = 4; // pin altavoz
Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);
int pinservo = 5; //pin para el servo
int pulsominimo = 580; //minimo de velocidad para el servo
int pulsomaximo = 2500; //maximo de velocidad para el servo
int anguloactive = -90; //angulo de activacion del servo
int angulodesactive = 84; //angulo de desactivacion del servo
int intento = 0; //contador de intentos de claves ingresadas
void setup()
{
Serial.begin(9600) ;
lcd.begin(16, 2); // inicializamos el LCD.
lcd.noBacklight(); // apagamos LCD
pinMode (ledVerde, OUTPUT);
pinMode (ledRojo, OUTPUT);
pinMode (buzzer, OUTPUT);
digitalWrite(ledRojo, HIGH); // encendemos el LED rojo
digitalWrite(ledVerde, LOW); // apagamos el verde
lcd.setCursor(0,0); // situamos el cursor en la posición 0 de la linea 0.
lcd.print("Introduzca Clave"); // escribimos en LCD
lcd.setCursor(6, 1); // cursor en la posicion 6 de la linea 1
servo1.attach(pinservo, pulsominimo, pulsomaximo); //se conecta el servo al pin asignado
}
void loop()
{char pulsacion = Teclado1.getKey() ; // leemos pulsacion
if (pulsacion != 0) //Si el valor es 0 es que no se ha pulsado ninguna tecla
{ // descartamos almohadilla y asterisco
if (pulsacion != '#' && pulsacion != '*' && clave==0)
{ lcd.print('*'); // imprimimos pulsacion
cursor++; // incrementamos el cursor
tone(buzzer,350); // tono de pulsacion
delay(200);
noTone(buzzer);
//--- Condicionales para comprobar la clave introducida -----------
// comparamos entrada con cada uno de los digitos, uno a uno
if (pulsacion == codigoSecreto[posicion])
posicion ++; // aumentamos posicion si es correcto el digito
if (posicion == 4)
{ // comprobamos que se han introducido los 4 correctamente
digitalWrite (3,HIGH); // encendemos LED
lcd.setCursor(0,0); // situamos el cursor en la pos 0 de la linea 0.
lcd.print(" Clave Correcta "); // escribimos en LCD
delay(200); // tono de clave correcta
tone(buzzer,500);
delay(100);
noTone(buzzer);
tone(buzzer,600);
delay(100);
noTone(buzzer);
tone(buzzer,800);
delay(100);
noTone(buzzer);
lcd.setCursor(6,1); // cursor en la posicion 6, linea 1
clave=1; // indicamos que se ha introducido la clave
digitalWrite(ledRojo,LOW); // apagamos el LED rojo
digitalWrite(ledVerde, HIGH); // encendemos el verde
servo1.write(anguloactive); //se activa el servo
intento=0; // el contador "intento" se reinicia
}
//--- En el caso de que este incompleta o no hayamos acertado ----------
if(cursor>8) // comprobamos que no pase de la cuarta posicion
{ cursor=5; // lo volvemos a colocar al inicio
posicion=0; // borramos clave introducida
lcd.setCursor(6,1);
lcd.print(" "); // borramos la clave de la pantalla
lcd.setCursor(0,0);
if(clave==0) // comprobamos que no hemos acertado
{ tone(buzzer,70,500);
delay(250); // tono de error
noTone(buzzer);
lcd.print("Clave Incorrecta"); // escribimos en LCD
lcd.setCursor(6,1); // cursor en la posicion 6, linea 1
intento++; // contador "intento" incrementa
if(intento >= 3) { //comprobamos que el contador "intento" es igual o supere la cantidad de 3 intentos
tone(buzzer,250); // tono de alarma
// Parpadeo de led rojo //
digitalWrite(ledRojo, HIGH);
delay(500);
digitalWrite(ledRojo, LOW);
delay(500);
digitalWrite(ledRojo, HIGH);
delay(500);
digitalWrite(ledRojo, LOW);
delay(500);
digitalWrite(ledRojo, HIGH);
delay(500);
digitalWrite(ledRojo, LOW);
delay(500);
digitalWrite(ledRojo, HIGH);
delay(500);
digitalWrite(ledRojo, LOW);
delay(500);
digitalWrite(ledRojo, HIGH);
delay(500);
digitalWrite(ledRojo, LOW);
delay(500);
digitalWrite(ledRojo, HIGH);
delay(500);
digitalWrite(ledRojo, LOW);
delay(500);
}
}
}
}
}
//--- Condicionales para encender o apagar el LCD --------------
if (pulsacion == '#' && luz==0)
{ // comprobamos tecla y encendemos si esta apagado
lcd.backlight(); // encendemos
luz=1; // indicamos que esta encendida
pulsacion =0; // borramos el valor para poder leer el siguiente condicional
}
if (pulsacion == '#' && luz==1)
{ // comprobamos tecla y estado
lcd.noBacklight(); // apagamos
luz=0; // indicamos que esta apagada
}
//--- Condicionales para resetear clave introducida -------------
if (pulsacion == '*')
{ // asterisco para resetear el contador
posicion = 0;
cursor = 5;
clave=0;
posicion=0;
lcd.setCursor(0,0); // situamos el cursor el la posición 2 de la linea 0.
lcd.print("Introduzca Clave"); // escribimos en LCD
lcd.setCursor(6,1); // situamos el cursor el la posición 6 de la linea 1.
lcd.print(" "); // borramos de la pantalla los numeros
lcd.setCursor(6,1); // situamos el cursor el la posición 6 de la linea 1.
digitalWrite(ledRojo,HIGH); // encendemos el LED rojo
digitalWrite(ledVerde, LOW); // apagamos el verde
servo1.write(angulodesactive); //se desactiva el servo
}
}