#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>
int cuadro=7;
int fila=0;
char pass[4]={'1','6','2','A'};
char pass1[4]={'5','2','3','4'};
char pass2[4]={'4','3','2','1'};
int buena=0;
int intento=1;
int precionadas=0;
#define Ledazul A3
#define Ledrojo A4

Servo servo11;

const byte filas=4;
const byte cols=4;

char llaves[filas][cols]={
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte filapins[filas]={3,2,1,0};
byte colpins[cols]={7,8,5,4};

Keypad teclado=Keypad(makeKeymap(llaves),filapins,colpins,filas,cols);

LiquidCrystal_I2C lcd(0x27,16,2);

void setup()
{
 lcd.init();
 lcd.backlight();
 servo11.attach(6); 
  //lcd.begin(20, 3);
  lcd.setCursor(0,0);
  lcd.print("   Bienvenido");
  lcd.setCursor(0,1);
  lcd.print("Digite su clave");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("D = Tecla enter");
  lcd.setCursor(0,1);
  lcd.print("C = Tecla borrar");
  pinMode(Ledazul, INPUT_PULLUP);
  pinMode(Ledrojo, INPUT_PULLUP);
  pinMode(A5, INPUT_PULLUP);

for(int pos=0;pos<3;pos++){
  lcd.scrollDisplayRight();
  delay(100);
}
for(int pos=0;pos<3;pos++){
  lcd.scrollDisplayLeft();
  delay(100);
}
  delay(3000);
  lcd.clear();
}  
void loop()
{
  //digitalWrite(Ledazul, HIGH);
  if (digitalRead(A5) == LOW){
  servo11.write(0);
  digitalWrite(Ledazul, HIGH);
  digitalWrite(Ledrojo, LOW);
  delay(7000);
  servo11.write(90);
  digitalWrite(Ledazul, LOW);
  digitalWrite(Ledrojo, HIGH);
}
  int conteo=10;
  
  lcd.setCursor(0,0);
  lcd.print("Digite su Clave:");
  char tecla=teclado.getKey();
  lcd.display();
  
  if(tecla){
    precionadas++;
    lcd.setCursor(cuadro,1);
    
    if(precionadas<=4){lcd.print("*");}
    
  if(precionadas<=4 and cuadro==7 and (pass[0]==tecla or pass1[0]==tecla or pass2[0]==tecla) ){
   buena++;
  }
  if(precionadas<=4 and cuadro==8 and buena>0 and (pass[1]==tecla or pass1[1]==tecla or pass2[1]==tecla)){
   buena++;
  }
  if(precionadas<=4 and cuadro==9 and buena>1 and (pass[2]==tecla or pass1[2]==tecla or pass2[2]==tecla)){
   buena++;
  }
  if(precionadas<=4 and cuadro==10 and buena>2 and (pass[3]==tecla or pass1[3]==tecla or pass2[3]==tecla)){
   buena++;
  }
   cuadro++;
  }
  if(tecla=='C'){
  precionadas=0;
    lcd.clear();  
    lcd.setCursor(0,1);
    cuadro=7;
    buena=0;
  }
  if(tecla=='D'){
    precionadas=0;
    if(buena==4){
    lcd.clear();
  servo11.write(0);
  digitalWrite(Ledrojo, LOW);
  digitalWrite(Ledazul, HIGH);
  lcd.setCursor(2,1);
  lcd.print("Puede pasar");
  PORTC= 1<<0;
  delay(2000);
  PORTC= 0<<0;
  delay(5000);
  servo11.write(90);
  digitalWrite(Ledrojo, HIGH);
  digitalWrite(Ledazul, LOW);
  lcd.clear();
  cuadro=7;
  buena=0;}
    else{
	lcd.clear();
	lcd.setCursor(5,1);
  lcd.print("Error");
    intento++;
    delay(1000);
	lcd.setCursor(0,0);
	lcd.print("Intento#");
	lcd.setCursor(9,0);
	lcd.print(intento);
    delay(1000);
  	lcd.clear();
	cuadro=7;
	buena=0;
    }
    if(intento>3){
  while(conteo!=0){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Sistema");
    lcd.setCursor(0,1);
    lcd.print("Bloqueado");
    lcd.setCursor(12,1);
   	lcd.print(conteo);
   	delay(1000);
  	conteo--;
 }
  intento=0;
  lcd.clear();
}
}
}