#include <LiquidCrystal_I2C.h> // Incluir la libreria antes instalada
// Configurar el tiempo de LCD que se va a usar con la intrucción 
int Columnas = 16;
int Filas = 2;
LiquidCrystal_I2C lcd(0x27, Columnas, Filas);  // configuración del LCD a usar(dirección, Columnas, filas) 
int fila1=19;  // filas del teclado matricial 
int fila2=18;
int fila3=5;
int fila4=17;
int col1=16; // columnas del teclado matricial
int col2=4;
int col3=2;
int col4=15;
int LED1=13; //Declaración del puerto en cada posicion para cada led
int LED2=12;
int LED3=14;
int key;
int contador=2;
int tecla_leida;
int teclado_listo;
int rebote(int tecla);
const String password = "521628";
String inputPassword = "";
int intentos = 0;
const int intentosMaximos = 3;
void setup() {
  Serial.begin(9600);
    lcd.init(); // Se inicializa el LCD                    
  lcd.backlight(); // Controla si se enciende o no la Luz de fondo
  pinMode(fila1, OUTPUT); // Cambiado de INPUT a OUTPUT
  pinMode(fila2, OUTPUT);
  pinMode(fila3, OUTPUT);
  pinMode(fila4, OUTPUT);
  pinMode(col1, INPUT); // Cambiado de OUTPUT a INPUT
  pinMode(col2, INPUT);
  pinMode(col3, INPUT);
  pinMode(col4, INPUT);
  pinMode(LED1, OUTPUT); // Declaracion de pin para cada salida
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  
}
void loop(){
   lcd.setCursor(2,0);
   lcd.print("Por:");
   lcd.setCursor(0,1);
   lcd.print("Sergio Y Victor");
   delay(2000);
   lcd.clear();
   lcd.setCursor(1,0); // se coloca el curso en la primera posición
   lcd.print("** LCD 12C **"); // se imprime el mensaje en el LCD
   lcd.setCursor(1,1);
   lcd.print("***Teclado***");
   delay(3000);
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Ingresar Clave:"); 
   lcd.setCursor(0,1);
 
   while(1){
    key=teclado();
    if (key!=55){
     if (key != '*') { // Si la tecla presionada no es "*", entonces se agrega a la contraseña
    inputPassword += key; // Agrega la tecla presionada a la variable inputPassword
    lcd.setCursor(inputPassword.length()-1,1); // Establece la posición del cursor en la columna actual y la fila 1
    lcd.print("*"); // Imprime el asterisco en pantalla
    }  
 if (inputPassword.length() == 6) { // Si se han ingresado 6 dígitos para la contraseña
    delay(500);
    lcd.clear(); // Espera 500ms para que el usuario suelte el último botón presionado
    if (inputPassword == password) { // Si la contraseña ingresada es igual a la contraseña predeterminada
      digitalWrite(LED1, HIGH); // Enciende el LED verde
      lcd.clear(); // Limpia la pantalla del LCD
      lcd.setCursor(0,0); // Establece la posición del cursor en la columna 0 y la fila 0
      lcd.print("Clave Correcta");
      lcd.setCursor(0,1); // Establece la posición del cursor en la columna 0 y la fila 0
      lcd.print("Tototosususu");
      delay(20000);
    }
    else { // Si la contraseña ingresada es diferente a la contraseña predeterminada
      digitalWrite(LED3, HIGH); // Enciende el LED rojo
      lcd.clear(); // Limpia la pantalla del LCD
      lcd.setCursor(0,0); // Establece la posición del cursor en la columna 0 y la fila 0
      lcd.print("Clave Incorrecta");
      lcd.setCursor(0,1); // Establece la posición del cursor en la columna 0 y la fila 0
      lcd.print(intentos+1);
      lcd.setCursor(3,1); // Establece la posición del cursor en la columna 0 y la fila 0
      lcd.print("de 3 intentos");
      delay(1000);
      intentos++;
      if (intentos >= intentosMaximos) {
      lcd.clear();
      lcd.print("!!!!SISTEMA!!!!");
      lcd.setCursor(0,1);
      lcd.print("!!!BLOQUEADO!!!");
      digitalWrite(LED2, HIGH);
      while (true) {
        digitalWrite(LED1, HIGH);
        delay(500);
        digitalWrite(LED1, LOW);
        digitalWrite(LED3, HIGH);
        delay(500);
        digitalWrite(LED3, LOW);
      }
    } // Imprime en pantalla "Clave Incorrecta"
    }
    inputPassword = ""; // Reinicia la variable inputPassword
    delay(1000); // Espera 1 segundo antes de continuar
    lcd.clear(); // Limpia la pantalla del LCD
    lcd.setCursor(0,0); // Establece la posición del cursor en la columna 0 y la fila 0
    lcd.print("Ingresar clave: "); // Imprime en pantalla el mensaje "Ingrese clave:"
    digitalWrite(LED1, LOW); // Apaga el LED verde
    digitalWrite(LED3, LOW);
 }
   }
   }  
}
int teclado()
{ 
  int valor=55;
  digitalWrite(fila1, HIGH);
  digitalWrite(fila2, LOW);
  digitalWrite(fila3, LOW);
  digitalWrite(fila4, LOW);
  delay(50);
    if(digitalRead(col1)==HIGH) valor=1;
    if(digitalRead(col2)==HIGH) valor=2;
    if(digitalRead(col3)==HIGH) valor=3;
    if(digitalRead(col4)==HIGH) valor=15;
    
  digitalWrite(fila1, LOW);
  digitalWrite(fila2, HIGH);
  digitalWrite(fila3, LOW);
  digitalWrite(fila4, LOW);
  delay(50);
    if(digitalRead(col1)==HIGH) valor=4;
    if(digitalRead(col2)==HIGH) valor=5;
    if(digitalRead(col3)==HIGH) valor=6;
    if(digitalRead(col4)==HIGH) valor=14;
  digitalWrite(fila1, LOW);
  digitalWrite(fila2, LOW);
  digitalWrite(fila3, HIGH);
  digitalWrite(fila4, LOW);
  delay(50);
    if(digitalRead(col1)==HIGH) valor=7;
    if(digitalRead(col2)==HIGH) valor=8;
    if(digitalRead(col3)==HIGH) valor=9;
    if(digitalRead(col4)==HIGH) valor=13;
  digitalWrite(fila1, LOW);
  digitalWrite(fila2, LOW);
  digitalWrite(fila3, LOW);
  digitalWrite(fila4, HIGH);
  delay(50);
    if(digitalRead(col1)==HIGH) valor=10;
    if(digitalRead(col2)==HIGH) valor=0;
    if(digitalRead(col3)==HIGH) valor=11;
    if(digitalRead(col4)==HIGH) valor=12;
teclado_listo=rebote(valor);
if (teclado_listo==1) return(valor);
 else return(55);
}
int rebote(int tecla){
int bandera;
  
if (tecla==55) return(0);
  else {
    contador--;
if(contador==0){
  contador=4;
  bandera=1;
  tecla_leida=tecla;
}
else{
  bandera=0;
}
return(bandera);
}
}