#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
const byte FILAS = 4;
const byte COLUMNAS = 4;
char keys[FILAS][COLUMNAS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinsFilas[FILAS] = {2, 3, 4, 5};
byte pinsColumnas[COLUMNAS] = {6, 7, 8, A0};
Keypad keypad = Keypad(makeKeymap(keys), pinsFilas, pinsColumnas, FILAS, COLUMNAS);
Servo miServo;
const int pinLEDVerde = 10;
const int pinLEDRojo = 11;
const int pinBuzzer = 12;
const int pinPIR = A1;
const String claveCorrecta = "2580";
String claveIngresada = "";
int intentosFallidos = 0;
bool sistemaBloqueado = false;
unsigned long tiempoBloqueo = 0;
int contadorIntentosSerial = 0;
void mostrarPantallaInicial() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONTROL DE ACCESO");
lcd.setCursor(0, 1);
lcd.print("Ingrese Clave:");
lcd.setCursor(0, 2);
lcd.print("");
}
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(pinLEDVerde, OUTPUT);
pinMode(pinLEDRojo, OUTPUT);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinPIR, INPUT);
miServo.attach(9);
miServo.write(0);
mostrarPantallaInicial();
}
void loop() {
unsigned long tiempoActual = millis();
if (sistemaBloqueado) {
if (tiempoActual - tiempoBloqueo < 20000) {
static unsigned long ultimoParpadeo = 0;
static bool estadoRojo = LOW;
if (tiempoActual - ultimoParpadeo >= 500) {
ultimoParpadeo = tiempoActual;
estadoRojo = !estadoRojo;
digitalWrite(pinLEDRojo, estadoRojo);
}
static unsigned long ultimoSonido = 0;
if (tiempoActual - ultimoSonido >= 5000) {
ultimoSonido = tiempoActual;
tone(pinBuzzer, 440, 1000);
}
return;
} else {
sistemaBloqueado = false;
intentosFallidos = 0;
digitalWrite(pinLEDRojo, LOW);
mostrarPantallaInicial();
}
}
char tecla = keypad.getKey();
if (tecla) {
if (tecla == '#') {
if (claveIngresada.length() > 0) {
contadorIntentosSerial++;
if (claveIngresada == claveCorrecta) {
Serial.print("Intento ");
Serial.print(contadorIntentosSerial);
Serial.println(": Correcto");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ACCESO");
lcd.setCursor(0, 1);
lcd.print("AUTORIZADO");
digitalWrite(pinLEDVerde, HIGH);
miServo.write(90);
tone(pinBuzzer, 1000, 200);
delay(4800);
digitalWrite(pinLEDVerde, LOW);
miServo.write(0);
intentosFallidos = 0;
claveIngresada = "";
mostrarPantallaInicial();
} else {
Serial.print("Intento ");
Serial.print(contadorIntentosSerial);
Serial.println(": Incorrecto");
intentosFallidos++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CLAVE");
lcd.setCursor(0, 1);
lcd.print("INCORRECTA");
for (int i = 0; i < 3; i++) {
digitalWrite(pinLEDRojo, HIGH);
tone(pinBuzzer, 250, 200);
delay(200);
digitalWrite(pinLEDRojo, LOW);
delay(200);
}
claveIngresada = "";
if (intentosFallidos >= 3) {
Serial.println("Sistema Bloqueado");
sistemaBloqueado = true;
tiempoBloqueo = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SISTEMA");
lcd.setCursor(0, 1);
lcd.print("BLOQUEADO");
} else {
delay(1000);
mostrarPantallaInicial();
}
}
}
} else if (tecla == '*') {
if (claveIngresada.length() > 0) {
claveIngresada.remove(claveIngresada.length() - 1);
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 2);
for (size_t i = 0; i < claveIngresada.length(); i++) {
lcd.print("*");
}
}
} else {
if (claveIngresada.length() < 4) {
claveIngresada += tecla;
lcd.setCursor(claveIngresada.length() - 1, 2);
lcd.print("*");
}
}
}
if (!sistemaBloqueado && digitalRead(pinPIR) == HIGH) {
Serial.println("Movimiento Detectado");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MOVIMIENTO");
lcd.setCursor(0, 1);
lcd.print("DETECTADO");
delay(2000);
mostrarPantallaInicial();
}
}