Comunicação MQTT de Arduino para Arduino

Neste tutorial, vamos aprender:

comunicação entre dois arduinos via MQTT

Hardware Necessário

2×Arduino UNO R4 WiFi
2×Cabo USB Tipo-C
1×(Recomendado) Shield com Bornes de Parafuso para Arduino Uno R4
1×(Recomendado) Sensors/Servo Expansion Shield for Arduino UNO R4
1×(Recomendado) Shield de Protoboard para Arduino Uno R4
1×(Recomendado) Case para Arduino Uno R4
1×(Recomendado) Divisor de Alimentação para Arduino Uno R4
1×(Recomendado) Placa Base de Prototipagem e Kit de Protoboard para Arduino Uno

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.
Arduino Uno R4 WiFi Compatible Boards

Sobre Arduino e MQTT

Temos um tutorial detalhado sobre como usar o Arduino com MQTT aqui:

Comunicação entre dois Arduinos via MQTT

Duas placas Arduino podem se comunicar entre si por meio de um servidor MQTT. Se você quiser que dois Arduinos se comuniquem diretamente sem usar um servidor MQTT, consulte o tutorial sobre comunicação Cliente/Servidor TCP de Arduino para Arduino.

Quando o Arduino #1 e o Arduino #2 trocam dados por meio de um broker MQTT:

  • Os dois Arduinos se conectam ao broker MQTT.
  • Para o Arduino #2 enviar dados ao Arduino #1:
    • O Arduino #1 se inscreve em um tópico, por exemplo: arduino-1/data.
    • O Arduino #2 pode enviar dados ao Arduino #1 publicando os dados no tópico em que o Arduino #1 está inscrito.
  • Da mesma forma, para o Arduino #1 enviar dados ao Arduino #2:
    • O Arduino #2 se inscreve em um tópico, por exemplo: arduino-2/data.
    • O Arduino #1 pode enviar dados ao Arduino #2 publicando os dados no tópico em que o Arduino #2 está inscrito.

    Seguindo este método, dois Arduinos podem trocar dados nos dois sentidos.

Exemplo de Caso de Uso

Vamos fazer a seguinte aplicação: um botão/interruptor conectado ao Arduino #1 controla um LED conectado ao Arduino #2 via MQTT.

comunicação entre dois arduinos

Existem vários protocolos de aplicação que podemos usar. Neste exemplo, para simplificar, vamos definir um protocolo por conta própria (um protocolo próprio)

Protocolo Próprio

Vamos definir um protocolo simples:

  • O Arduino #1 e o Arduino #2 se conectam ao Broker MQTT (servidor MQTT)
  • Arduino #1:
    • O Arduino #1 publica uma mensagem MQTT em um tópico quando o estado do interruptor muda.
    • Quando o botão/interruptor é colocado em ligado, o payload da mensagem MQTT é 1.
    • Quando o botão/interruptor é colocado em desligado, o payload da mensagem MQTT é 0.
  • Arduino #2:
    • O Arduino #2 se inscreve no tópico
    • Se o Arduino #2 receber uma mensagem MQTT com payload 1, ele liga o LED
    • Se o Arduino #2 receber uma mensagem MQTT com payload 0, ele desliga o LED

    Diagrama de Ligação

    • Arduino #1 - Diagrama de ligação entre o Arduino e o botão
    Diagrama de Ligação do Botão com Arduino

    This image is created using Fritzing. Click to enlarge image

    • Arduino #2 - Diagrama de ligação entre o Arduino e o LED
    Diagrama de Ligação do LED com Arduino

    This image is created using Fritzing. Click to enlarge image

Comunicação entre dois Arduinos via MQTT

Código Arduino #1

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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 Arduino #2

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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); } }

Passos Rápidos

  • Ligue um botão/interruptor ao Arduino #1
  • Ligue um LED ao Arduino #2
  • Abra a Arduino IDE (chamada de Arduino IDE #1)
  • Abra outra janela da Arduino IDE (chamada de Arduino IDE #2) clicando no ícone da Arduino IDE no seu PC (importante!)
  • Abra o Library Manager clicando no ícone Library Manager na barra de navegação à esquerda da Arduino IDE
  • Digite MQTT na caixa de pesquisa e procure a biblioteca MQTT de Joel Gaehwiler.
  • Clique no botão Install para instalar a biblioteca MQTT.
Biblioteca MQTT para Arduino
  • Digite ezButton na caixa de pesquisa e encontre a biblioteca de botão da ArduinoGetStarted
  • Clique no botão Install para instalar a biblioteca ezButton.
Biblioteca de botão para Arduino
  • Conecte o Arduino #1 ao PC via cabo USB e selecione a porta COM do Arduino #1 na Arduino IDE #1
  • Conecte o Arduino #2 ao PC via cabo USB e selecione a porta COM do Arduino #2 na Arduino IDE #2
  • Copie o código do Arduino #1, cole na Arduino IDE #1 e salve (com o nome Arduino-1)
  • Copie o código do Arduino #2, cole na Arduino IDE #2 e salve (com o nome Arduino-2)
  • Substitua as informações de WiFi (SSID e senha) nos dois códigos pelas suas.
  • Substitua o endereço do broker MQTT nos dois códigos (nome de domínio ou endereço IP).
  • Faça o upload do código do Arduino #1 para o Arduino #1
  • Faça o upload do código do Arduino #2 para o Arduino #2
  • Abra o Serial Monitor na Arduino IDE #1
  • Abra o Serial Monitor na Arduino IDE #2
  • Pressione e segure o botão no Arduino #1 → veja o estado do LED no Arduino #2 (ON)
  • Solte o botão no Arduino #1 → veja o estado do LED no Arduino #2 (OFF)
  • Pressione, segure e solte o botão várias vezes.
  • Veja a saída nos dois Serial Monitors
    • Serial Monitor do Arduino #1
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Uno
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Uno' on 'COM15')
    New Line
    9600 baud
    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
    Ln 11, Col 1
    Arduino Uno on COM15
    2
    • Serial Monitor do Arduino #2
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Uno
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Uno' on 'COM15')
    New Line
    9600 baud
    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
    Ln 11, Col 1
    Arduino Uno on COM15
    2

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!