ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

En el mundo de la tecnología y la Internet de las cosas, la comunicación entre dispositivos se ha vuelto fundamental. En este artículo, exploraremos cómo utilizar el módulo ESP8266, junto con Node-RED y MQTT, para publicar y suscribirse a datos de manera eficiente y práctica. ¡Descubre cómo aprovechar al máximo estas herramientas para tus proyectos de IoT!

Aprenda a publicar y suscribirse a temas MQTT utilizando la placa ESP8266 NodeMCU. En este tutorial, usaremos el tablero de Node-RED para controlar las salidas del ESP8266 y mostrar los datos del sensor del ESP8266 en su interfaz. El software Node-RED se ejecuta en una Raspberry Pi y la comunicación entre ESP8266 y el software Node-RED se produce a través del protocolo de comunicación MQTT. Programamos el ESP8266 con Arduino IDE.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Actualizado el 21 de marzo de 2023

Descripción del proyecto

La siguiente imagen muestra una descripción general de lo que haremos en este tutorial.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Primero, mire el vídeo de demostración a continuación.

Panel de Node-RED y Node-RED

Para seguir este tutorial necesitarás tener Node-RED y Node-RED Dashboard en tu Frambuesa Pi. Siga los siguientes tutoriales para instalar y comenzar con Node-RED y el panel de Node-RED:

  • Comenzando con Node-RED en Raspberry Pi
  • Comenzando con el panel de Node-RED

protocolo MQTT

En este tutorial establecemos comunicación entre una Raspberry Pi que ejecuta el software Node RED y un ESP8266 usando MQTT.

MQTT significa MQ-TElemetría transport es un sistema de publicación y suscripción agradable y liviano que le permite a usted, como cliente, publicar y recibir mensajes. Es un protocolo de mensajería liviano diseñado para dispositivos con restricciones y poco ancho de banda. Por tanto, es la solución perfecta para las aplicaciones de Internet de las cosas.

Si desea obtener más información sobre MQTT, mire el siguiente vídeo.

Para obtener una versión escrita de este video y recursos adicionales, consulte esta publicación de blog: ¿Qué es MQTT y cómo funciona?

Instalar el corredor Mosquitto

El broker MQTT es responsable de recibir todos los mensajes, filtrarlos, decidir quién está interesado en ellos y luego Publicar los mensajes a todos los clientes suscritos.

Hay varios corredores que puede utilizar. En este tutorial usaremos el corredor de mosquitos.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Puede instalar el corredor Mosquitto MQTT localmente en una Raspberry Pi, en su computadora o en la nube. seguir uno de los próximos tutoriales sobre la instalación del broker Mosquitto:

  • Instale Mosquitto MQTT Broker en una Raspberry Pi
  • Instale Mosquitto MQTT Broker en la nube (Digital Ocean)

Para ver si el agente Mosquitto se instaló correctamente, ejecute el siguiente comando:

pi@raspberry:~ $ mosquitto -v

Esto devuelve la versión de Mosquitto que se ejecuta actualmente en su Raspberry Pi. Debería ser 2.0.11 o posterior.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Nota: El comando Mosquitto devuelve la versión de Mosquitto actualmente instalada, pero también intenta reinicializar Mosquitto. Como Mosquitto ya se está ejecutando, aparece un mensaje de error. No se preocupe, Mosquitto está instalado y ejecutándose correctamente si ve un mensaje similar.

Estableciendo comunicación MQTT con Node-RED

En esta sección, estableceremos la comunicación MQTT con Node-RED utilizando los nodos MQTT.

Diseño del tablero

El primer paso es crear el diseño del panel. En este ejemplo tenemos un botón para controlar una salida ESP8266, una gráfica y un indicador para mostrar los valores de temperatura y humedad del sensor DHT11.

Haga clic en el pequeño icono de flecha en la parte superior derecha y luego haga clic en panel.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Sobre el disposición crear una pestaña llamada Habitación, y crea dos grupos en la pestaña Sala: lámpara Y sensor como se muestra en la siguiente figura.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Creando el flujo

Arrastre desde el área del tablero en la barra lateral izquierda cambiarA Diagrama, y un dispositivo de medición Nodos al flujo. Luego dibuja dos MQTT en y un salida MQTT Nodos del flujo (están ubicados en la sección «Red»): vea la imagen a continuación.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)
  • cambiar – controla la salida ESP8266
  • Nodo de salida MQTT – Se envía un mensaje al ESP8266 según el estado del interruptor.
  • 2x Nodo de entrada MQTT – estos nodos se suscriben a los temas de temperatura y humedad para recibir datos de sensores del ESP
  • diagrama – muestra los valores medidos del sensor de temperatura
  • dispositivo de medición – muestra las lecturas del sensor de humedad

Node-RED y el broker MQTT deben estar conectados. Para conectar el broker MQTT a Node-RED, haga doble clic en el salida MQTT Nodo. Aparecerá una nueva ventana (ver imagen a continuación).

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

1) presione eso Agregar nuevo corredor MQTT Posibilidad.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

2) Tipo servidor local en el servidor Campo. Todas las demás configuraciones están configuradas correctamente de forma predeterminada.

Si no está ejecutando Node-RED en la misma computadora que Node-RED (Raspberry Pi), ingrese la dirección IP MQTT en lugar de servidor local.

3) Haga clic en la pestaña «Seguridad» e ingrese su nombre de usuario y contraseña del corredor MQTT si es necesario.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

4) Prensa Actualizar y luego Agregar. El nodo de salida MQTT se conecta automáticamente a su corredor después de implementar el flujo Node-RED.

Edite todas las propiedades de otros nodos como se muestra en las siguientes instrucciones.

Cambiar de nodo

El interruptor envía un En Mensaje de cadena cuando está activado; y envía uno fuera de Mensaje de cadena cuando está apagado. Este nodo publica en el Lampara de cuarto Tema. Su ESP8266 luego se suscribirá a ese tema para recibir sus mensajes. Edite las propiedades del nodo como se muestra en la imagen siguiente.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Nodo de salida MQTT

Este nodo está conectado al broker Mosquitto MQTT y publicado en Lampara de cuarto Tema. Complete los detalles como se muestra a continuación. Ingrese el tema al que desea suscribirse, establezca el valor de QoS y si desea conservar los mensajes o no.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

¿Qué son los mensajes retenidos en MQTT? mantener (verdadero o falso), ¿qué significa eso?

Un mensaje retenido es un mensaje MQTT normal con el indicador retenido establecido en verdadero. El intermediario almacena el último mensaje persistente y la QoS correspondiente para este tema. Cualquier cliente que se suscriba a un patrón de tema que coincida con el tema del mensaje retenido recibirá el mensaje retenido inmediatamente después de suscribirse. El intermediario sólo almacena un mensaje persistente por tema.

¿Por qué es útil? Los mensajes retenidos ayudan a los clientes recién suscritos a recibir una actualización de estado inmediatamente después de suscribirse a un tema. Esto es particularmente útil para obtener el estado de un dispositivo. Por ejemplo, GPIO 2 está actualmente en ALTO y el ESP32 se reinicia repentinamente. No sabe cuál fue el último estado de GPIO 2. Sin embargo, si el estado es un mensaje retenido, lo recibirá inmediatamente después de suscribirse al tema y podrá actualizar el estado de GPIO 2 inmediatamente.

Nodo de entrada MQTT

Este nodo está suscrito a temperatura ambiente Tema sobre la recepción de datos del sensor de temperatura de ESP8266. El ESP8266 publica los valores de temperatura sobre este tema.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Nodos gráficos

El gráfico muestra las lecturas recibidas en el rTemperatura ambiente Tema.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Nodo de entrada MQTT

Este nodo está suscrito a Habitación/humedad Tema sobre la recepción de datos del sensor de humedad de ESP8266. El ESP8266 publicará los valores de humedad exactamente sobre este tema.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Nodo de medición

El medidor muestra las lecturas que están en el Habitación/humedad Tema. Edite las propiedades de medición como se muestra a continuación. Puedes ajustar el degradado como desees.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Conecte sus nodos como se muestra en la imagen a continuación.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Su aplicación Node-RED está lista. Haga clic en eso Insertar botón en la esquina superior derecha.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

La aplicación Node-RED está lista. Para ver cómo se ve su panel, vaya a http://Su dirección IP Pi:1880/Interfaz de usuario.

Ahora siga las siguientes secciones para preparar su ESP8266.

Estructura del circuito

Las siguientes secciones le mostrarán las piezas y los esquemas necesarios para construir el circuito de este proyecto.

Piezas requeridas

Estas son las piezas necesarias para construir el circuito (haga clic en los enlaces a continuación para encontrar el mejor precio en Asesor de creadores):

Puedes utilizar los enlaces anteriores o ir directamente MakerAdvisor.com/tools ¡Para encontrar todas las piezas para tus proyectos al mejor precio!

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Esquema

Aquí están los esquemas del circuito de este proyecto.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Preparando tu IDE de Arduino

Programamos el ESP8266 con el IDE de Arduino. Para cargar código a su ESP8266 usando el IDE de Arduino, necesita instalar el complemento ESP8266 (Cómo instalar la placa ESP8266 en el IDE de Arduino). También necesitarás instalar dos bibliotecas adicionales para tener todo listo para tu ESP8266.

Instalación de la biblioteca PubSubClient

El PubSubCliente La biblioteca proporciona un cliente para mensajes simples de publicación/suscripción con un servidor que admite MQTT (básicamente permite que su ESP8266 se comunique con Node-RED).

1) Haga clic aquí para descargar la biblioteca PubSubClientdeberías tener uno .Cremallera Carpeta en su carpeta de Descargas

2) En el IDE de Arduino, vaya a Sketch > Incluir biblioteca > Agregar biblioteca .ZIP y seleccione la biblioteca .Cremallera Carpeta que acaba de descargar.

3) Reinicie su IDE de Arduino.

La biblioteca contiene numerosos ejemplos. Consulte Archivo > Ejemplos > PubSubClient en el software Arduino IDE.

Instalación de la biblioteca de sensores DHT

Usamos el para leer el sensor DHT. Biblioteca DHT de AdafruitPara utilizar esta biblioteca también debes tener la Biblioteca de sensores unificada de AdafruitSiga los siguientes pasos para instalar estas bibliotecas.

1) Abra su IDE de Arduino y vaya a Bosquejo > incluir biblioteca > Administrar bibliotecas. El administrador de la biblioteca debería abrirse.

2) Buscar «DHT”en el cuadro de búsqueda e instale la biblioteca DHT de Adafruit.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

3) Después de instalar la biblioteca DHT de Adafruit, escriba «Sensor unificado de Adafruit”en el campo de búsqueda. Desplácese hacia abajo para buscar e instalar la biblioteca.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

4) Después de instalar las bibliotecas, reinicie su IDE de Arduino.

Para obtener más información sobre el sensor DHT11 y ESP8266, consulte Servidor web de temperatura y humedad ESP8266 DHT11/DHT22 con Arduino IDE.

Elegir la placa adecuada en Arduino IDE

También debes seleccionar la placa correcta en el IDE de Arduino:

1) Ir a Herramientas > tablón y seleccione la placa ESP8266 que está utilizando.

2) Seleccione el puerto COM correcto en Herramientas > Puerto.

Subir código

Ahora puede cargar el siguiente código en su ESP8266. Este código publica mensajes con la temperatura y humedad del sensor DHT11 en el temperatura ambiente Y Habitación/humedad Temas sobre el protocolo MQTT.

El ESP8266 está suscrito al Lampara de cuarto Tema para recibir los mensajes que publica la aplicación Node-RED sobre ese tema y encender o apagar la lámpara.

El código está bien comentado y señala dónde es necesario realizar cambios. Debe editar el código con sus credenciales de red (SSID y contraseña) y los detalles del corredor (dirección IP de Raspberry Pi, nombre de usuario y contraseña del corredor MQTT).

Este código también es compatible con otros sensores DHT: todo lo que necesita hacer es descomentar y descomentar las líneas correctas de código para seleccionar su sensor.

/*****
 
 All the resources for this project:
 
Home
*****/ #include <ESP8266WiFi.h> #include <PubSubClient.h> #include "DHT.h" // Uncomment one of the lines bellow for whatever DHT sensor type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT21 // DHT 21 (AM2301) //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 // Change the credentials below, so your ESP8266 connects to your router const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // MQTT broker credentials (set to NULL if not required) const char* MQTT_username = "REPLACE_WITH_MQTT_USERNAME"; const char* MQTT_password = "REPLACE_WITH_MQTT_PASSWORD"; // Change the variable to your Raspberry Pi IP address, so it connects to your MQTT broker const char* mqtt_server = "YOUR_BROKER_IP_ADDRESS"; //For example //const char* mqtt_server = "192.168.1.106"; // Initializes the espClient. You should change the espClient name if you have multiple ESPs running in your home automation system WiFiClient espClient; PubSubClient client(espClient); // DHT Sensor - GPIO 5 = D1 on ESP-12E NodeMCU board const int DHTPin = 5; // Lamp - LED - GPIO 4 = D2 on ESP-12E NodeMCU board const int lamp = 4; // Initialize DHT sensor. DHT dht(DHTPin, DHTTYPE); // Timers auxiliar variables long now = millis(); long lastMeasure = 0; // This functions connects your ESP8266 to your router void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("WiFi connected - ESP IP address: "); Serial.println(WiFi.localIP()); } // This function is executed when some device publishes a message to a topic that your ESP8266 is subscribed to // Change the function below to add logic to your program, so when a device publishes a message to a topic that // your ESP8266 is subscribed you can actually do something void callback(String topic, byte* message, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(); // Feel free to add more if statements to control more GPIOs with MQTT // If a message is received on the topic room/lamp, you check if the message is either on or off. Turns the lamp GPIO according to the message if(topic=="room/lamp"){ Serial.print("Changing Room lamp to "); if(messageTemp == "on"){ digitalWrite(lamp, HIGH); Serial.print("On"); } else if(messageTemp == "off"){ digitalWrite(lamp, LOW); Serial.print("Off"); } } Serial.println(); } // This functions reconnects your ESP8266 to your MQTT broker // Change the function below if you want to subscribe to more topics with your ESP8266 void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect /* YOU MIGHT NEED TO CHANGE THIS LINE, IF YOU'RE HAVING PROBLEMS WITH MQTT MULTIPLE CONNECTIONS To change the ESP device ID, you will have to give a new name to the ESP8266. Here's how it looks: if (client.connect("ESP8266Client")) { You can do it like this: if (client.connect("ESP1_Office")) { Then, for the other ESP: if (client.connect("ESP2_Garage")) { That should solve your MQTT multiple connections problem */ if (client.connect("ESP8266Client", MQTT_username, MQTT_password)) { Serial.println("connected"); // Subscribe or resubscribe to a topic // You can subscribe to more topics (to control more LEDs in this example) client.subscribe("room/lamp"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } // The setup function sets your ESP GPIOs to Outputs, starts the serial communication at a baud rate of 115200 // Sets your mqtt broker and sets the callback function // The callback function is what receives messages and actually controls the LEDs void setup() { pinMode(lamp, OUTPUT); dht.begin(); Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); } // For this project, you don't need to change anything in the loop function. Basically it ensures that you ESP is connected to your broker void loop() { if (!client.connected()) { reconnect(); } if(!client.loop()) client.connect("ESP8266Client", MQTT_username, MQTT_password); now = millis(); // Publishes new temperature and humidity every 30 seconds if (now - lastMeasure > 30000) { lastMeasure = now; // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float humidity = dht.readHumidity(); // Read temperature as Celsius (the default) float temperatureC = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) float temperatureF = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(humidity) || isnan(temperatureC) || isnan(temperatureF)) { Serial.println("Failed to read from DHT sensor!"); return; } // Publishes Temperature and Humidity values client.publish("room/temperature", String(temperatureC).c_str()); client.publish("room/humidity", String(humidity).c_str()); //Uncomment to publish temperature in F degrees //client.publish("room/temperature", String(temperatureF).c_str()); Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %"); Serial.print("Temperature: "); Serial.print(temperatureC); Serial.println(" ºC"); Serial.print(temperatureF); Serial.println(" ºF"); } }

Ver código sin formato

Después de cargar el código y tener la Raspberry Pi ejecutando su aplicación Node-RED y el broker Mosquitto, puede abrir el monitor serie Arduino IDE con una velocidad de baudios de 115200 y ver lo que sucede en tiempo real.

Esto es útil para comprobar si el ESP8266 se ha conectado correctamente a su enrutador y al corredor Mosquitto. También puede ver los mensajes que recibe y publica el ESP8266.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

demostración

¡Felicidades! Su proyecto ya está completo.

Ir a http://Su dirección IP Pi/interfaz de usuario para controlar el ESP con la aplicación Node-RED. Puede acceder a su aplicación en cualquier navegador en la misma red que su Pi (vea la demostración en video a continuación).

La aplicación debería parecerse a la siguiente imagen.

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Envolver

En este tutorial, le mostramos los conceptos básicos para encender luces y monitorear sensores en su ESP8266 usando el protocolo de comunicación Node-RED y MQTT. Puede seguir estos pasos básicos para crear proyectos más avanzados.

Tenemos más tutoriales de MQTT con otros sensores que pueden resultarle útiles:

  • ESP8266 NodeMCU MQTT – Publicar BME280 Valores de los sensores (Arduino IDE)
  • ESP8266 NodeMCU MQTT – Publicar DS18B20 Valores de temperatura (Arduino IDE)
  • ESP8266 NodeMCU MQTT – Publicar BME680 Valores de temperatura, humedad, presión y gas (Arduino IDE)

Esperamos que este tutorial te haya resultado útil.

Si te gusta este proyecto y la domótica, no dejes de consultar nuestro libro electrónico: SMART HOME con Raspberry Pi, ESP32 y ESP8266.

Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)

Aprende cómo publicar y suscribirte a temas MQTT con la placa ESP8266 NodeMCU. En este tutorial, utilizaremos el tablero Node-RED para controlar las salidas del ESP8266 y mostrar datos del sensor desde el ESP8266 en su interfaz. El software Node-RED se ejecuta en una Raspberry Pi, y la comunicación entre el ESP8266 y el software Node-RED se realiza mediante el protocolo de comunicación MQTT. Programaremos el ESP8266 utilizando Arduino IDE.

Visión general del proyecto

La figura siguiente muestra una visión general de lo que vamos a hacer en este tutorial.

Node-RED y Node-RED Dashboard

Para seguir este tutorial, necesitas tener Node-RED y Node-RED Dashboard instalados en tu Raspberry Pi. Sigue los siguientes tutoriales para instalar y comenzar a usar Node-RED y Node-RED Dashboard:

  1. Inicio con Node-RED en Raspberry Pi
  2. Inicio con Node-RED Dashboard

Protocolo MQTT

En este tutorial, estableceremos una comunicación entre una Raspberry Pi ejecutando el software Node-RED y un ESP8266 utilizando MQTT.

MQTT significa Telemetría MQTT y es un sistema ligero de publicación y suscripción donde puedes publicar y recibir mensajes como cliente. Es un protocolo de mensajería simple, diseñado para dispositivos limitados y con ancho de banda bajo. Por lo tanto, es la solución perfecta para aplicaciones de Internet de las cosas.

Si deseas obtener más información sobre MQTT, puedes ver el siguiente video.

Para obtener una versión escrita de este video y recursos adicionales, lee esta publicación de blog Qué es MQTT y cómo funciona.

Instalación de Mosquitto Broker

El broker MQTT es responsable de recibir todos los mensajes, filtrar los mensajes, decidir quién está interesado en ellos y luego publicar los mensajes a todos los clientes suscritos.

Existen varios brokers que puedes utilizar. En este tutorial, vamos a usar el Mosquitto Broker.

Puedes instalar el broker MQTT Mosquitto localmente en una Raspberry Pi, en tu computadora o en la nube. Sigue uno de los siguientes tutoriales para instalar el broker Mosquitto:

  1. Instalar Mosquitto MQTT Broker en una Raspberry Pi
  2. Instalar Mosquitto MQTT Broker en la Nube (Digital Ocean)

Para verificar si el broker Mosquitto se instaló correctamente, ejecuta el siguiente comando:

pi@raspberry:~ $ mosquitto -v

Esto devuelve la versión de Mosquitto que se está ejecutando en tu Raspberry Pi. Debe ser 2.0.11 o superior.

Nota: el comando de Mosquitto devuelve la versión de Mosquitto que está actualmente instalada, pero también intenta inicializar Mosquitto nuevamente. Dado que Mosquitto ya está en funcionamiento, muestra un mensaje de error. No te preocupes, Mosquitto está instalado y en funcionamiento correctamente si ves un mensaje similar.

Establecimiento de una comunicación MQTT con Node-RED

En esta sección, vamos a establecer una comunicación MQTT con Node-RED utilizando los nodos MQTT.

Disposición del panel

El primer paso es crear la disposición del panel. En este ejemplo, tendremos un botón para controlar una salida del ESP8266, un gráfico y un medidor para mostrar lecturas de temperatura y humedad del sensor DHT11.

En la esquina superior derecha, haz clic en el pequeño icono de flecha y haz clic en Dashboard.

En la pestaña Layout, crea una pestaña llamada Room, y dentro de la pestaña Room, crea dos grupos: Lamp y Sensor como se muestra en la figura.

Creación del flujo

Desde la sección de panel en la barra lateral izquierda, arrastra un nodo de interruptor, un nodo de gráfico y un nodo de medidor al flujo. Luego arrastra dos nodos MQTT in y un nodo MQTT out al flujo (se encuentran en la sección de red). Ver la figura.

  • Interruptor: controlará la salida del ESP8266
  • Nodo de salida de MQTT: publicará un mensaje al ESP8266 según el estado del interruptor
  • 2 nodos de entrada de MQTT: estos nodos estarán suscritos a los temas de temperatura y humedad para recibir datos del sensor del ESP
  • Gráfico: mostrará las lecturas del sensor de temperatura
  • Medidor: mostrará las lecturas del sensor de humedad

Node-RED y el broker MQTT necesitan estar conectados. Para conectar el broker MQTT a Node-RED, haz doble clic en el nodo de salida de MQTT. A continuación, sigue las instrucciones para editar las propiedades de los nodos.

Nodo de interruptor

El interruptor envía un mensaje de cadena on cuando está encendido, y envía un mensaje de cadena off cuando está apagado. Este nodo publicará en el tema room/lamp. Edita las propiedades del nodo como se muestra en la imagen.

Nodo de salida de MQTT

Este nodo está conectado al broker MQTT de Mosquitto y publicará en el tema room/lamp. Completa los detalles como se muestra a continuación. Inserta el tema al que deseas suscribirte, establece el valor de QoS y si deseas retener los mensajes o no.

Nodo de entrada de MQTT

Este nodo está suscrito al tema room/temperature para recibir datos del sensor de temperatura del ESP8266. El ESP8266 estará publicando las lecturas de temperatura en este tema exacto.

Nodo de gráfico

El gráfico mostrará las lecturas recibidas en el tema de temperatura de la habitación.

Nodo de entrada de MQTT

Este nodo está suscrito al tema room/humidity para recibir datos del sensor de humedad del ESP8266. El ESP8266 estará publicando las lecturas de humedad en este tema exacto.

Nodo de medidor

El medidor mostrará las lecturas recibidas en el tema de humedad de la habitación. Edita las propiedades del medidor como se muestra a continuación. Puedes ajustar el degradado de color a tu gusto.

Cablea tus nodos como se muestra en la figura. Tu aplicación de Node-RED está lista. Haz clic en el botón Deploy en la esquina superior derecha.

La aplicación de Node-RED está lista. Para ver cómo se ve tu tablero, ve a http://tu-direccion-ip-de-la-pi:1880/ui.

Ahora, sigue las siguientes secciones para preparar tu ESP8266.

Construir el circuito

Las siguientes secciones muestran las partes necesarias y los esquemas para construir el circuito de este proyecto.

Partes requeridas

Estas son las partes requeridas para construir el circuito:

  • Raspberry Pi – para obtener los mejores kits de inicio de Raspberry Pi 3, haz clic aquí
  • ESP8266 (ESP-12E NodeMCU) – para obtener los mejores tableros de desarrollo Wi-Fi ESP8266, haz clic aquí
  • Sensor de temperatura y humedad DHT11
  • Protoboard
  • Resistor de 330 Ω
  • LED
  • Resistencia de 4700 Ω

Puedes utilizar los enlaces anteriores o ir directamente a MakerAdvisor.com/tools para encontrar todas las piezas para tus proyectos al mejor precio.

Esquemáticos

Aquí tienes los esquemáticos para el circuito de este proyecto.

Preparación de tu Arduino IDE

Programaremos el ESP8266 utilizando el Arduino IDE. Para poder subir código a tu ESP8266 utilizando el Arduino IDE, necesitas instalar la extensión ESP8266 (Cómo instalar la placa ESP8266 en el Arduino IDE). También necesitarás instalar dos bibliotecas adicionales para tener todo listo para tu ESP8266.

Instalación de la librería PubSubClient

  • Haz clic aquí para descargar la librería PubSubClient. Deberías tener una carpeta .zip en tu carpeta de Descargas.
  • En el Arduino IDE, ve a Sketch > Include Library > Add .ZIP library y selecciona la carpeta .zip de la librería que acabas de descargar.
  • Reinicia tu Arduino IDE.

La biblioteca viene con varios ejemplos. Ve a Archivo > Ejemplos > PubSubClient dentro del software Arduino IDE.

Instalación de la librería del sensor DHT

  1. Abre tu Arduino IDE y ve a Sketch > Include Library > Manage Libraries. El Administrador de Librerías debería abrirse.
  2. Busca «DHT» en el cuadro de búsqueda e instala la librería DHT de Adafruit.
  3. Luego de instalar la librería DHT de Adafruit, escribe «Adafruit Unified Sensor» en el cuadro de búsqueda. Desplázate hasta el final para encontrar la librería e instálala.
  4. Después de instalar las librerías, reinicia tu Arduino IDE.

Para obtener más información sobre el sensor DHT11 y el ESP8266, lee Temperatura y Humedad del Servidor Web ESP8266 DHT11/DHT22 con Arduino IDE.

Seleccionar la placa correcta en el Arduino IDE

  1. Ve a Herramientas > Placa y selecciona el ESP8266 que estás utilizando.
  2. Selecciona el puerto COM correcto en Herramientas > Puerto.

Subir código

Ahora, puedes cargar el siguiente código en tu ESP8266. Este código publicará mensajes con la temperatura y humedad del sensor DHT11 en los temas de temperatura y humedad de la habitación a través del protocolo MQTT.

El ESP8266 está suscrito al tema room/lamp para recibir los mensajes publicados en ese tema por la aplicación Node-RED, para encender o apagar la lámpara.

El código está bien comentado donde necesitas hacer cambios. Debes editar el código con tus credenciales de red (SSID y contraseña) y detalles del broker (dirección IP de la Raspberry Pi, nombre de usuario y contraseña del broker MQTT.

Este código también es compatible con otros sensores DHT – simplemente debes descomentar y comentar las líneas de código correctas para elegir tu sensor.


// Código en C++ incluyendo las librerías requeridas
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"

// Descomenta una de las líneas a continuación para el tipo de sensor DHT que estás usando
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Cambia las credenciales a continuación para que tu ESP8266 se conecte a tu enrutador
const char* ssid = "REEMPLAZAR_POR_TU_SSID";
const char* password = "REEMPLAZAR_POR_TU_CONTRASEÑA";

// Credenciales del broker MQTT (pon NULL si no es necesario)
const char* MQTT_username = "REEMPLAZAR_CON_NOMBRE_DE_USUARIO_MQTT";
const char* MQTT_password = "REEMPLAZAR_CON_CONTRASEÑA_MQTT";

// Cambia la variable a la dirección IP de tu Raspberry Pi, para que se conecte a tu broker MQTT
const char* mqtt_server = "DIRECCION_IP_DE_TU_BROKER";
// Por ejemplo
// const char* mqtt_server = "192.168.1.106";

// Inicializa el espClient. Debes cambiar el nombre espClient si tienes varias ESP ejecutándose en tu sistema de automatización del hogar
WiFiClient espClient;
PubSubClient client(espClient);

// Sensor DHT - GPIO 5 = D1 en la placa ESP-12E NodeMCU
const int DHTPin = 5;

// Lámpara - LED - GPIO 4 = D2 en la placa ESP-12E NodeMCU
const int lamp = 4;

// Inicializa el sensor DHT
DHT dht(DHTPin, DHTTYPE);

// Variables auxiliares de temporizadores
long now = millis();
long lastMeasure = 0;

// Esta función conecta tu ESP8266 a tu enrutador
void setup_wifi() {
  delay(10);
  // Empezamos conectándonos a una red WiFi
  Serial.println();
  Serial.print("Conectando a ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi conectado - Dirección IP de ESP: ");
  Serial.println(WiFi.localIP());
}

// Esta función se ejecuta cuando algún dispositivo publica un mensaje en un tema al que tu ESP8266 está suscrito
// Cambia la función a continuación para agregar lógica a tu programa, para que cuando un dispositivo publique un mensaje en un tema al que
// Tu ESP8266 está suscrito, puedas hacer realmente algo
void callback(String topic, byte* message, unsigned int length) {
  Serial.print("Mensaje llegó en el tema: ");
  Serial.print(topic);
  Serial.print(". Mensaje: ");
  String messageTemp;

  for (int i = 0; i < length; i++) {
    Serial.print((char) message[i]);
    messageTemp += (char) message[i];
  }
  Serial.println();

  // Si se recibe un mensaje en el tema de room/lamp, comprueba si el mensaje es on u off. Cambia el estado de la lámpara según el mensaje
  if (topic == "room/lamp") {
      Serial.print("Cambiando lámpara de la habitación a ");
      if (messageTemp == "on") {
        digitalWrite(lamp, HIGH);
        Serial.print("Encendido");
      } else if (messageTemp == "off") {
        digitalWrite(lamp, LOW);
        Serial.print("Apagado");
      }
  }
  Serial.println();
}

// Esta función vuelve a conectar tu ESP8266 al broker MQTT
// Cambia la función a continuación si deseas suscribirte a más temas con tu ESP8266
void reconnect() {
  // Bucle hasta que nos volvamos a conectar
  while (!client.connected()) {
    Serial.print("Intentando conexión MQTT...");
    // Intenta conectar
    /*
     PUEDES NECESITAR CAMBIAR ESTA LÍNEA, SI TIENES PROBLEMAS CON MÚLTIPLES CONEXIONES MQTT
     Para cambiar el ID del dispositivo ESP, deberás dar un nuevo nombre al ESP8266.
     Así es como luce:
       if (client.connect("ESP8266Client")) {
     Puedes hacerlo así:
       if (client.connect("ESP1_Oficina")) {
     Luego, para el otro ESP:
       if(client.connect("ESP2_Garaje")) {
      Eso debería resolver tu problema de múltiples conexiones MQTT
    */
    if (client.connect("ESP8266Client", MQTT_username, MQTT_password)) {
      Serial.println("conectado");  
      // Suscríbete o vuelve a suscribirte a un tema
      // Puedes suscribirte a más temas (para controlar más LEDs en este ejemplo)
      client.subscribe("room/lamp");
    } else {
      Serial.print("falló, rc=");
      Serial.print(client.state());
      Serial.println(" intenta de nuevo en 5 segundos");
      // Espera 5 segundos antes de intentar nuevamente
      delay(5000);
    }
  }
}

// La función de configuración configura tus GPIOs de ESP como Salidas, inicia la comunicación serial con una velocidad de baudios de 115200
// Configura tu broker MQTT y establece la función de devolución de llamada
// La función de devolución de llamada es la que recibe los mensajes y realmente controla los LEDs
void setup() {
  pinMode(lamp, OUTPUT);

  dht.begin();

  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

}

// Para este proyecto, no es necesario cambiar nada en la función de bucle. Básicamente asegura que tu ESP est

4 comentarios en «ESP8266 y Node-RED con MQTT (Publicar y Suscribirse)»

Deja un comentario