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

LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C y tamaño de la LCD

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

byte pinesFilas[filas] = { 19, 18, 5, 17 }
byte pinesColumnas[columnas] = { 16, 4, 2, 15 };

Keypad teclado = Keypad(makeKeymap(teclas), pinesFilas, pinesColumnas, filas, columnas);

const String contrasena = "1234"; // Contraseña predefinida
String contrasenaIngresada;
int intentos = 0;
const int maxIntentos = 3
bool bloqueado = false;
bool puertaAbierta = false;
unsigned long tiempoBloqueo = 0;

const int buzzer = 14;
const int botonApertura = 33;
const int botonCierre = 32;
const int rele = 13;


void setup() {
  lcd.begin();
  lcd.backlight();
  pinMode(buzzer, OUTPUT);
  pinMode(rele, OUTPUT);
  pinMode(botonApertura, INPUT_PULLUP);
  pinMode(botonCierre, INPUT_PULLUP);
  lcd.clear();
  lcd.print("Hola ingrese");
  lcd.setCursor(0, 1);
  lcd.print("   clave ");
}

void loop() {
  char tecla = teclado.getKey();
  if (tecla != NO_KEY) {
    procesarTecla(tecla);
  }
//boten de apertura pin 13
  if (digitalRead(botonApertura) == LOW) {
          lcd.clear();
    lcd.print("Apertura interna");
    digitalWrite(rele, HIGH);
     puertaAbierta = true;
    tiempoBloqueo = millis();
    delay(2000);
  }
//boton de cierre pin 12
  if (digitalRead(botonCierre) == LOW) {
    lcd.clear();
    lcd.print("Cerrada interna");
    digitalWrite(rele, LOW);
     puertaAbierta = false;
    delay(2000);
  }
//tono de buzzer
  if (bloqueado) {
    tone(buzzer, 10);
    delay(1000);
    noTone(buzzer);
    delay(1000);
  }

  if (puertaAbierta && millis() - tiempoBloqueo >= 10000) {
    digitalWrite(rele, LOW);
    puertaAbierta = false;
  }
}
//teclado de reset de alarma
void procesarTecla(char tecla) {
  if (tecla == 'C') { // Reiniciar con la letra 'C'
    bloqueado = false;
    intentos = 0;
    contrasenaIngresada = "";
    lcd.clear();
    lcd.print("Hola ingrese");
    lcd.setCursor(0, 1);
    lcd.print("clave");
    return;
  }

  if (bloqueado) {
    return;
  }
//teclado de borrar codigo
  if (tecla == 'B') {
    contrasenaIngresada = "";
    lcd.clear();
    lcd.print("Hola ingrese");
    lcd.setCursor(0, 1);
    lcd.print("clave");
    return;
  }
//teclado de acceso de contrseña
  if (tecla == 'A') {
    if (contrasenaIngresada == contrasena) {
      lcd.clear();
      lcd.print("Bienvenido a su");
      lcd.setCursor(0, 1);
      lcd.print("hogar");
      digitalWrite(rele, HIGH);
      puertaAbierta = true;
      tiempoBloqueo = millis();
      contrasenaIngresada = "";
      intentos = 0;
      delay(2000);
    } else {
      intentos++;
      lcd.clear();
      lcd.print("Incorrecto");
      lcd.setCursor(0, 1);
      lcd.print("Intento " + String(intentos));
      contrasenaIngresada = "";
      if (intentos >= maxIntentos) {
        bloqueado = true;
      }
      delay(2000);
    }
    return;
  }

  contrasenaIngresada += tecla;
  lcd.clear();
  for (int i = 0; i < contrasenaIngresada.length(); i++) {
    lcd.print("*");
  }
}
NOCOMNCVCCGNDINLED1PWRRelay Module