#include <Keypad.h> // Incluye la libreria Keypad.h
const byte Rows = 4; // La variable constante 'Rows' tiene el valor de 4 que son las filas
const byte Cols = 3; // La variable constante 'Cols' tiene el valor de 3 que son las columnas
char keys[Rows][Cols] = { // Crea la matriz con los caracteres del teclado
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[Rows] = {9, 8, 7, 6}; // Indica los pines conectados a las filas
byte colPins[Cols] = {5, 4, 3}; // Indica los pines conectados a las columnas
// Se crea un objeto de la librería para utilizarse posteriormente sus funciones
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, Rows, Cols);
int r = 13; // Un diodo LED Rojo conectado al pin 13
int v = 12; // Un diodo LED Verde conectado al pin 12
// Definición de las claves permitidas
const char* claves[] = {"6316", "3211", "5834", "1179", "2563", "7375", "2962", "1195", "8246", "2516", "8490", "7259", "1273", "3382", "4276", };
void setup() {
Serial.begin(9600); // Inicia comunicación con el monitor serie a 9600 bps
Serial.print("INSERTE CLAVE "); // Muestra un mensaje al iniciar el programa
pinMode(r, OUTPUT); pinMode(v, OUTPUT); // Configura los pines de los LEDs como salida
}
void loop() {
char pinInsert[5] = {0}; // Inicializa el array con ceros para almacenar la clave
while (strlen(pinInsert) < 4) {
char key = keypad.getKey();
if (key) {
pinInsert[strlen(pinInsert)] = key; // Almacena la tecla presionada en el array
Serial.print('*'); // Muestra un asterisco en el monitor serie para ocultar la clave
}
}
if (verifyPin(pinInsert)) { // Muestra un mensaje si la clave es correcta
Serial.println(); Serial.println("ACCESO CONCEDIDO"); Serial.println();
digitalWrite(v, HIGH); digitalWrite(r, LOW); // Enciende el LED verde y apaga el LED rojo
}
else { // Sino muestra un mensaje si la clave es incorrecta
Serial.println(); Serial.println("ACCESO DENEGADO: CLAVE INCORRECTA"); Serial.println();
digitalWrite(v, LOW); digitalWrite(r, HIGH); // Apaga el LED verde y enciende el LED rojo
}
delay(3000); // Espera 3 segundos antes de solicitar una nueva clave
Serial.print("INSERTE CLAVE ");
digitalWrite(v, LOW); digitalWrite(r, LOW); // Apaga ambos LEDs al solicitar una nueva clave
}
// Función para verificar si la clave ingresada es válida
bool verifyPin(const char* clave) {
for (const auto& pinOk : claves) {
if (strcmp(clave, pinOk) == 0) {
return true; // La clave es válida
}
}
return false; // La clave no coincide con ninguna clave permitida
}