#include <Keypad.h>
#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
RTC_DS3231 rtc;
Servo servoMotor;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int ROWS = 4;
const int COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
const int ledVerdePin = 12;
const int ledRojoPin = 11;
const int buzzerPin = 10;
const int servoPin = 13;
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
char* claves[] = {"2056", "6189", "3742", "1590", "8364", "4028", "7913", "4567", "9831", "2475", "5306", "1087", "6749", "3128", "8902"};
struct Trabajador {
const char* nombre;
const char* apellido;
};
Trabajador trabajadores[] = {
{"Edgar", "Herranz"},
{"2", "dos"},
{"3", "tres"},
{"4", "quatro"},
{"5", "cinco"},
{"6", "sies"},
{"7", "siete"},
{"8", "ocho"},
{"9", "nueve"},
{"10", "diez"},
{"11", "once"},
{"12", "doce"},
{"13", "trece"},
{"14", "catorce"},
{"15", "quinze"}
};
void setup() {
lcd.init();
lcd.backlight();
pinMode(ledVerdePin, OUTPUT);
pinMode(ledRojoPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
servoMotor.attach(servoPin);
if (!rtc.begin()) {
lcd.print("Error RTC");
while (1);
}
if (rtc.lostPower()) {
lcd.print("Ajustando hora");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
lcd.clear();
lcd.print("Contrasena:");
char claveIngresada[5];
int indice = 0;
while (indice < 4) {
char tecla = keypad.getKey();
if (tecla) {
claveIngresada[indice] = tecla;
lcd.setCursor(indice, 1);
lcd.print("*");
indice++;
delay(200);
}
}
claveIngresada[indice] = '\0';
bool accesoConcedido = false;
int idTrabajador = -1;
for (int i = 0; i < 15; i++) {
if (strcmp(claveIngresada, claves[i]) == 0) {
accesoConcedido = true;
idTrabajador = i;
break;
}
}
if (accesoConcedido) {
DateTime now = rtc.now();
digitalWrite(ledVerdePin, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("\Contrasena correcta");
lcd.setCursor(0, 1);
lcd.print("\Trabajador ");
lcd.print(idTrabajador + 1);
servoMotor.write(90);
delay(100);
delay(100);
servoMotor.write(180);
delay(1500);
lcd.clear();
lcd.print("\Bienvenido");
lcd.setCursor(0, 1);
lcd.print(trabajadores[idTrabajador].nombre);
lcd.print("\ ");
lcd.print(trabajadores[idTrabajador].apellido);
delay(2000);
lcd.clear();
lcd.print("Fecha y hora: ");
lcd.setCursor(0, 1);
lcd.print(now.year(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.day(), DEC);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute());
delay(1500);
lcd.clear();
servoMotor.write(90);
digitalWrite(ledVerdePin, LOW);
} else {
lcd.clear();
lcd.print("Acceso denegado");
digitalWrite(ledRojoPin, HIGH);
tone(buzzerPin, 1000, 3000);
delay(3000);
digitalWrite(ledRojoPin, LOW);
noTone(buzzerPin);
}
delay(1000);
}