#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>
#include <Servo.h>

Servo SG2;

 /* Funcion de configuracion de pines del modulo LCD/I2C 
    (Direccion,en,rw,rs,d4,d5,d6,d7,backlight,polaridad)*/
 LiquidCrystal_I2C lcd(0x27, 20,4);
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] = {'1','2','3','4'}; // Aqui va el codigo secreto
char codigoSecreto2[4] = {'3','5','0','1'}; // Aqui va el codigo secreto
char clave[4];
// 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=7;      // posicion inicial de la clave en el LCD
       // 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);
void setup()
   {
    SG2.attach(5);
      Serial.begin(9600) ;
      lcd.begin(20,4);       // inicializamos el LCD.
      lcd.backlight();     // apagamos LCD
      pinMode (ledVerde,OUTPUT);
      pinMode (ledRojo, OUTPUT);
      pinMode (buzzer, OUTPUT);
      digitalWrite(ledRojo,HIGH); // encendemos el LED rojo
      digitalWrite(ledVerde, LOW); // apagamos el verde
      //SG2.write(0);
     lcd.setCursor(7,1);     // situamos el cursor el la posición 2 de la linea 0.
      lcd.print("WELCOME "); // escribimos en LCD
      delay(2000);
      lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Sistema de Seguridad");
       lcd.setCursor(6,1);
      lcd.print("Grupo #2");
      lcd.setCursor(7,2);
      lcd.print("5 STC");
      delay(3000);
      lcd.clear();
      PantallaInicio();

    }
void PantallaInicio(){
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Introduzca");
      lcd.print(" el");      
      lcd.print(" pin:  ");
      lcd.setCursor(6,2);
      lcd.print("{____}");
      //lcd.setCursor(7,2);
      

}

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[cursor-7]= pulsacion;
            lcd.setCursor(cursor,2);
            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((clave[0]== codigoSecreto[0]&& clave[1]== codigoSecreto[1]&& clave[2]== codigoSecreto[2]&& clave[3]== codigoSecreto[3])||(clave[0]== codigoSecreto2[0]&& clave[1]== codigoSecreto2[1]&& clave[2]== codigoSecreto2[2]&& clave[3]== codigoSecreto2[3]))
       {
        cursor=7;
        lcd.clear();
        lcd.setCursor(0,0);      // situamos el cursor el la pos 0 de la linea 0.
         lcd.print(" Password Correcto!"); 
            SG2.write(180);
             digitalWrite(ledRojo,LOW); // apagamos el LED rojo
         digitalWrite(ledVerde, HIGH); // encendemos el verde
         lcd.setCursor(0,2);      // situamos el cursor el la pos 0 de la linea 0.
         lcd.print("   Puerta Abierta!"); 
         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);
         delay(5000);
        SG2.write(90);
        lcd.setCursor(3,2);      // situamos el cursor el la pos 0 de la linea 0.
         lcd.print("Puerta Cerrada!"); 
        digitalWrite(ledRojo,HIGH); 
         digitalWrite(ledVerde, LOW); 
         delay(2000);
         clave[0] = 0;
         clave[1] = 0;
         clave[2] = 0;
         clave[3] = 0;
         PantallaInicio();
        // comprobamos que se han introducido los 4 correctamente
        
        }
      
     
     if(cursor>10)        // comprobamos que no pase de la cuarta posicion
       {   cursor=7;     // lo volvemos a colocar al inicio
           //posicion=0;           // borramos clave introducida
           lcd.setCursor(0,0);
           lcd.print("Password Incorrecto!");         // borramos la clave de la pantalla
           lcd.setCursor(6,2);
            lcd.print("      ");
            delay(200);                           // tono de clave correcta
         tone(buzzer,500);
         delay(200);
         noTone(buzzer);
         tone(buzzer,300);
         delay(200);
         noTone(buzzer);
         tone(buzzer,200);
         delay(200);
         noTone(buzzer);
           delay(3000);
            clave[0] = 0;
         clave[1] = 0;
         clave[2] = 0;
         clave[3] = 0;
           PantallaInicio();
        }
     }
   } 

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

 
 }