Comunicación MQTT entre Arduinos

En este tutorial, vamos a aprender:

comunicación entre dos placas Arduino mediante MQTT

Hardware Requerido

2×Arduino UNO R4 WiFi
2×Cable USB Tipo-C
1×(Recomendado) Shield de Bloque de Terminales de Tornillo para Arduino Uno R4
1×(Recomendado) Shield de Protoboard para Arduino Uno R4
1×(Recomendado) Carcasa para Arduino Uno R4
1×(Recomendado) Divisor de Alimentación para Arduino Uno R4
1×(Recomendado) Placa Base de Prototipado y Kit de Protoboard para Arduino Uno

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 Arduino y MQTT

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

Comunicación entre dos Arduinos mediante MQTT

Dos placas Arduino pueden comunicarse entre sí a través de un servidor MQTT. Si desea que dos Arduinos se comuniquen directamente sin usar un servidor MQTT, consulte el tutorial sobre comunicación TCP Cliente/Servidor entre Arduino.

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

  • Ambos Arduinos se conectan al broker MQTT.
  • Para lograr que Arduino #2 envíe datos a Arduino #1:
    • Arduino #1 se suscribe a un tema, por ejemplo: arduino-1/data.
    • Arduino #2 puede enviar datos a Arduino #1 publicando los datos en el tema al que Arduino #1 está suscrito.
  • De manera similar, para que Arduino #1 envíe datos a Arduino #2:
    • Arduino #2 se suscribe a un tema, por ejemplo: arduino-2/data.
    • Arduino #1 puede enviar datos a Arduino #2 publicando los datos en el tema al que Arduino #2 está suscrito.

    Siguiendo este método, dos Arduinos pueden intercambiar datos de forma bidireccional.

Ejemplo de caso de uso

Realicemos la siguiente aplicación: Un botón o interruptor conectado al Arduino #1 controla un LED conectado al Arduino #2 mediante MQTT.

comunicación entre dos Arduinos

Como se mencionó anteriormente, 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).

Protocolo definido por uno mismo

Definamos un protocolo simple:

  • Arduino #1 y Arduino #2 se conectan al Broker MQTT (servidor MQTT)
  • Arduino #1:
    • Arduino #1 publica un mensaje MQTT a un tema cuando cambia el estado del interruptor.
    • Cuando el botón/interruptor se enciende, la carga útil del mensaje MQTT es 1.
    • Cuando el botón/interruptor se apaga, la carga útil del mensaje MQTT es 0.
  • Arduino #2:
    • Arduino #2 se suscribe al tema
    • Si Arduino #2 recibe un mensaje MQTT con carga útil de 1, enciende el LED
    • Si Arduino #2 recibe un mensaje MQTT con carga útil de 0, apaga el LED

    Diagrama de cableado

    • Arduino nº 1 - Diagrama de cableado entre Arduino y botón
    Diagrama de cableado del botón de Arduino

    This image is created using Fritzing. Click to enlarge image

    • Arduino #2 - Diagrama de cableado entre Arduino y LED
    Diagrama de cableado de LED de Arduino

    This image is created using Fritzing. Click to enlarge image

Comunicación entre dos Arduinos vía MQTT

Código de Arduino #1

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-to-arduino-mqtt-communication */ // ARDUINO #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <WiFiS3.h> #include <MQTTClient.h> #include <ezButton.h> const int BUTTON_PIN = 7; 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[] = "arduino-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 Arduino should publish/subscribe const char MQTT_TOPIC[] = "arduino/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("ARDUINO #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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("Arduino - MQTT broker Timeout!"); return; } Serial.println("Arduino - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

Código de Arduino #2

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-to-arduino-mqtt-communication */ // ARDUINO #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <WiFiS3.h> #include <MQTTClient.h> const int LED_PIN = 9; 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[] = "arduino-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 Arduino should publish/subscribe const char MQTT_TOPIC[] = "arduino/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ARDUINO #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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("Arduino - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("Arduino - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("Arduino - 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

  • Conecta un botón/interruptor a Arduino #1
  • Conecta un LED a Arduino #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!())
  • Abre el Gestor de Bibliotecas haciendo 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 de Arduino
  • 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.
Librería de botones para Arduino
  • Conecta Arduino #1 al PC mediante un cable USB y selecciona el puerto COM de Arduino #1 en el IDE de Arduino #1
  • Conecta Arduino #2 al PC mediante un cable USB y selecciona el puerto COM de Arduino #2 en el IDE de Arduino #2
  • Copia el código de Arduino #1, pégalo en el IDE de Arduino #1 y guárdalo (llamado Arduino-1)
  • Copia el código de Arduino #2, pégalo en el IDE de Arduino #2 y guárdalo (llamado Arduino-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 IP).
  • Sube el código de Arduino #1 a Arduino #1
  • Sube el código de Arduino #2 a Arduino #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 el botón en Arduino #1 → observa el estado del LED en Arduino #2 (ENCENDIDO)
  • Suelta el botón en Arduino #1 → observa el estado del LED en Arduino #2 (APAGADO)
  • Presiona, mantén y suelta el botón varias veces.
  • Ver la salida en ambos monitores seriales
    • Monitor Serial de Arduino #1
    COM6
    Send
    Arduino #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER Arduino - Attempting to connect to SSID: YOUR_WIFI_SSID IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - MQTT broker Connected! - The button is pressed, send command: 1 Arduino - sent to MQTT: - topic: arduino/command - payload:1 - The button is released, send command: 0 Arduino - sent to MQTT: - topic: arduino/command - payload:0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Monitor Serial de Arduino #2
    COM6
    Send
    Arduino #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER Arduino - Attempting to connect to SSID: YOUR_WIFI_SSID IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: arduino/command Arduino - MQTT broker Connected! Arduino - received from MQTT: - topic: arduino/command - payload: 1 - Received command: 1 => Turned LED on Arduino - received from MQTT: - topic: arduino/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!