#include <Keypad.h> //Incluimos la librería del teclado
const int ROWS = 4; //Definimos el número de filas en el teclado
const int COLS = 4; //Definimos el número de columnas en el teclado
int Led_Verde = 11; //Establecemos el PIN 11 de la placa al led verde
int Led_Rojo = 12; //Establecemos el PIN 12 de la placa al led rojo
int Buzzer = 13; //Establecemos el PIN 13 de la placa al buzzer
//Definimos los caracteres que se obtendrán al pulsar cada botón del teclado
char teclas[ROWS][COLS] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
//Definimos los pines asociados a las filas y columnas del teclado
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
//Definimos una variable con la configuración definida anteriormente
Keypad keypad = Keypad(makeKeymap(teclas), rowPins, colPins, ROWS, COLS);
// Definimos las contraseñas de acceso para cada trabajador
char* clavesTrabajadores[] =
{
"D4664", "B9834", "C4681", "C1085", "A9703",
"A5347", "A7442", "B8788", "B4334", "B8588",
"B5280", "B4230", "C9770", "D6951", "D8454"
};
char claveIngresada[5]; // Variable que almacena la clave ingresada
int indice = 0; // Variable que indica la posición actual en la clave
void setup() // Función que se ejecuta una vez al iniciar el programa
{
Serial.begin(9600); // Inicializamos la comunicación con el monitor serie
pinMode (Led_Verde, OUTPUT); //Establecemos el led verde en modo de salida (Output)
pinMode (Led_Rojo, OUTPUT); //Establecemos el led rojo en modo de salida (Output)
pinMode (Buzzer, OUTPUT);//Establecemos el buzzer en modo de salida (Output)
}
void loop() // Función que se ejecuta en bucle continuo
{
char key = keypad.getKey(); // Obtenemos la tecla pulsada
if (key) // Si se ha pulsado una tecla del teclado...
{
claveIngresada[indice] = key; // Almacenamos la tecla pulsada en la clave
indice++; // Incrementamos el índice para pasar a la siguiente posición
Serial.print("* "); // Mostramos un asterisco en el monitor serie para indicar la pulsación
tone(Buzzer, 800); //Emite sonido del buzzer
delay(100);
noTone(Buzzer); //Buzzer silenciado
if (indice <= 2) //Apaga los leds después de cada intento de acceso
{
digitalWrite(Led_Verde, LOW);
digitalWrite(Led_Rojo, LOW);
}
if (indice == 5) // Si ya se han ingresado 5 caracteres...
{
claveIngresada[5] = '\0'; // Añadimos el carácter nulo al final de la cadena
// Comprobamos la clave ingresada
if (verificarClave(claveIngresada, clavesTrabajadores, 15))
{
Serial.println("--> ✅ Acceso autorizado ✅"); //Si la clave es correcta, mostramos "Acceso permitido"
digitalWrite(Led_Verde, HIGH);
digitalWrite(Led_Rojo, LOW);
}
else
{
Serial.println("--> ❌ Acceso denegado ❌"); //Si la clave es incorrecta, mostramos "Acceso denegado"
digitalWrite(Led_Verde, LOW);
digitalWrite(Led_Rojo, HIGH);
}
//Reiniciamos las variables para la entrada siguiente
indice = 0;
memset(claveIngresada, 0, sizeof(claveIngresada));
}
}
}
//Función para verificar si la clave ingresada coincide con alguna de las claves esperadas
bool verificarClave(char ingresada[], char* claves[], int numClaves)
{
for (int i = 0; i < numClaves; i++)
{
if (strcmp(ingresada, claves[i]) == 0)
{
return true; //Si encontramos una coincidencia, devolvemos true
}
}
return false; //Si no hay coincidencias, devolvemos false al final del bucle
}