#include <RTClib.h> //Instalamos la librería del reloj
#include <Keypad.h> //Instalamos la librería del teclado
RTC_DS1307 rtc; //Creamos una variable para el RTC
const uint8_t ROWS = 4; //Establecemos que el teclado tiene 4 filas
const uint8_t COLS = 4; //Establecemos que el teclado tiene 4 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 teclas[ROWS][COLS] = //Matriz de las teclas del teclado
{
{'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 de las filas
uint8_t colPins[COLS] = {5, 4, 3, 2}; //Establecemos los pines de las columnas
Keypad teclado = Keypad(makeKeymap(teclas), rowPins, colPins, ROWS, COLS); //Variable que guarda las filas y columnas, junto con sus pines
//Claves de los 15 trabajadores
char* clavesTrabajadores[] =
{
"D4664", "B9834", "C4681", "C1085", "A9703",
"A5347", "A7442", "B8788", "B4334", "B8588",
"B5280", "B4230", "C9770", "D6951", "D8454"
};
//Estructura para almacenar el nombre y apellido de un trabajador
struct Trabajador
{
char nombre[20];
char apellido[20];
};
//Definimos los nombres y apellidos de los trabajadores
Trabajador trabajadores[] =
{
{"Marc", "López"},
{"Eduard", "Azagra"},
{"Patrick", "Esquibal"},
{"Casey", "Cleto"},
{"Renieboy", "Anicas"},
{"Sebastián", "Imitola"},
{"Neil", "Cueto"},
{"Subhan", "Abid"},
{"Alex", "Bohorquez"},
{"Jiahao", "Liu"},
{"Bryan", "Hernández"},
{"David", "Castillo"},
{"Javier", "Givica"},
{"Arnau", "Gausachs"},
{"Test", "Test2"},
};
char claveIngresada[5]; //Variable que guarda la clave que estamos introduciendo
int indice = 0; //Variable que guarda por cual numero de los 5
void setup()
{
Serial.begin(9600); //Conexión con la consola
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
}
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 para la siguiente posición del contador de la clave
Serial.print("* "); //Hacemos que aparezca un asterisco
digitalWrite(Led_Verde, LOW);
digitalWrite(Led_Rojo, LOW);
if (indice == 5) //Si ya hemos llegado a las 5 teclas pulsadas...
{
claveIngresada[5] = '\0'; //Ponemos la variable que guarda la contraseña actual a 0
if (verificarClave(claveIngresada, clavesTrabajadores, 15)) //Si la clave está entre las 15 de los trabajadores, accede al void "mostrarInformacionAcceso"
{
digitalWrite(Led_Verde, HIGH);
int idTrabajador = obtenerIdTrabajador(claveIngresada, clavesTrabajadores, 15);
mostrarInformacionAcceso(idTrabajador);
}
else //Si no, acceso denegado
{
digitalWrite(Led_Rojo, HIGH);
Serial.println("--> ❌ Acceso denegado ❌");
Serial.println("");
tone(Buzzer, 220);
delay(3000);
noTone(Buzzer);
}
indice = 0; //Reiniciamos el indice a 0
}
}
}
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
Serial.print("--> ✅ Acceso autorizado ✅"); //Mensaje de que el acceso está autorizado
Serial.println(""); //Enter
Serial.print("ID: "); //Mensaje básico por consola del ID
Serial.print(idTrabajador); //Mensaje básico por consola que contiene el ID del trabajador
Serial.print(" - "); //Mensaje básico por consola con un guión
// Buscamos el nombre y apellido del trabajador correspondiente al ID
if (idTrabajador >= 1 && idTrabajador <= sizeof(trabajadores) / sizeof(trabajadores[0]))
{
Serial.print(trabajadores[idTrabajador - 1].nombre);
Serial.print(" ");
Serial.print(trabajadores[idTrabajador - 1].apellido);
}
Serial.print(" // Fecha de acceso: "); //Mensaje básico por consola de la fecha de acceso
Serial.print(now.day(), DEC); //Mostrar día
Serial.print('/'); //Mensaje básico por consola de barra
Serial.print(now.month(), DEC); //Mostrar mes
Serial.print('/'); //Mensaje básico por consola de barra
Serial.print(now.year(), DEC); //Mostrar año
Serial.print(" - "); //Mensaje básico por consola de guión
Serial.print(now.hour(), DEC); //Mostrar hora
Serial.print(':'); //Mensaje básico por consola de dos puntos
Serial.print(now.minute(), DEC); //Mostrar minuto
Serial.print(':'); //Mensaje básico por consola de dos puntos
Serial.print(now.second(), DEC); //Mostrar segundo
Serial.println(); //Enter
Serial.println(""); //Enter
}