Marcio Cunha

Cómo usar MQTT para monitorear sensores con ESP32 via Wi-Fi

Aprende a implementar telemetría eficiente con MQTT y ESP32, conectando sensores vía Wi-Fi para automatización. Esta guía práctica explora el ciclo de vida de la conexión, optimización de temas y estrategias para un envío de datos robusto en escenarios residenciales e industriales.

Marcio Cunha•8 min
También disponible en:PortuguêsEnglish
Resumen
  • MQTT en ESP32 permite la telemetría de sensores, optimizando el consumo de energía y el ancho de banda de la red Wi-Fi.
  • La estructura de temas en MQTT es crucial para organizar y escalar el flujo de datos en sistemas de automatización.
  • El ciclo de vida de la conexión, incluyendo `keep-alive` y mensajes `Last Will and Testament` (LWT), asegura la resiliencia del sistema.
  • Optimizar la comunicación significa elegir el QoS correcto y comprimir las cargas útiles para reducir el tráfico de red.
  • La implementación práctica en ESP32 implica gestionar la conexión Wi-Fi, configurar el cliente MQTT y publicar datos de forma segura.

¿Por qué usar MQTT con ESP32 para monitorear sensores?

Monitorear sensores en tiempo real, ya sea en un hogar inteligente o en una línea de producción industrial, exige una forma eficiente y confiable de transmitir datos. Aquí es donde el protocolo MQTT (Message Queuing Telemetry Transport) y el microcontrolador ESP32 realmente destacan. MQTT es un protocolo de mensajería ligero de publicación/suscripción (publish/subscribe), ideal para dispositivos con recursos limitados, como microcontroladores, ya que minimiza el consumo de energía y el ancho de banda de la red. El ESP32, por su parte, es una plataforma robusta y asequible con Wi-Fi y Bluetooth integrados, perfecta para recopilar y enviar datos de sensores.

En este artículo, desvelaremos cómo combinar el poder del ESP32 con la inteligencia de MQTT para crear sistemas de telemetría eficaces. Abordaremos desde el ciclo de vida de la conexión hasta las mejores prácticas para organizar sus temas y optimizar el envío de datos vía Wi-Fi, asegurando que sus lecturas lleguen a su destino de forma segura y eficiente, incluso en entornos desafiantes como plantas industriales o residencias con muchos dispositivos.

MQTT: El Corazón de la Telemetría IoT

MQTT funciona con una arquitectura centralizada donde un servidor, llamado broker, actúa como un punto de distribución de mensajes. Los dispositivos, conocidos como clientes, se conectan a este broker y pueden publicar mensajes (enviar datos) o suscribirse (recibir datos) a temas específicos. Un tema es como un "buzón" jerárquico (ej: casa/sala/temperatura) al que se envían los datos o desde el que se recuperan.

La belleza de MQTT radica en su simplicidad y en sus características avanzadas para garantizar la entrega. El Quality of Service (QoS), por ejemplo, define el nivel de garantía de entrega de un mensaje, que va desde "como máximo una vez" (QoS 0) hasta "exactamente una vez" (QoS 2). Además, los mensajes `Last Will and Testament` (LWT) son esenciales: el cliente configura un mensaje que el broker envía automáticamente a un tema específico si la conexión del cliente se cae inesperadamente. Esto es vital para saber cuándo un sensor ha dejado de funcionar, indicando problemas de red o del dispositivo.

ESP32: La Elección Ideal para la Conectividad y Automatización

El ESP32, de Espressif Systems, se ha convertido en el favorito de los desarrolladores de IoT. Sus dos núcleos de procesamiento (o uno, según el modelo), su capacidad para operar con un consumo de energía muy bajo y el módulo Wi-Fi integrado lo hacen perfecto para aplicaciones de telemetría. Puede recopilar datos de una amplia gama de sensores, como temperatura, humedad, presencia o niveles de líquidos, y enviarlos al broker MQTT utilizando la red Wi-Fi existente, eliminando la necesidad de cableado complejo o módulos de comunicación adicionales.

Su versatilidad y el amplio soporte de la comunidad, con bibliotecas robustas para MQTT, Wi-Fi y diversos sensores, aceleran enormemente el desarrollo. La facilidad de programación, ya sea a través de Arduino IDE o ESP-IDF, permite tanto a aficionados como a ingenieros crear soluciones complejas con relativa rapidez. Para escenarios de automatización residencial, puede integrar sistemas de iluminación y climatización; en la industria, puede monitorear máquinas y procesos, optimizando el mantenimiento predictivo y la eficiencia operativa.

Ciclo de Vida de la Conexión y Eficiencia Wi-Fi

La gestión de la conexión Wi-Fi es un punto crítico para dispositivos IoT alimentados por batería. El ESP32 permite estrategias de ahorro de energía, como el `light sleep` y `deep sleep`, donde "duerme" durante largos períodos y "despierta" solo para leer sensores y enviar datos. En MQTT, el parámetro `keep-alive` es fundamental: define el intervalo máximo de inactividad entre el cliente y el broker. Si no se intercambian paquetes durante este período, el cliente envía un `PINGREQ` para mantener la conexión activa. Un `keep-alive` bien ajustado evita reconexiones innecesarias y conserva la batería.

Además, la forma en que se envían los datos también afecta la eficiencia. Enviar pequeños paquetes de datos a intervalos regulares es generalmente más eficiente que enviar grandes bloques con poca frecuencia. Utilizar cargas útiles en formato JSON, pero de forma compacta (evitando nombres de clave demasiado largos), reduce el volumen de tráfico. Comprender el ciclo completo – conectar al Wi-Fi, conectar a MQTT, publicar y, potencialmente, desconectar para dormir – es clave para una telemetría robusta y energéticamente eficiente.

Implementación Práctica: Monitoreando un Sensor

Vamos a ponernos manos a la obra e implementar un monitor de temperatura y humedad usando un sensor DHT11/DHT22 y un ESP32, publicando los datos vía MQTT. Para ello, necesitará el ESP32, un sensor DHT y un broker MQTT (puede ser local, como Mosquitto, o un servicio en la nube).

  1. Configurar el Entorno de Desarrollo

    Primero, asegúrese de tener el IDE de Arduino instalado con soporte para la placa ESP32. Instale las bibliotecas necesarias a través del Administrador de Bibliotecas: "PubSubClient" para MQTT y "DHT sensor library" para el sensor.

  2. Conectar el Sensor al ESP32

    Conecte el pin de datos de su sensor DHT a un pin digital del ESP32 (ej: GPIO4). El pin VCC va a 3.3V y GND al GND del ESP32. Agregue una resistencia de 10k Ohm entre el pin de datos y VCC, si su sensor no tiene una interna.

  3. Estructurar el Código Principal

    El código a continuación ejemplifica la conexión Wi-Fi, MQTT y la lectura del sensor. Adapte el SSID, contraseña, IP del broker y los temas según sus necesidades.

    #include <WiFi.h> #include <PubSubClient.h> #include <DHT.h> const char* ssid = "SuSSID"; const char* password = "SuContraseña"; const char* mqtt_server = "192.168.1.100"; const int mqtt_port = 1883; const char* mqtt_client_id = "ESP32Sensor"; const char* mqtt_user = ""; // Opcional const char* mqtt_pass = ""; // Opcional const char* mqtt_topic_temp = "casa/sala/temperatura"; const char* mqtt_topic_hum = "casa/sala/humedad"; #define DHTPIN 4 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); WiFiClient espClient; PubSubClient client(espClient); void setup_wifi() { delay(10); Serial.println("Conectando a WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.print("Dirección IP: "); Serial.println(WiFi.localIP()); } void reconnect_mqtt() { while (!client.connected()) { Serial.print("Intentando conexión MQTT..."); if (client.connect(mqtt_client_id, mqtt_user, mqtt_pass)) { Serial.println("conectado"); // Si hay temas a los que suscribirse, hágalo aquí. // client.subscribe("tema/control"); } else { Serial.print("falló, rc="); Serial.print(client.state()); Serial.println(" intentando de nuevo en 5 segundos"); delay(5000); } } } void setup() { Serial.begin(115200); dht.begin(); setup_wifi(); client.setServer(mqtt_server, mqtt_port); } void loop() { if (!client.connected()) { reconnect_mqtt(); } client.loop(); // Maneja reconexiones y mensajes entrantes // Lectura del sensor float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("¡Fallo al leer del sensor DHT!"); } else { // Publica temperatura String tempPayload = String(t, 2); Serial.print("Publicando temperatura: "); Serial.print(tempPayload); Serial.print(" en el tema "); Serial.println(mqtt_topic_temp); client.publish(mqtt_topic_temp, tempPayload.c_str()); // Publica humedad String humPayload = String(h, 2); Serial.print("Publicando humedad: "); Serial.print(humPayload); Serial.print(" en el tema "); Serial.println(mqtt_topic_hum); client.publish(mqtt_topic_hum, humPayload.c_str()); } delay(30000); // Publica cada 30 segundos } 
  4. Monitorear con el Broker MQTT

    Después de cargar el código en su ESP32, utilice un cliente MQTT como `mqtt-explorer` o `mosquitto_sub` para suscribirse a los temas casa/sala/temperatura y casa/sala/humedad. Verá los datos de su sensor publicándose en tiempo real.

    mosquitto_sub -h 192.168.1.100 -t "casa/sala/#" -v 

Gestión de Temas y Mensajes: Buenas Prácticas

La forma en que estructura sus temas MQTT es vital para la escalabilidad y organización del sistema. Evite temas genéricos y prefiera una jerarquía lógica. Por ejemplo, en lugar de `temperatura`, use `edificio/piso/sala/temperatura`. Esto le permite suscribirse a temas más amplios (ej: `edificio/#`) para recibir datos de todo el edificio o de un piso específico (`edificio/piso/+`). Considere también usar QoS 1 (`Al menos una vez`) para mensajes críticos que requieren garantía de entrega, como alertas de seguridad, y QoS 0 (`Como máximo una vez`) para datos de telemetría que no exigen una retransmisión estricta, como lecturas de temperatura rutinarias, buscando la eficiencia.

Para la carga útil (payload) de los mensajes, JSON es el formato más flexible. Permite encapsular múltiples valores (ej: temperatura, humedad, presión) en un solo mensaje, reduciendo el número de publicaciones. Por ejemplo, en lugar de dos temas para temperatura y humedad, un único tema casa/sala/datos puede publicar {"temperatura":24.5, "humedad":60.2}. Los mensajes retenidos (`retained messages`) también son útiles: el broker almacena el último mensaje publicado en un tema y lo envía inmediatamente a cualquier nuevo suscriptor, asegurando que los nuevos clientes reciban el estado actual de un sensor tan pronto como se conectan. Esto puede ser crucial en sistemas donde entender el estado actual de un dispositivo es importante, de manera similar a cómo se podría usar `iostat` para comprender el rendimiento actual de E/S del disco de un servidor.

Conclusión

La combinación del ESP32 con el protocolo MQTT ofrece una solución robusta y flexible para monitorear sensores e implementar telemetría en diversos entornos, desde la automatización residencial hasta la industrial. Al comprender y aplicar las mejores prácticas del ciclo de vida de la conexión, la gestión de temas y la optimización de datos vía Wi-Fi, es posible construir sistemas eficientes, escalables y resilientes.

Dominar estos conceptos no solo permite crear proyectos IoT más efectivos, sino que también sienta las bases para sistemas de automatización más complejos, donde la comunicación confiable y el bajo consumo de energía son diferenciadores clave. Continúe explorando y adaptando estas técnicas para satisfacer las demandas específicas de sus proyectos, asegurando que sus datos lleguen donde deben, cuando deben.