#include <ESP8266WiFi.h> #include <Keypad.h> #include <Adafruit_Fingerprint.h> #include <LiquidCrystal_I2C.h> // Inicializa los componentes Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); WiFiClient client; LiquidCrystal_I2C lcd(0x27, 16, 2); // Ajusta los parámetros según tu pantalla LCD // Pines para el teclado 4x4 byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; // Conecta a los pines de fila del teclado byte pin_column[COL_NUM] = {5, 4, 3, 2}; // Conecta a los pines de columna del teclado Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COL_NUM); // Pin para la cerradura const int LOCK_PIN = 10; // Conecta a un pin de salida que controlará el relé de la cerradura void setup() { // Configura el WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); } // Inicializa el lector de huellas dactilares finger.begin(57600); if (finger.verifyPassword()) { Serial.println("Lector de huellas dactilares encontrado"); } else { Serial.println("No se encuentra el lector de huellas dactilares"); } // Inicializa la pantalla LCD lcd.init(); lcd.backlight(); // Configura el pin de la cerradura como salida pinMode(LOCK_PIN, OUTPUT); } void loop() { char key = keypad.getKey(); if (key) { // Si se presiona '#', agrega un nuevo usuario if (key == '#') { addUser(); } // Si se presiona '*', elimina un usuario else if (key == '*') { deleteUser(); } } // Comprueba si hay una huella dactilar int result = getFingerprintID(); if (result >= 0) { // Si la huella dactilar es reconocida, abre la cerradura, saluda al usuario y muestra su ID en el LCD abrirCerradura(); saludarUsuario(); lcd.clear(); lcd.print("Usuario "); lcd.print(result); lcd.print(" reconocido"); } } int getFingerprintID() { uint8_t id = finger.getImage(); if (id != FINGERPRINT_OK) return -1; id = finger.image2Tz(); if (id != FINGERPRINT_OK) return -1; id = finger.fingerFastSearch(); if (id != FINGERPRINT_OK) return -1; // Si todo va bien, devuelve la ID de la huella dactilar return finger.fingerID; } void addUser() { int id = getID(); // Obtén un ID para el nuevo usuario if (id == -1) { Serial.println("No se pudo obtener un ID para el nuevo usuario."); return; } Serial.print("Coloca el dedo en el lector de huellas..."); int p = -1; while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Imagen tomada"); break; case FINGERPRINT_NOFINGER: Serial.println("No se detectó ningún dedo."); delay(200); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Error de comunicación"); break; case FINGERPRINT_IMAGEFAIL: Serial.println("Error al tomar la imagen"); break; default: Serial.println("Error desconocido"); break; } } // Convierte la imagen de la huella en un modelo de características p = finger.image2Tz(1); if (p != FINGERPRINT_OK) { Serial.println("Error al convertir la imagen."); return; } // Crea una nueva plantilla de huella dactilar p = finger.createModel(); if (p == FINGERPRINT_OK) { Serial.println("Huella dactilar registrada!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Error de comunicación"); return; } else if (p == FINGERPRINT_ENROLLMISMATCH) { Serial.println("Las huellas no coinciden"); return; } else { Serial.println("Error desconocido"); return; } // Almacena la plantilla de la huella dactilar p = finger.storeModel(id); if (p == FINGERPRINT_OK) { Serial.println("Huella dactilar almacenada!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Error de comunicación"); return; } else if (p == FINGERPRINT_BADLOCATION) { Serial.println("Error de ubicación"); return; } else if (p == FINGERPRINT_FLASHERR) { Serial.println("Error de escritura flash"); return; } else { Serial.println("Error desconocido"); return; } } void deleteUser() { int id = getID(); // Obtén el ID del usuario a eliminar if (id == -1) { Serial.println("No se pudo obtener un ID para el usuario a eliminar."); return; } int p = finger.deleteModel(id); if (p == FINGERPRINT_OK) { Serial.println("Usuario eliminado!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Error de comunicación"); } else if (p == FINGERPRINT_BADLOCATION) { Serial.println("No se pudo encontrar ese ID en la memoria"); } else if (p == FINGERPRINT_FLASHERR) { Serial.println("Error al borrar la memoria flash"); } else { Serial.println("Error desconocido"); } } void abrirCerradura() { // Aquí puedes usar un pin de salida para controlar un relé que a su vez controle la cerradura digitalWrite(LOCK_PIN, HIGH); delay(5000); // Mantén la cerradura abierta durante 5 segundos digitalWrite(LOCK_PIN, LOW); } void saludarUsuario() { // Puedes usar una biblioteca de texto a voz para hacer que el Arduino hable myTTS.speak("¡Hola, bienvenido!"); } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Para hacer que tu Arduino hable, necesitarás un módulo de voz o un escudo de voz. Estos dispositivos pueden generar voz a partir de texto (TTS, Text-to-Speech) y se pueden conectar a tu Arduino. Una vez que tengas un módulo de voz, puedes usar una biblioteca de Arduino para controlarlo. Por ejemplo, si tienes un módulo de voz Elechouse, puedes usar la biblioteca Elechouse_Voice_Module para hacer que tu Arduino hable. Aquí tienes un ejemplo de cómo podrías hacer que tu Arduino diga “Hola”: #include <Elechouse_Voice_Module.h> VOICE_MODULE vModule; void setup() { vModule.init(); // Inicializa el módulo de voz } void loop() { vModule.say("Hola"); // Haz que el Arduino diga "Hola" delay(5000); // Espera 5 segundos antes de repetir } Por favor, ten en cuenta que este es solo un ejemplo y puede que necesites adaptarlo a tus necesidades específicas. También necesitarás instalar y configurar las bibliotecas adecuadas para tu módulo de voz. ¡Buena suerte con tu proyecto! 😊 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%