tutoriales.com

Control Inteligente de Acceso a Puertas con RFID y Notificaciones en Tiempo Real usando ESP32

Este tutorial te guiará paso a paso en la creación de un sistema de control de acceso a puertas utilizando tecnología RFID, un microcontrolador ESP32 y notificaciones en tiempo real. Descubre cómo mejorar la seguridad de tu hogar u oficina con esta solución IoT práctica y personalizable.

Intermedio20 min de lectura14 views
Reportar error

🔐 Introducción al Control de Acceso Inteligente con RFID

En la era del Internet de las Cosas (IoT), la seguridad y la comodidad se fusionan para ofrecernos soluciones innovadoras. El control de acceso inteligente es un excelente ejemplo de cómo la tecnología puede transformar nuestra vida diaria. Imagina poder gestionar quién entra y sale de un lugar, no solo con una llave física, sino con un sistema digital que registra cada evento y te notifica al instante.

Este tutorial se enfoca en la construcción de un sistema de control de acceso a puertas utilizando RFID (Identificación por Radiofrecuencia) y el versátil microcontrolador ESP32. No solo abriremos una puerta con una tarjeta o llavero RFID, sino que también implementaremos un sistema de notificaciones en tiempo real para que siempre estés al tanto de los accesos, incluso cuando no estés presente. ¡Prepárate para llevar la seguridad de tu espacio al siguiente nivel!

💡 Consejo: La tecnología RFID es ampliamente utilizada en tarjetas de transporte público, pasaportes electrónicos y sistemas de inventario. Su simplicidad y bajo costo la hacen ideal para proyectos de IoT.

🎯 Objetivos del Proyecto

Al finalizar este tutorial, serás capaz de:

  • Comprender los principios básicos del funcionamiento de la tecnología RFID.
  • Conectar y configurar un lector RFID (RC522) con un ESP32.
  • Programar el ESP32 para leer tarjetas/llaveros RFID y controlar un relé (que simulará la cerradura).
  • Integrar un servicio de notificaciones en tiempo real (como Telegram o un servicio web).
  • Construir un sistema completo de control de acceso con registro de eventos y alertas.

🛠️ Materiales Necesarios

Aquí tienes una lista de los componentes que utilizaremos en este proyecto:

ComponenteCantidadDescripción
---------
ESP32 Dev Kit C1Placa de desarrollo con Wi-Fi y Bluetooth integrado.
Lector RFID RC522 + Tarjeta/Llavero1Módulo lector RFID para identificar las credenciales.
---------
Módulo de Relé de 1 Canal1Para simular la cerradura eléctrica.
Protoboard1Para facilitar las conexiones.
---------
Cables Jumper (Macho-Macho, Macho-Hembra)SuficientesPara interconectar los componentes.
Fuente de Alimentación de 5V1Para alimentar el circuito (puedes usar el USB del ESP32).
---------
Resistencia (10k Ohm)1Opcional, para el botón de acceso manual si lo implementas.
Botón Pulsador1Opcional, para abrir la puerta manualmente desde el interior.
📌 Nota: Asegúrate de que tu ESP32 tenga conectividad Wi-Fi, ya que la usaremos para enviar las notificaciones.

📖 Fundamentos Teóricos

Antes de sumergirnos en la práctica, es crucial entender cómo funciona cada componente clave.

¿Qué es RFID? 🏷️

RFID (Radio-Frequency Identification) es una tecnología que utiliza ondas de radio para identificar objetos o personas. Un sistema RFID consta de tres componentes principales:

  1. Etiqueta RFID (Tag): Es el chip que contiene la información (en nuestro caso, la tarjeta o llavero). No requiere batería para la lectura pasiva.
  2. Lector RFID (Reader): Emite ondas de radio y lee la información de la etiqueta cuando esta se encuentra dentro de su campo de acción.
  3. Antena RFID: Integrada en el lector, es la encargada de transmitir y recibir las señales de radio.

Cuando una etiqueta RFID entra en el campo de radiofrecuencia del lector, la energía de las ondas activa el chip de la etiqueta, que a su vez envía su ID único de vuelta al lector. El lector decodifica esta información y la envía al microcontrolador para su procesamiento.

El ESP32: El Cerebro del Sistema 🧠

El ESP32 es un microcontrolador de bajo costo y bajo consumo con Wi-Fi y Bluetooth integrados. Es ideal para proyectos de IoT debido a su capacidad para conectarse a internet, procesar datos rápidamente y controlar varios periféricos simultáneamente. En este proyecto, el ESP32 será el encargado de:

  • Comunicarse con el lector RFID para obtener la ID de las tarjetas.
  • Almacenar las IDs de las tarjetas autorizadas.
  • Controlar el módulo de relé para activar la cerradura.
  • Conectarse a la red Wi-Fi.
  • Enviar notificaciones en tiempo real a un servicio externo.

Módulo de Relé: La Cerradura Digital 🚪

Un relé es un interruptor electromecánico que permite controlar un circuito de alta potencia (como una cerradura eléctrica) con una señal de baja potencia de nuestro ESP32. Cuando el ESP32 envía una señal al relé, este activa un electroimán que mueve un contacto, abriendo o cerrando el circuito de la cerradura. Para este tutorial, el relé actuará como un simulador de nuestra cerradura; lo abriremos y cerraremos con el código.


⚙️ Conexiones Físicas (Hardware)

¡Es hora de ensuciarse las manos! Sigue este diagrama de conexión para interconectar todos los componentes. Asegúrate de que el ESP32 esté desconectado de la alimentación mientras realizas las conexiones.

Sistema de Control de Acceso RFID Lector RFID RC522 SDA (SDA) SCK (SCK) MOSI (MOSI) MISO (MISO) RST (RST) GND (GND) 3.3V (VCC) Módulo Relé IN (Señal) GND VCC (5V) ESP32 Dev Kit GPIO 5 GPIO 18 GPIO 23 GPIO 19 GPIO 22 3.3V / GND GPIO 2 5V GND Alimentación 5V / USB SPI

Aquí tienes el detalle de las conexiones pin a pin:

🔌 Conexión del Lector RFID RC522 al ESP32

El módulo RC522 se comunica con el ESP32 a través del protocolo SPI (Serial Peripheral Interface). Los pines SPI por defecto del ESP32 son:

  • SCK (Clock): GPIO18
  • MISO (Master In Slave Out): GPIO19
  • MOSI (Master Out Slave In): GPIO23

Además de estos, necesitamos definir los pines SDA (Slave Select) y RST (Reset) para el módulo RC522.

Pin RC522Pin ESP32
------
VCC3.3V
RSTGPIO22
------
GNDGND
MISOGPIO19
------
MOSIGPIO23
SCKGPIO18
------
SDAGPIO5

⚡ Conexión del Módulo de Relé al ESP32

El módulo de relé es más sencillo de conectar. Simplemente necesitamos un pin digital del ESP32 para controlarlo, además de la alimentación.

Pin ReléPin ESP32
------
VCC5V
GNDGND
------
INGPIO2
⚠️ Advertencia: El VCC del módulo de relé a menudo requiere 5V, mientras que el ESP32 trabaja a 3.3V en sus pines lógicos. Asegúrate de conectar el VCC del relé a la fuente de 5V (por ejemplo, el pin 5V del ESP32 o una fuente externa). El pin `IN` del relé, sin embargo, puede ser controlado por un pin digital del ESP32 (3.3V) sin problemas.

💻 Configuración del Entorno de Desarrollo

Para programar el ESP32, utilizaremos el IDE de Arduino. Si aún no lo tienes configurado, sigue estos pasos:

  1. Descarga e instala el IDE de Arduino: Visita arduino.cc.
  2. Agrega el soporte para ESP32:
    • Ve a Archivo > Preferencias.
    • En URLs Adicionales de Gestores de Tarjetas, añade la siguiente URL: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    • Haz clic en OK.
    • Ve a Herramientas > Placa > Gestor de Tarjetas....
    • Busca "esp32" e instala la plataforma esp32 by Espressif Systems.
  3. Selecciona tu placa ESP32: Ve a Herramientas > Placa y elige el modelo de tu ESP32 (por ejemplo, ESP32 Dev Module).
  4. Instala las librerías necesarias:
    • Ve a Programa > Incluir Librería > Gestionar Librerías....
    • Busca MFRC522 e instala la librería MFRC522 by Udo Klein.
    • Busca UniversalTelegramBot (si usarás Telegram) o la librería para tu servicio de notificaciones.
🔥 Importante: Para el envío de notificaciones, necesitarás configurar un bot de Telegram. Busca tutoriales específicos sobre cómo crear un bot de Telegram y obtener tu `Bot Token` y `Chat ID`.

📝 Desarrollo del Código (Firmware del ESP32)

El código se dividirá en varias partes clave: configuración de Wi-Fi, manejo del RFID, control del relé y envío de notificaciones.

💾 Estructura del Código

#include <WiFi.h>
#include <MFRC522.h>
#include <UniversalTelegramBot.h>

// --- Configuración WiFi ---
const char* ssid = "TU_SSID";
const char* password = "TU_PASSWORD";

// --- Configuración Telegram (si aplica) ---
#define BOT_TOKEN "TU_BOT_TOKEN"
#define CHAT_ID "TU_CHAT_ID"
WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

// --- Pines RFID ---
#define SS_PIN 5  // SDA (Slave Select) para el RC522
#define RST_PIN 22 // RST (Reset) para el RC522
MFRC522 mfrc522(SS_PIN, RST_PIN);

// --- Pin Relé ---
#define RELAY_PIN 2

// --- Tarjetas Autorizadas (ejemplos) ---
String authorizedUIDs[] = {"XX XX XX XX", "YY YY YY YY"}; // Reemplaza con tus UIDs
int numAuthorizedUIDs = sizeof(authorizedUIDs) / sizeof(authorizedUIDs[0]);

// --- Variables de control ---
long lastAccessTime = 0;
const long accessDelay = 5000; // 5 segundos de retardo entre accesos (para evitar aperturas múltiples)

void setup() {
  Serial.begin(115200);
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, HIGH); // Relé normalmente cerrado (desactivado)

  // Inicializar SPI para RFID
  SPI.begin();
  mfrc522.PCD_Init();
  Serial.println("Lector RFID inicializado.");

  // Conectar a Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Conectando a WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi conectado!");
  Serial.print("Dirección IP: ");
  Serial.println(WiFi.localIP());

  // Configurar cliente seguro para Telegram
  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
}

void loop() {
  // Buscar nuevas tarjetas RFID
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  String uid = getCardUID();
  Serial.print("Tarjeta detectada con UID: ");
  Serial.println(uid);

  if (checkAuthorization(uid)) {
    Serial.println("✅ Acceso concedido.");
    openDoor();
    sendTelegramMessage("ACCESO CONCEDIDO: Tarjeta " + uid);
  } else {
    Serial.println("❌ Acceso denegado.");
    sendTelegramMessage("ACCESO DENEGADO: Tarjeta " + uid + " (no autorizada)");
  }

  mfrc522.PICC_HaltA(); // Detener el PICC
  mfrc522.PCD_StopCrypto1(); // Detener la encriptación en el PCD
}

String getCardUID() {
  String uidString = "";
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    if (mfrc522.uid.uidByte[i] < 0x10) {
      uidString += "0";
    }
    uidString += String(mfrc522.uid.uidByte[i], HEX);
    if (i < mfrc522.uid.size - 1) {
      uidString += " ";
    }
  }
  uidString.toUpperCase();
  return uidString;
}

bool checkAuthorization(String uid) {
  for (int i = 0; i < numAuthorizedUIDs; i++) {
    if (uid.equals(authorizedUIDs[i])) {
      return true;
    }
  }
  return false;
}

void openDoor() {
  if (millis() - lastAccessTime < accessDelay) {
    Serial.println("Esperando el tiempo de retardo entre accesos.");
    return;
  }
  digitalWrite(RELAY_PIN, LOW); // Activar relé (cerradura abierta)
  Serial.println("Puerta abierta.");
  delay(3000); // Mantener la puerta abierta por 3 segundos
  digitalWrite(RELAY_PIN, HIGH); // Desactivar relé (cerradura cerrada)
  Serial.println("Puerta cerrada.");
  lastAccessTime = millis();
}

void sendTelegramMessage(String message) {
  if (WiFi.status() == WL_CONNECTED) {
    if (bot.sendMessage(CHAT_ID, message)) {
      Serial.println("Mensaje de Telegram enviado: " + message);
    } else {
      Serial.println("Error al enviar mensaje de Telegram.");
    }
  } else {
    Serial.println("WiFi no conectado, no se pudo enviar mensaje de Telegram.");
  }
}

🚶‍♂️ Pasos Detallados del Código

  1. Inclusión de Librerías: Incluimos las librerías WiFi.h para conectividad, MFRC522.h para el lector RFID y UniversalTelegramBot.h para las notificaciones.
  2. Credenciales: Define tu ssid, password de Wi-Fi, y tu BOT_TOKEN y CHAT_ID de Telegram. ¡Son cruciales para que el sistema funcione!
  3. Pines: Se definen los pines para el RFID (SDA y RST) y para el relé.
  4. authorizedUIDs: ¡Importante! Esta es la lista de UIDs de las tarjetas autorizadas. Para obtener los UIDs de tus tarjetas, sube primero un sketch de ejemplo de la librería MFRC522 (como DumpInfo) y pasa tus tarjetas por el lector. Anota los UIDs y cámbialos aquí en el formato "XX XX XX XX".
  5. setup():
    • Inicializa la comunicación serie para depuración.
    • Configura el pin del relé como salida y lo pone en estado HIGH (desactivado), asumiendo un relé Normalmente Cerrado que se activa con LOW.
    • Inicializa el SPI y el lector RFID.
    • Conecta el ESP32 a la red Wi-Fi.
    • Configura el cliente seguro para Telegram (necesario para HTTPS).
  6. loop():
    • Comprueba si hay una nueva tarjeta RFID presente y si se puede leer su serie.
    • Si se detecta una tarjeta, se obtiene su UID.
    • Se llama a checkAuthorization() para verificar si el UID está en la lista de authorizedUIDs.
    • Si está autorizado, se llama a openDoor() y se envía una notificación de acceso concedido.
    • Si no está autorizado, se envía una notificación de acceso denegado.
    • Finalmente, PICC_HaltA() y PCD_StopCrypto1() se llaman para detener el procesamiento de la tarjeta actual y prepararse para la siguiente.
  7. getCardUID(): Esta función extrae el UID de la tarjeta RFID y lo formatea como una cadena legible.
  8. checkAuthorization(): Recorre la lista de UIDs autorizados y compara el UID leído con ellos.
  9. openDoor(): Controla el pin del relé para abrir la puerta por un breve período y luego cerrarla. Incluye un retardo para evitar aperturas repetidas demasiado rápido.
  10. sendTelegramMessage(): Envía un mensaje de texto al CHAT_ID especificado a través del bot de Telegram, siempre que el Wi-Fi esté conectado.
💡 Consejo: Para obtener el UID de tus tarjetas, carga el ejemplo `File > Examples > MFRC522 > DumpInfo` en tu ESP32, abre el monitor serie y pasa tus tarjetas. Copia el `Card UID`.

✨ Personalización y Mejoras

Este sistema es una base sólida, pero puedes mejorarlo de muchas maneras:

📋 Gestionar Tarjetas Dinámicamente

En lugar de tener los UIDs codificados en el firmware, podrías:

  • Almacenarlos en la memoria EEPROM del ESP32: Permite añadir o eliminar tarjetas sin reprogramar el dispositivo.
  • Usar una base de datos remota: Un servidor web o una base de datos Firebase/Google Sheets para una gestión centralizada y remota.
  • Interfaz Web: Crear una pequeña interfaz web en el ESP32 para añadir/eliminar tarjetas desde un navegador.

📊 Registro de Eventos

Además de las notificaciones, puedes:

  • Guardar en tarjeta SD: Un módulo de tarjeta SD puede registrar todos los eventos de acceso (UID, fecha, hora, estado) localmente.
  • Servidor Web con Logs: Enviar los datos a un servidor web que los almacene en una base de datos para análisis posterior.

🚨 Funcionalidades de Seguridad Adicionales

  • Sensor de Puerta Abierta: Añadir un sensor magnético para detectar si la puerta se ha quedado abierta y enviar una alerta.
  • Modo "Vacaciones": Desactivar temporalmente todas las tarjetas o activar un modo de alerta más sensible.
  • Teclado Numérico: Combinar RFID con un teclado numérico para doble factor de autenticación.

🌐 Alternativas a Telegram para Notificaciones

Si Telegram no es tu opción, considera:

  • Pushover: Un servicio de notificación simple y robusto.
  • ** Blynk:** Plataforma IoT que permite enviar notificaciones push y tener una interfaz de usuario.
  • MQTT: Publicar eventos de acceso a un broker MQTT, y otro cliente puede suscribirse para recibir alertas (por ejemplo, Home Assistant).
  • Webhooks: Enviar una solicitud HTTP POST a un servicio web que luego dispare otras acciones (ej. IFTTT).
⚠️ Advertencia: Si utilizas almacenamiento en EEPROM o una base de datos remota, implementa mecanismos de seguridad para proteger la integridad de los datos de las tarjetas autorizadas.

🚀 Prueba y Verificación

Una vez que hayas cargado el código en tu ESP32:

  1. Abre el Monitor Serie: Configúralo a 115200 baudios para ver los mensajes de depuración.
  2. Conexión Wi-Fi: Verifica que el ESP32 se conecta correctamente a tu red y muestra la IP.
  3. Registro de Tarjetas: Pasa una tarjeta no autorizada. Deberías ver "Acceso denegado" en el monitor serie y recibir una notificación.
  4. Autorización de Tarjetas: Pasa una tarjeta autorizada. Deberías ver "Acceso concedido", el relé debería activarse (escucharás un clic) y recibirás una notificación.
  5. Verificación del Relé: Si tienes un LED conectado al relé, debería encenderse/apagarse. Si tienes una cerradura real, ¡asegúrate de que las conexiones de voltaje sean las correctas y no dañen tu ESP32!
Proyecto Completo

Preguntas Frecuentes (FAQ)

¿Qué hago si mi lector RFID no detecta tarjetas? Posibles causas y soluciones:
  • **Conexiones incorrectas:** Revisa minuciosamente el diagrama de pines SPI.
  • **Alimentación insuficiente:** Asegúrate de que el RC522 reciba 3.3V estables.
  • **Librería incorrecta:** Confirma que estás usando la librería `MFRC522 by Udo Klein`.
  • **Tarjeta defectuosa:** Prueba con otra tarjeta RFID si tienes una disponible.
¿Cómo obtengo el Token de mi Bot de Telegram y el Chat ID?

Para obtener tu Bot Token:

  1. Busca @BotFather en Telegram y envíale /start.
  2. Envía /newbot y sigue las instrucciones para darle un nombre y un username a tu bot.
  3. BotFather te dará un HTTP API Token. Cópialo.

Para obtener tu Chat ID:

  1. Inicia una conversación con tu nuevo bot (envíale un mensaje cualquiera).
  2. Busca @RawDataBot en Telegram y reenvíale el mensaje que le enviaste a tu bot.
  3. En la respuesta de RawDataBot, busca el campo "chat":{"id":...}. Ese número es tu Chat ID.
¿Puedo controlar más de una puerta con un solo ESP32?

Sí, pero necesitarías un lector RFID por puerta y módulos de relé adicionales. La complejidad del código aumentaría para gestionar múltiples entradas y salidas. Para sistemas más grandes, se podría considerar un ESP32 más potente o múltiples ESP32 que se comuniquen entre sí o con un servidor central.


✅ Conclusión

¡Felicidades! Has construido tu propio sistema de control de acceso inteligente con RFID y notificaciones en tiempo real. Este proyecto no solo te ha familiarizado con la integración de hardware y software en IoT, sino que también te ha proporcionado una solución práctica para la seguridad y la automatización. Las posibilidades de personalización son infinitas, y este es solo el comienzo de lo que puedes lograr con el ESP32 y el mundo del Internet de las Cosas.

Sigue experimentando, añadiendo nuevas funcionalidades y mejorando la seguridad de tu sistema. ¡El futuro de la domótica está en tus manos!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!