Comunicación MQTT entre ESP8266 y ESP8266

En este tutorial, cubriremos lo siguiente:

Comunicación entre dos ESP8266 NodeMCU a través de MQTT

Hardware Requerido

2×ESP8266 NodeMCU
2×Cable Micro USB
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 de ESP8266 y MQTT

Tenemos un tutorial detallado sobre cómo usar ESP8266 con MQTT aquí:

Comunicación entre dos ESP8266 vía MQTT

Dos placas ESP8266 pueden comunicarse entre sí usando un servidor MQTT. Si prefieres una comunicación directa entre dos ESP8266 sin depender de un servidor MQTT, consulta el tutorial sobre la comunicación TCP Cliente/Servidor entre ESP8266.

Cuando ESP8266 #1 y ESP8266 #2 intercambian datos a través de un broker MQTT:

  • Ambos ESP8266 se conectan al broker MQTT.
  • Para permitir que ESP8266 #2 envíe datos a ESP8266 #1:
    • ESP8266 #1 se suscribe a un tema, como: esp8266-1/data.
    • ESP8266 #2 puede transmitir datos a ESP8266 #1 publicándolos en el tema al que ESP8266 #1 está suscrito.
  • De manera similar, para permitir que ESP8266 #1 envíe datos a ESP8266 #2:
    • ESP8266 #2 se suscribe a un tema, como: esp8266-2/data.
    • ESP8266 #1 puede enviar datos a ESP8266 #2 publicándolos en el tema al que ESP8266 #2 está suscrito.

    Al seguir este enfoque, dos ESP8266 pueden intercambiar datos bidireccionalmente.

Ejemplo de caso de uso

Vamos a realizar la siguiente aplicación: Un botón o interruptor conectado a ESP8266 #1 controla un LED conectado a ESP8266 #2 a través de MQTT.

comunicación entre dos ESP8266 NodeMCU

Como se mencionó arriba, hay algunos protocolos de aplicación que podemos usar. En este ejemplo, para simplificarlo, definiremos un protocolo por nosotros mismos (un protocolo definido por nosotros mismos).

Cómo funciona

Definamos un protocolo sencillo:

  • Tanto ESP8266 #1 como ESP8266 #2 se conectan a un broker MQTT (servidor MQTT).
  • Para ESP8266 #1:
    • ESP8266 #1 publica un mensaje MQTT en un tema específico cada vez que cambia el estado de un interruptor.
    • Cuando el botón/interruptor se enciende, la carga útil del mensaje MQTT se establece en 1.
    • Cuando el botón/interruptor se apaga, la carga útil del mensaje MQTT se establece en 0.
  • Para ESP8266 #2:
    • ESP8266 #2 se suscribe al mismo tema.
    • Si ESP8266 #2 recibe un mensaje MQTT con una carga útil de 1, activa el LED.
    • Si ESP8266 #2 recibe un mensaje MQTT con una carga útil de 0, desactiva el LED.

    Diagrama de cableado

    • ESP8266 #1 - Diagrama de cableado entre ESP8266 y botón
    Diagrama de cableado del botón para 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.

    • ESP8266 #2 - Diagrama de cableado entre ESP8266 y LED
    Diagrama de cableado del LED ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

Comunicación entre dos ESP8266 mediante MQTT

Código ESP8266 #1

/* * 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-to-esp8266-mqtt-communication */ // ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN D7 // The ESP8266 pin connected to button const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp8266-001"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); ezButton button(BUTTON_PIN); // create ezButton that attach to pin 7 void setup() { Serial.begin(9600); button.setDebounceTime(100); // set debounce time to 100 milliseconds Serial.println("ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); button.loop(); // MUST call the loop() function first if (button.isPressed()) { Serial.println("- The button is pressed, send command: 1"); sendToMQTT('1'); } if (button.isReleased()) { Serial.println("- The button is released, send command: 0"); sendToMQTT('0'); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } Serial.println("ESP8266 - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

Código ESP8266 número 2

/* * 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-to-esp8266-mqtt-communication */ // ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <ESP8266WiFi.h> #include <MQTTClient.h> #define LED_PIN D6 // The ESP8266 pin connected to LED const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp8266-002"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageReceived); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("ESP8266 - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.print("- payload: "); Serial.println(payload); char command = payload[0]; if (command == '1') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => Turned LED on"); digitalWrite(LED_PIN, HIGH); // Turn LED on } else if (command == '0') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => Turned LED off"); digitalWrite(LED_PIN, LOW); // Turn LED off } else { Serial.print("- Received an unsupported command: "); Serial.println(command); } }

Pasos R\u00e1pidos

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

  • Consulta el cómo configurar el entorno para ESP8266 en Arduino IDE tutorial si es la primera vez que usas ESP8266.
  • Conecta los componentes tal como se muestran 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 (p. ej. NodeMCU 1.0 (Módulo ESP-12E)), y su puerto COM correspondiente.
  • Conecta un botón o interruptor a ESP8266 #1
  • Conecta un LED a ESP8266 #2
  • Abre Arduino IDE (llamado Arduino IDE #1)
  • Abre otra ventana de Arduino IDE (llamada Arduino IDE #2) haciendo clic en el icono de Arduino IDE en tu PC (¡importante!())
  • Haz clic en el icono Gestor de bibliotecas en la barra de navegación izquierda de Arduino IDE.
  • Escribe MQTT en la caja de búsqueda, luego busca la biblioteca MQTT de Joel Gaehwiler.
  • Haz clic en el botón Instalar para instalar la biblioteca MQTT.
Librería MQTT para ESP8266 NodeMCU
  • Escribe ezButton en la caja de búsqueda, luego encuentra la biblioteca de botones de ArduinoGetStarted.
  • Haz clic en el botón Instalar para instalar la biblioteca ezButton.
Biblioteca de botones para ESP8266 NodeMCU
  • Conecta ESP8266 #1 al PC mediante un cable USB y selecciona el puerto COM de ESP8266 #1 en el IDE de Arduino #1
  • Conecta ESP8266 #2 al PC mediante un cable USB y selecciona el puerto COM de ESP8266 #2 en el IDE de Arduino #2
  • Copia el código de ESP8266 #1, pégalo en el IDE de Arduino #1 y guárdalo (con el nombre ESP8266-1)
  • Copia el código de ESP8266 #2, pégalo en el IDE de Arduino #2 y guárdalo (con el nombre ESP8266-2)
  • Reemplaza la información de WiFi (SSID y contraseña) en ambos códigos por la tuya.
  • Reemplaza la dirección del broker MQTT en ambos códigos (nombre de dominio o dirección IP).
  • Sube el código de ESP8266 #1 al ESP8266 #1.
  • Sube el código de ESP8266 #2 al ESP8266 #2.
  • Abre el Monitor Serial en el IDE de Arduino #1
  • Abre el Monitor Serial en el IDE de Arduino #2
  • Presiona y mantén presionado el botón en ESP8266 #1 → observa el estado del LED en ESP8266 #2 (ENCENDIDO)
  • Suelta el botón en ESP8266 #1 → observa el estado del LED en ESP8266 #2 (APAGADO)
  • Presiona, mantén y suelta el botón varias veces.
  • Observa la salida en ambos monitores Serial
  • Monitor serie de ESP8266 #1
COM6
Send
ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - MQTT broker Connected! - The button is pressed, send command: 1 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:1 - The button is released, send command: 0 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:0
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Monitor Serial de ESP8266 #2
COM6
Send
ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266/command ESP8266 - MQTT broker Connected! ESP8266 - received from MQTT: - topic: esp8266/command - payload: 1 - Received command: 1 => Turned LED on ESP8266 - received from MQTT: - topic: esp8266/command - payload: 0 - Received command: 0 => Turned LED off
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ 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!