/*
Proyecto de Síntesis - Renie, Casey y Marc
Stucom 2023-2024
*/
#include <Keypad.h> //Librería del teclado
#include <RTClib.h> //Librería del RTC
#include <Servo.h> //Librería del servo
#include <LiquidCrystal_I2C.h> //Librería del LCD
RTC_DS1307 rtc; //Variable del RTC
Servo servo; //Variable para el servo
int abrir = 90; //Abrimos la cerradura
int cerrar = 180; //Cerramos la cerradura
LiquidCrystal_I2C lcd(0x27, 20, 4); //Definimos el teclado I2C
const uint8_t ROWS = 4; //Definimos el número de filas
const uint8_t COLS = 4; //Definimos el número de columnas
int Buzzer = 11; //Establecemos el pin 11 al Buzzer
int Led_Rojo = 12; //Establecemos el pin 12 al Led Rojo
int Led_Verde = 13; //Establecemos el pin 13 al Led Verde
char claveIngresada[5]; //Variable que guarda la clave que estamos introduciendo
int indice = 0; //Variable que va contando las posiciones de la contraseña
char teclas[ROWS][COLS] = //Matriz de las teclas del teclado, desde 0 a 3
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
uint8_t rowPins[ROWS] = {9, 8, 7, 6}; //Establecemos los pines que utilizan las filas
uint8_t colPins[COLS] = {5, 4, 3, 2}; //Establecemos los pines que utilizan las columnas
Keypad teclado = Keypad(makeKeymap(teclas), rowPins, colPins, ROWS, COLS); //Variable "teclado" que recoge los valores de las filas y columnas, junto con sus pines
//Tabla que guarda las claves de los 15 trabajadores
char* clavesTrabajadores[] =
{
"D4664", "B9834", "C4681", "C1085", "A9703",
"A5347", "A7442", "B8788", "B4334", "B8588",
"B5280", "B4230", "C9770", "D6951", "D8454"
};
//Estructura que limita el número de carácteres de los nombres y apellidos
struct Trabajador
{
char nombre[20];
char apellido[20];
};
//Tabla que guarda los nombres y apellidos de los trabajadores
Trabajador trabajadores[] =
{
{"Marc", "Lopez"},
{"Eduard", "Azagra"},
{"Patrick", "Esquibal"},
{"Casey", "Cleto"},
{"Renieboy", "Anicas"},
{"Sebastian", "Imitola"},
{"Neil", "Cueto"},
{"Subhan", "Abid"},
{"Alex", "Bohorquez"},
{"Jiahao", "Liu"},
{"Bryan", "Hernandez"},
{"David", "Castillo"},
{"Javier", "Givica"},
{"Arnau", "Gausachs"},
{"Oliver", "Sarrion"},
};
void setup()
{
Serial.begin(9600); //Conexión con la consola
lcd.init(); //Encendemos el circuito eléctrico que tiene el LCD I2C
lcd.backlight(); //Encendemos la luz del LCD I2C
rtc.begin(); //Encendemos el RTC
pinMode(Buzzer, OUTPUT); //Establecemos el Buzzer como output
pinMode(Led_Rojo, OUTPUT); //Establecemos el Led Rojo como output
pinMode(Led_Verde, OUTPUT); //Establecemos el Led Verde como output
servo.attach(10); //Establecemos el pin 10 al servo
servo.write(cerrar); //Cerramos la cerradura por si estuviese abierta
lcd.setCursor(6,0); //Ponemos el cursor del LCD en la 4ta posición
}
void loop()
{
char key = teclado.getKey(); //Creamos una variable para guardar la tecla del teclado pulsada
if (key) //Si pulsamos una tecla del teclado...
{
claveIngresada[indice] = key; //Guardamos la tecla en cuestión dentro de la variable de claveIngresada
indice ++; //Le sumamos 1 al indice para que pase a la siguiente posición de la contraseña
lcd.print("*"); //Hacemos que aparezca un asterisco por cada tecla pulsada
digitalWrite(Led_Verde, LOW); //Apagamos el led verde por si estaba encendido
digitalWrite(Led_Rojo, LOW); //Apagamos el led rojo por si estaba encendido
if (indice == 5) //Si ya hemos pulsado las 5 teclas de la contraseña...
{
claveIngresada[5] = '\0'; //Ponemos la variable que guarda la contraseña actual a 0
if (verificarClave(claveIngresada, clavesTrabajadores, 15)) //Si la clave que hemos introducido está en la tabla de contraseñas...
{
digitalWrite(Led_Verde, HIGH); //Encendemos el led verde
servo.write(abrir); //Abrimos la cerradura, pero solo durante 5 segundos
int idTrabajador = obtenerIdTrabajador(claveIngresada, clavesTrabajadores, 15);
mostrarInformacionAcceso(idTrabajador);
servo.write(cerrar); //Cerramos de nuevo la cerradura
digitalWrite(Led_Verde, LOW); //Apagamos el led verde
}
else //Si la contraseña no figura en la tabla de contraseñas, acceso denegado
{
lcd.clear(); //Borramos el mensaje
digitalWrite(Led_Rojo, HIGH); //Encendemos el led rojo
lcd.setCursor(5,0); lcd.print("Acceso"); //Mensaje de acceso denegado
lcd.setCursor(4,1); lcd.print("denegado!"); //Mensaje de acceso denegado
tone(Buzzer, 220); //Sonido de error emitido por el buzzer
delay(3000); //3 segundos de espera
noTone(Buzzer); //Silenciamos el buzzer
servo.write(cerrar); //Se cierra la cerradura
lcd.clear(); //Borramos el mensaje
digitalWrite(Led_Rojo, LOW); //Apagamos el led rojo
}
indice = 0; //Reiniciamos el indice a 0, para poder volver a introducir contraseñas
lcd.setCursor(6,0); //Ponemos el cursor del LCD en la 4ta posición
}
}
}
bool verificarClave(char ingresada[], char* claves[], int numClaves) //Verificamos si la clave introducida está entre las 15
{
for (int i = 0; i < numClaves; i++) //Bucle que provará nuestra contraseña entre las 15 que hay
{
if (strcmp(ingresada, claves[i]) == 0) //Si está, que de true
{
return true;
}
}
return false; //Si no, que de false
}
int obtenerIdTrabajador(char clave[], char* claves[], int numClaves) //Bucle para obtener el ID del trabajador
{
for (int i = 0; i < numClaves; i++) //Bucle que provará el ID del trabajador si coincide
{
if (strcmp(clave, claves[i]) == 0) //Si coincide la contraseña, sumará 1 hasta que llegue al ID correspondiente
{
return i + 1;
}
}
return -1; //Si no, restará 1
}
void mostrarInformacionAcceso(int idTrabajador) //Void para todo el mensaje que aparecerá en caso de que la contraseña sea correcta
{
DateTime now = rtc.now(); //Mira y guarda la hora del ordenador local
lcd.setCursor(5,0); lcd.print("Acceso"); //Mensaje de acceso autorizado
lcd.setCursor(3,1); lcd.print("autorizado!"); //Mensaje de acceso autorizado
delay(2000); //2 Segundos de espera
lcd.clear(); //Borramos el LCD
lcd.setCursor(0,0); //Cursor en carácter 0 y línea 0
lcd.print("#"); //Hashtag del ID
lcd.print(idTrabajador); //ID del trabajador
lcd.print(" "); //Espacio
lcd.print(trabajadores[idTrabajador - 1].nombre); //Nombre
lcd.print(" "); //Espacio
lcd.print(trabajadores[idTrabajador - 1].apellido); //
lcd.setCursor(0,1); //Cursor en carácter 0 y línea 1
lcd.print(now.day(), DEC); //Día
lcd.print('/'); //Barra
lcd.print(now.month(), DEC); //Mes
lcd.print('/'); //Barra
lcd.print(now.year(), DEC); //Año
lcd.print(" "); //Espacio
lcd.print(now.hour(), DEC); //Mostrar hora
lcd.print(':'); //Mensaje básico por consola de dos puntos
lcd.print(now.minute(), DEC); //Mostrar minuto
delay(4000); //4 Segundos de espera
lcd.clear(); //Borramos el LCD
lcd.print("Bienvenido/a!"); //Bienvenido/a!
delay(2000); //2 Segundos de espera
lcd.clear(); //Borramos el LCD
}