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 ESP32 y MQTT
Tenemos un tutorial detallado sobre cómo usar ESP32 con MQTT aquí:
Dos placas ESP32 pueden comunicarse entre sí a través de un servidor MQTT. Si desea que se comuniquen directamente sin usar un servidor MQTT, consulte el tutorial sobre la comunicación TCP entre ESP32 y ESP32 (Cliente/Servidor).
Cuando ESP32 #1 y ESP32 #2 intercambian datos a través de un broker MQTT:
Ambos ESP32s se conectan al broker MQTT.
Para permitir que ESP32 #2 envíe datos a ESP32 #1:
ESP32 #1 se suscribe a un tema, por ejemplo: esp32-1/data.
ESP32 #2 puede enviar datos a ESP32 #1 publicando los datos en el tema al que ESP32 #1 está suscrito.
Del mismo modo, para que ESP32 #1 envíe datos a ESP32 #2:
ESP32 #2 se suscribe a un tema, por ejemplo: esp32-2/data.
ESP32 #1 puede enviar datos a ESP32 #2 publicando los datos en el tema al que ESP32 #2 está suscrito.
Siguiendo este método, dos ESP32 pueden intercambiar datos de forma bidireccional.
Ejemplo de caso de uso
Realicemos la siguiente aplicación: un botón/conmutador conectado a ESP32 #1 controla un LED conectado a ESP32 #2 mediante MQTT.
Como se mencionó anteriormente, hay algunos protocolos de aplicación que podemos usar. En este ejemplo, para simplificar, definiremos un protocolo por nosotros mismos (un protocolo autodefinido).
Cómo funciona
Definamos un protocolo sencillo:
Tanto ESP32 #1 como ESP32 #2 se conectan a un broker MQTT (servidor MQTT).
Para ESP32 #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 ESP32 #2:
Se suscribe al mismo tema.
Si ESP32 #2 recibe un mensaje MQTT con una carga útil de 1, enciende un LED.
Si ESP32 #2 recibe un mensaje MQTT con una carga útil de 0, apaga el LED.
Diagrama de cableado
ESP32 #1 - Diagrama de cableado entre ESP32 y botón
This image is created using Fritzing. Click to enlarge image
Si no sabe c\u00f3mo alimentar ESP32 y otros componentes, encuentre instrucciones en el siguiente tutorial: C\u00f3mo alimentar ESP32.
ESP32 #2 - Diagrama de cableado entre ESP32 y LED
This image is created using Fritzing. Click to enlarge image
Comunicación entre dos ESP32 mediante MQTT
Código ESP32 #1
/* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp32/esp32-to-esp32-mqtt-communication*/// ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER#include <WiFi.h>#include <MQTTClient.h>#include <ezButton.h>#define BUTTON_PIN 21 // ESP32 pin GPIO21 connected to buttonconstchar WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSIDconstchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORDconstchar 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 ADDRESSconstint MQTT_PORT = 1883;constchar MQTT_CLIENT_ID[] = "esp32-001"; // CHANGE IT AS YOU DESIREconstchar MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not requiredconstchar MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required// The MQTT topics that ESP32 should publish/subscribeconstchar MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIREWiFiClient network;MQTTClientmqtt = MQTTClient(256);ezButtonbutton(BUTTON_PIN); // create ezButton that attach to pin 7voidsetup() {Serial.begin(9600);button.setDebounceTime(100); // set debounce time to 100 millisecondsSerial.println("ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER");WiFi.mode(WIFI_STA);WiFi.begin(WIFI_SSID, WIFI_PASSWORD);Serial.println("ESP32 - Connecting to Wi-Fi");while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("."); }Serial.println(); connectToMQTT();}voidloop() {mqtt.loop();button.loop(); // MUST call the loop() function firstif (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 brokermqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network);Serial.print("ESP32 - 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("ESP32 - MQTT broker Timeout!");return; }Serial.println("ESP32 - MQTT broker Connected!");}void sendToMQTT(charcommand) {char messageBuffer[1]; messageBuffer[0] = command;mqtt.publish(MQTT_TOPIC, messageBuffer);Serial.println("ESP32 - sent to MQTT:");Serial.print("- topic: ");Serial.println(MQTT_TOPIC);Serial.print("- payload:");Serial.println(messageBuffer);}
Código ESP32 #2
/* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp32/esp32-to-esp32-mqtt-communication*/// ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER#include <WiFi.h>#include <MQTTClient.h>#define LED_PIN 18 // ESP32 pin GPIO18 connected to LEDconstchar WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSIDconstchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORDconstchar 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 ADDRESSconstint MQTT_PORT = 1883;constchar MQTT_CLIENT_ID[] = "esp32-002"; // CHANGE IT AS YOU DESIREconstchar MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not requiredconstchar MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required// The MQTT topics that ESP32 should publish/subscribeconstchar MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIREWiFiClient network;MQTTClientmqtt = MQTTClient(256);voidsetup() {Serial.begin(9600);pinMode(LED_PIN, OUTPUT);Serial.println("ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER");WiFi.mode(WIFI_STA);WiFi.begin(WIFI_SSID, WIFI_PASSWORD);Serial.println("ESP32 - Connecting to Wi-Fi");while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("."); }Serial.println(); connectToMQTT();}voidloop() {mqtt.loop();}void connectToMQTT() {// Connect to the MQTT brokermqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network);// Create a handler for incoming messagesmqtt.onMessage(messageReceived);Serial.print("ESP32 - 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("ESP32 - MQTT broker Timeout!");return; }// Subscribe to a topic, the incoming messages are processed by messageReceived() functionif (mqtt.subscribe(MQTT_TOPIC))Serial.print("ESP32 - Subscribed to the topic: ");elseSerial.print("ESP32 - Failed to subscribe to the topic: ");Serial.println(MQTT_TOPIC);Serial.println("ESP32 - MQTT broker Connected!");}void messageReceived(String &topic, String &payload) {Serial.println("ESP32 - received from MQTT:");Serial.println("- topic: " + topic);Serial.print("- payload: ");Serial.println(payload);charcommand = payload[0];if (command == '1') {Serial.print("- Received command: ");Serial.print(command);Serial.println(" => Turned LED on");digitalWrite(LED_PIN, HIGH); // Turn LED on } elseif (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); }}
Abre el Administrador de Bibliotecas haciendo clic en el icono de 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.
Escribe ezButton en la barra de búsqueda, luego encuentra la biblioteca de botones de ArduinoGetStarted
Haz clic en el botón Instalar para instalar la biblioteca ezButton.
Selecciona la placa ESP32 correcta (p. ej. ESP32 Dev Module).
Conecta ESP32 #1 al PC mediante un cable USB y selecciona el puerto COM de ESP32 #1 en Arduino IDE #1
Conecta ESP32 #2 al PC mediante un cable USB y selecciona el puerto COM de ESP32 #2 en Arduino IDE #2
Copia el código de ESP32 #1, pégalo en Arduino IDE #1 y guárdalo (con nombre ESP32-1)
Copia el código de ESP32 #2, pégalo en Arduino IDE #2 y guárdalo (con nombre ESP32-2)
Reemplaza la información de WiFi (SSID y contraseña) en ambos códigos con la tuya.
Reemplaza la dirección del broker MQTT en ambos códigos (nombre de dominio o dirección IP).
Carga el código de ESP32 #1 a ESP32 #1
Carga el código de ESP32 #2 a ESP32 #2
Abre el Monitor Serial en Arduino IDE #1
Abre el Monitor Serial en Arduino IDE #2
Mantén presionado el botón en ESP32 #1; observa el estado del LED en ESP32 #2 (ENCENDIDO)
Suelta el botón en ESP32 #1; observa el estado del LED en ESP32 #2 (APAGADO)
Presiona, mantén presionado y suelta el botón varias veces.
Ver la salida en ambos Monitores Serial
Monitor Serial de ESP32 #1
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER
ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID
ESP32 - Connecting to MQTT broker
ESP32 - MQTT broker Connected!
- The button is pressed, send command: 1
ESP32 - sent to MQTT:
- topic: esp32/command
- payload:1
- The button is released, send command: 0
ESP32 - sent to MQTT:
- topic: esp32/command
- payload:0
Ln 11, Col 1
ESP32 Dev Module on COM15
2
Monitor de serie del ESP32 #2
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER
ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID
ESP32 - Connecting to MQTT broker
ESP32 - Subscribed to the topic: esp32/command
ESP32 - MQTT broker Connected!
ESP32 - received from MQTT:
- topic: esp32/command
- payload: 1
- Received command: 1 => Turned LED on
ESP32 - received from MQTT:
- topic: esp32/command
- payload: 0
- Received command: 0 => Turned LED off
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!