ESP8266 - Cerradura RFID

Este tutorial te enseña cómo construir un sistema de cerradura para puertas utilizando ESP8266, el módulo RFID/NFC RC522, un relé, una cerradura de solenoide o electromagnética y, opcionalmente, una pantalla LCD. Para facilitarte las cosas, el tutorial te guiará para construir la cerradura RFID desde pasos simples hasta complejos. En detalle, haremos:

Cerradura de puerta RFID con ESP8266 NodeMCU

Si quieres construir un sistema de cerraduras para puertas con contraseña, consulta ESP8266 - Keypad Door Lock.

Hardware Requerido

1×ESP8266 NodeMCU
1×Cable USB Tipo-A a Tipo-C (para PC USB-A)
1×Cable USB Tipo-C a Tipo-C (para PC USB-C)
1×RFID/NFC RC522 Kit (reader + tags)
1×RFID Key Fob
1×RFID Card
1×Cerradura de Solenoide
1×(Alternativo) Electromagnetic Lock
1×Relé
1×Adaptador de Corriente 12V
1×Conector de Alimentación DC
1×Cables Puente
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para ESP8266
1×(Recomendado) Divisor de Alimentación para ESP8266 Tipo-C

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

Acerca del módulo RFID/NFC RC522 y la cerradura electromagnética

Si no está familiarizado con el módulo RFID/NFC RC522, la cerradura electromagnética y la cerradura de solenoide (incluido el esquema de pines, cómo funciona y cómo programarla), entonces puede aprender más siguiendo estos tutoriales:

Componentes del sistema de cerraduras

El sistema de cerradura de la puerta se compone de dos componentes principales:

  • Cerradura: un ESP8266, un relé, un lector RFID/NFC, una cerradura de solenoide o una cerradura electromagnética
  • Llave de la puerta: etiquetas RFID/NFC
componente de cerradura de puerta RFID con ESP8266 NodeMCU

Cómo funciona la cerradura RFID/NFC para puertas

  • El usuario acerca una etiqueta RFID/NFC al lector RFID/NFC, que lee el UID de la etiqueta.
  • El ESP8266 obtiene el UID desde el lector y lo compara con los UIDs que se han configurado en el código.
  • Si el UID coincide con alguno de los UIDs predefinidos, ESP8266 desactivará la cerradura de solenoide, desbloqueando así la puerta.
  • Estas etiquetas actúan como llaves autorizadas.
  • El relé será activado por ESP8266 para bloquear la puerta después de un período de tiempo específico.

Diagrama de Cableado

  • Cerradura de puerta RFID RC522 con solenoide
Diagrama de cableado de la cerradura de solenoide para puerta RFID RC522 ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Para obtener m\u00e1s informaci\u00f3n, consulte Pines del ESP8266 y c\u00f3mo alimentar ESP8266 y otros componentes.

  • Cerradura de puerta RFID RC522 con cerradura electromagnética
Diagrama de cableado del sistema de cerradura con RFID ESP8266 NodeMCU RC522

This image is created using Fritzing. Click to enlarge image

※ Nota:

Los fabricantes pueden disponer de diferentes órdenes de pines, por lo que es importante confiar en las etiquetas impresas en el módulo. El diagrama de pines que se muestra arriba ilustra la disposición de los pines para los módulos producidos por el fabricante DIYables.

ESP8266 Código - Tecla única

/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN D8 // The ESP8266 pin D8 #define RST_PIN D2 // The ESP8266 pin D2 #define RELAY_PIN D1 // The ESP8266 pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); byte keyTagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap an RFID/NFC tag on the RFID-RC522 reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == keyTagUID[0] && rfid.uid.uidByte[1] == keyTagUID[1] && rfid.uid.uidByte[2] == keyTagUID[2] && rfid.uid.uidByte[3] == keyTagUID[3] ) { Serial.println("Access is granted"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied, UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Pasos R\u00e1pidos

Para empezar con ESP8266 en el IDE de Arduino, siga estos pasos:

  • Consulta el tutorial cómo configurar el entorno para ESP8266 en Arduino IDE si es la primera vez que usas ESP8266.
  • Conecta los componentes tal como se muestra en el diagrama.
  • Conecta la placa ESP8266 a tu computadora usando un cable USB.
  • Abre Arduino IDE en tu computadora.
  • Elige la placa ESP8266 correcta, como (por ejemplo NodeMCU 1.0 (ESP-12E Module)), y su puerto COM correspondiente.

Para determinar el UID de una etiqueta RFID/NFC:

  • Carga el código en el ESP8266 y abre el Monitor Serial.
  • Acerca la etiqueta al módulo RFID-RC522 y el UID se mostrará en el Monitor Serial.
COM6
Send
Tap RFID/NFC tag on reader Access denied for user with UID: 3A C9 6A CB
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Una vez que tengas el UID:

  • Modifica la línea 18 del código anterior para reflejar el UID. Por ejemplo, reemplaza byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; por byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Sube el código modificado al ESP8266
  • Coloca una etiqueta RFID/NFC en el módulo RFID-RC522
  • Verifica la salida en el Monitor Serial
COM6
Send
Tap RFID/NFC tag on reader Access is granted
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Verifique que la cerradura electromagnética no esté bloqueada.
  • Acerca una etiqueta RFID/NFC distinta al módulo RFID-RC522.
  • Consulte la salida en el Monitor Serial.
COM6
Send
Tap RFID/NFC tag on reader Access is granted Access denied for user with UID: BD 1E 1D 22
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Nota:

  • Para facilitar las pruebas, el tiempo de desbloqueo se ha establecido en 2 segundos; sin embargo, debe aumentarse para un uso práctico o una demostración.
  • Es necesaria la instalación de la biblioteca MFRC522. Para obtener más información, consulte el tutorial ESP8266 - RFID/NFC RC522.

Código ESP8266 - Múltiples teclas

Pensemos en una habitación en la que solo el gerente y el secretario pueden acceder.

En este caso, se requieren dos etiquetas RFID/NFC: una para el gerente y la otra para la secretaria. Los identificadores únicos (UID) de las dos etiquetas deben especificarse en el código.

/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN D8 // The ESP8266 pin D8 #define RST_PIN D2 // The ESP8266 pin D2 #define RELAY_PIN D1 // The ESP8266 pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap an RFID/NFC tag on the RFID-RC522 reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("The access is granted to manager"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("The access is granted to secretary"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied, UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Repite los mismos pasos que antes y luego acerca cada etiqueta al módulo RFID-RC522. La salida en el Monitor Serial debe aparecer como sigue:

COM6
Send
Tap RFID/NFC tag on reader Access is granted for secretary Access is granted for manager
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Puedes ampliar el código escrito arriba para incluir tres, cuatro o más etiquetas.

Agregar una pantalla LCD a la cerradura RFID

Podemos añadir opcionalmente una pantalla LCD para mostrar a los usuarios el estado de acceso (p. ej., CONCEDIDO/DENEGADO). Puedes aprender más sobre LCD en tutorial LCD de ESP8266

Diagrama de cableado - Sistema de bloqueo de puertas que utiliza RFID, cerradura de solenoide o cerradura electromagnética y pantalla LCD

Diagrama de cableado LCD para cerradura con RFID RC522 y ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Tenga en cuenta que en el diagrama de cableado de arriba, se añade un suministro de 5V porque el pin de 5V del ESP8266 no puede proporcionar suficiente energía para el relé y la pantalla LCD al mismo tiempo.

Código ESP8266 - Sistema de cierre de puertas con contraseña usando el módulo RFID RC522, cerradura de solenoide o cerradura electromagnética y pantalla LCD

/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #include <LiquidCrystal_I2C.h> #define SS_PIN D8 // The ESP8266 pin D8 #define RST_PIN D4 // The ESP8266 pin D4 #define RELAY_PIN D3 // The ESP8266 pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27 (from DIYables LCD), 16 column and 2 rows byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.init(); // Initialize the LCD I2C display lcd.backlight(); Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("Access is granted for manager"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("Access is granted for secretary"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } else { Serial.print("Access denied for user with UID:"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

※ Nota:

La dirección del LCD puede diferir según el fabricante. Usamos 0x27 en nuestro código, tal como lo especifica DIYables.

Añadir un sensor de puerta a la cerradura RFID

En el código mencionado anteriormente, el ESP8266 bloquea la puerta después de un tiempo de espera desde que se desbloquea. Sin embargo, en aplicaciones prácticas, normalmente se añade un sensor de la puerta al sistema. Si el ESP8266 detecta que la puerta está cerrada, bloquea la puerta de inmediato en lugar de esperar a que expire el tiempo de espera.

Para no abrumarte, no incluimos el sensor de puerta en el diagrama de cableado y en el código. En su lugar, dejamos esta parte a tu creatividad. Puedes consultar los tutoriales ESP8266 - Door Sensor y ESP8266 - Door Sensor control Relay para obtener más orientación.

Gestión y almacenamiento de las claves RFID válidas en EEPROM

El código anterior contiene claves RFID válidas (UID) que están incrustadas en el código del ESP8266. Esto significa que si quieres agregar o eliminar claves, tienes que hacer cambios en el código y volver a subirlo al ESP8266, lo cual es inconveniente.

En aplicaciones reales, es necesario gestionar las claves RFID sin tener que modificar y cargar el código cada vez. Para lograrlo, las claves RFID pueden almacenarse en EEPROM en lugar de estar codificadas en el código. En consecuencia, se necesita un método para gestionar fácilmente las claves RFID desde la EEPROM.

Hay dos métodos disponibles para gestionar claves RFID en la EEPROM:

  • Llaves RFID como llaves maestras
    • Al utilizar una clave RFID como clave maestra ADD, se pueden añadir nuevas claves al sistema. Una vez que el ESP8266 detecta la clave maestra ADD, cambia entre el modo ADD y el modo OPERACIÓN.
    • Durante el modo ADD, el ESP8266 añade a la EEPROM todas las claves nuevas que detecta.
    • Se emplea un enfoque similar para la clave maestra ELIMINAR y el modo ELIMINAR.
  • Utilice comandos ADD/DELETE a través de Serial/Bluetooth/IR
    • Los comandos se transmiten a través de Serial/Bluetooth/IR, utilizando herramientas como el Monitor Serial, la aplicación Bluetooth o el controlador IR.
    • Los comandos consisten en una directiva (ADD/DELETE) y el UID de la clave RFID.
    • Con el fin de mejorar la seguridad, también se debe incluir una contraseña con el comando. El ESP8266 verifica la contraseña para determinar si el comando es válido o no.

    Para poder utilizar cualquiera de los dos métodos anteriores, se debe añadir una cantidad considerable de código ESP8266. Para las personas que son nuevas en la programación, esto puede ser una tarea desafiante. Como resultado, este tutorial tiene como objetivo proporcionar una comprensión básica del sistema de cerradura de la puerta sin abrumar a los principiantes con código complejo. Si desea implementar este sistema para fines prácticos, por favor contáctenos a través de nuestro servicio de programación pagado.

Almacenando el historial de acceso en la tarjeta SD

Para hacer un seguimiento del historial de accesos, podría ser necesario guardar el UID de la llave RFID, el estado de acceso (Concedido/Denegado) y la fecha y hora. Como la EEPROM tiene una capacidad insuficiente para almacenar todo el historial, se puede usar una tarjeta SD en su lugar. Puede encontrar orientación sobre este tutorial [ESP8266 - Registrar datos con marca de tiempo en la tarjeta SD].

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!