#include <Wire.h> // Esto es para incluir la librería Wire para la comunicación I2C
#include <RTClib.h> // Esto es para incluir la librería RTClib para el manejo del RTC
RTC_DS3231 rtc; // Esto es para crear un objeto RTC_DS3231
const int NUM_FILAS = 4; // Esto es para definir el número de filas del teclado matricial
const int NUM_COLUMNAS = 4; // Esto es para definir el número de columnas del teclado matricial
char teclas[NUM_FILAS][NUM_COLUMNAS] = { // Esto es para definir las teclas en el teclado matricial
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
int pinesFilas[NUM_FILAS] = {9, 8, 7, 6}; // Esto es para definir los pines conectados a las filas del teclado matricial
int pinesColumnas[NUM_COLUMNAS] = {5, 4, 3, 2}; // Esto es para definir los pines conectados a las columnas del teclado matricial
char codigos[15][5] = { // Esto es para definir las contraseñas
"1111", "2222", "3333", "4444", "5555",
"6666", "7777", "8888", "9999", "0000",
"1234", "5678", "9876", "5432", "1357",
};
// Esto es para definir la información de los trabajadores
const int NUM_TRABAJADORES = 15;
const char* nombres[NUM_TRABAJADORES] = {"Juan", "María", "Pedro", "Ana", "Luis", "Sofía", "Diego", "Laura", "Carlos", "Elena", "Javier", "Lucía", "Miguel", "Valeria", "Pablo"};
const char* apellidos[NUM_TRABAJADORES] = {"Pérez", "Gómez", "López", "Martínez", "González", "Hernández", "Díaz", "Rodríguez", "Sánchez", "Romero", "Álvarez", "Fernández", "Vázquez", "Torres", "Jiménez"};
const int ids[NUM_TRABAJADORES] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; // Esto es para definir los IDs de los trabajadores
void setup() {
Serial.begin(9600); // Esto es para iniciar la comunicación serial con una tasa de baudios de 9600
Wire.begin(); // Esto es para iniciar la comunicación I2C
rtc.begin(); // Esto es para iniciar el módulo RTC
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Esto es para ajustar la fecha y hora del RTC (opcional, se puede usar para configurar la hora inicial)
}
void loop() {
DateTime now = rtc.now(); // Esto es para obtener la fecha y hora actual del RTC
static char claveIngresada[5]; // Esto es para almacenar la clave ingresada
static int indice = 0; // Esto es para rastrear la posición de la clave ingresada
// Escaneo del teclado matricial
for (int fila = 0; fila < NUM_FILAS; fila++) {
pinMode(pinesFilas[fila], OUTPUT); // Esto es para configurar la fila actual como salida
digitalWrite(pinesFilas[fila], LOW); // Esto es para establecer el nivel bajo en la fila actual
for (int columna = 0; columna < NUM_COLUMNAS; columna++) {
pinMode(pinesColumnas[columna], INPUT_PULLUP); // Esto es para configurar la columna actual como entrada con resistencia pull-up
if (digitalRead(pinesColumnas[columna]) == LOW) {
claveIngresada[indice++] = teclas[fila][columna]; // Esto es para leer la tecla presionada y agregarla a la clave ingresada
Serial.print("*"); // Esto es para enviar un asterisco al monitor serial
delay(200); // Esto es para evitar múltiples lecturas por una única tecla
while (digitalRead(pinesColumnas[columna]) == LOW) {} // Esto es para esperar a que se suelte la tecla
}
pinMode(pinesColumnas[columna], INPUT); // Esto es para restaurar la configuración de la columna
}
pinMode(pinesFilas[fila], INPUT); // Esto es para restaurar la configuración de la fila
}
if (indice == 4) {
bool accesoPermitido = false;
int idTrabajador = -1;
for (int i = 0; i < NUM_TRABAJADORES; i++) {
if (strcmp(claveIngresada, codigos[i]) == 0) {
accesoPermitido = true;
// Determinar el ID del trabajador
idTrabajador = ids[i];
break;
}
}
if (accesoPermitido && idTrabajador != -1) {
Serial.print(" Acceso permitido - "); // Esto es para indicar que se ha concedido el acceso
Serial.print("Nombre: "); // Esto es para indicar que se mostrará el nombre del trabajador
Serial.print(nombres[idTrabajador - 1]); // Esto es para imprimir el nombre del trabajador correspondiente al ID
Serial.print(", Apellido: "); // Esto es para indicar que se mostrará el apellido del trabajador
Serial.print(apellidos[idTrabajador - 1]); // Esto es para imprimir el apellido del trabajador correspondiente al ID
Serial.print(", ID: "); // Esto es para indicar que se mostrará el ID del trabajador
Serial.print(idTrabajador); // Esto es para imprimir el ID del trabajador
Serial.print(", Fecha y hora: "); // Esto es para indicar que se mostrará la fecha y hora de acceso
Serial.print(now.day()); // Esto es para imprimir el día actual
Serial.print('/'); // Esto es para imprimir el separador '/'
Serial.print(now.month()); // Esto es para imprimir el mes actual
Serial.print('/'); // Esto es para imprimir el separador '/'
Serial.print(now.year()); // Esto es para imprimir el año actual
Serial.print(" "); // Esto es para imprimir un espacio en blanco
Serial.print(now.hour()); // Esto es para imprimir la hora actual
Serial.print(':'); // Esto es para imprimir el separador ':'
Serial.print(now.minute()); // Esto es para imprimir los minutos actuales
Serial.println(); // Esto es para imprimir un salto de línea al final
} else {
Serial.println(" Acceso denegado"); // Esto es para indicar que se ha denegado el acceso
}
memset(claveIngresada, 0, sizeof(claveIngresada)); // Esto es para limpiar la clave ingresada para la siguiente entrada
indice = 0; // Esto es para reiniciar el índice para la próxima entrada
}
}