// Pines de filas y columnas del teclado
int filas[4] = {13, 12, 14, 27};
int columnas[4] = {26, 25, 33, 32};
// Código correcto a ingresar
char codigoCorrecto[5] = {'1', '2', '3', '4'};
char codigoIngresado[5]; // Para guardar lo que digita el usuario
int indice = 0; // Posición del dígito actual
// Mapeo del teclado (4x4)
char teclas[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// --- LED VERDE para acceso concedido ---
#define LED_VERDE 2
// --- LED ROJO para acceso denegado ---
#define LED_ROJO 4
void setup() {
Serial.begin(115200);
// Configurar pines de filas como salidas
for (int i = 0; i < 4; i++) {
pinMode(filas[i], OUTPUT);
digitalWrite(filas[i], HIGH);
}
// Configurar pines de columnas como entradas con resistencia pull-up
for (int j = 0; j < 4; j++) {
pinMode(columnas[j], INPUT_PULLUP);
}
// Configurar LED verde como salida
pinMode(LED_VERDE, OUTPUT);
digitalWrite(LED_VERDE, LOW);
// Configurar LED ROJO como salida
pinMode(LED_ROJO, OUTPUT);
digitalWrite(LED_ROJO, LOW);
Serial.println("Cerradura digital lista");
Serial.println("Ingrese el código de 4 dígitos y presione 'D' para confirmar:");
}
void loop() {
char tecla = leerTeclado(); // Leer si hay tecla presionada
if (tecla != 0) { // Si se presionó una tecla
Serial.print("Tecla presionada: ");
Serial.println(tecla);
// Si es un número y aún no se completaron los 4 dígitos
if (tecla >= '0' && tecla <= '9' && indice < 4) {
codigoIngresado[indice] = tecla;
indice++;
Serial.print("Código parcial: ");
for (int i = 0; i < indice; i++) {
Serial.print(codigoIngresado[i]);
}
Serial.println();
}
// Si se presiona 'D' y ya hay 4 dígitos ingresados, validar
if (tecla == 'D') {
if (indice == 4) {
if (verificarCodigo()) {
Serial.println("Acceso concedido");
digitalWrite(LED_VERDE, HIGH);
delay(2000);
digitalWrite(LED_VERDE, LOW);
} else {
Serial.println("Acceso denegado");
digitalWrite(LED_ROJO, HIGH);
delay(2000);
digitalWrite(LED_ROJO, LOW);
}
} else {
Serial.println("Código incompleto. Debe tener 4 dígitos.");
}
// Reiniciar para siguiente intento
indice = 0;
memset(codigoIngresado, 0, sizeof(codigoIngresado));
delay(500);
Serial.println("\nIngrese un nuevo código de 4 dígitos y presione 'D' para confirmar:");
}
delay(250); // Pausa para evitar rebotes
}
}
// --- Función para leer una tecla del teclado 4x4 ---
char leerTeclado() {
for (int f = 0; f < 4; f++) {
digitalWrite(filas[f], LOW); // Activar fila
for (int c = 0; c < 4; c++) {
if (digitalRead(columnas[c]) == LOW) {
while (digitalRead(columnas[c]) == LOW); // Esperar a soltar la tecla
digitalWrite(filas[f], HIGH); // Desactivar fila
return teclas[f][c]; // Retornar la tecla presionada
}
}
digitalWrite(filas[f], HIGH); // Desactivar fila antes de pasar a la siguiente
}
return 0; // Si no se presionó ninguna tecla
}
// --- Función para verificar si el código es correcto ---
bool verificarCodigo() {
for (int i = 0; i < 4; i++) {
if (codigoIngresado[i] != codigoCorrecto[i]) {
return false;
}
}
return true;
}