Comunicação MQTT de ESP32 para ESP32

Neste tutorial, vamos abordar os seguintes tópicos:

comunicação entre dois esp32 via MQTT

Hardware Necessário

2×Módulo de Desenvolvimento ESP32 ESP-WROOM-32
2×Cabo USB Tipo-C
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para ESP32
1×(Recomendado) Breakout Expansion Board for ESP32
1×(Recomendado) Divisor de Alimentação para ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables ESP32 S3 Starter Kit (ESP32 S3 included)
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.

Sobre ESP32 e MQTT

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

Comunicação entre dois ESP32 via MQTT

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

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

  • Os dois ESP32 se conectam ao broker MQTT.
  • Para permitir que o ESP32 #2 envie dados ao ESP32 #1:
    • O ESP32 #1 se inscreve (subscribe) em um tópico, por exemplo: esp32-1/data.
    • O ESP32 #2 pode enviar dados ao ESP32 #1 publicando os dados no tópico em que o ESP32 #1 está inscrito.
  • Da mesma forma, para o ESP32 #1 enviar dados ao ESP32 #2:
    • O ESP32 #2 se inscreve em um tópico, como: esp32-2/data.
    • O ESP32 #1 pode enviar dados ao ESP32 #2 publicando os dados no tópico em que o ESP32 #2 está inscrito.

    Seguindo esse método, dois ESP32 podem trocar dados nos dois sentidos.

Exemplo de Caso de Uso

Vamos realizar a seguinte aplicação: um botão/chave conectado ao ESP32 #1 controla um LED conectado ao ESP32 #2 via MQTT.

comunicação entre dois esp32

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

Como Funciona

Vamos definir um protocolo simples:

  • O ESP32 #1 e o ESP32 #2 se conectam a um Broker MQTT (servidor MQTT).
  • Para o ESP32 #1:
    • Ele publica uma mensagem MQTT em um tópico específico sempre que o estado de uma chave muda.
    • Quando o botão/chave é ligado, o payload da mensagem MQTT é definido como 1.
    • Quando o botão/chave é desligado, o payload da mensagem MQTT é definido como 0.
  • Para o ESP32 #2:
    • Ele se inscreve no mesmo tópico.
    • Se o ESP32 #2 receber uma mensagem MQTT com payload 1, ele acende um LED.
    • Se o ESP32 #2 receber uma mensagem MQTT com payload 0, ele apaga o LED.

    Diagrama de Ligação

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

    This image is created using Fritzing. Click to enlarge image

    Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.

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

    This image is created using Fritzing. Click to enlarge image

Comunicação entre dois ESP32 via MQTT

Código ESP32 #1

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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 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[] = "esp32-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 ESP32 should publish/subscribe const char MQTT_TOPIC[] = "esp32/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("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(); } 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("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(char command) { 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 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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 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[] = "esp32-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 ESP32 should publish/subscribe const char MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { 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(); } 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("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() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("ESP32 - Subscribed to the topic: "); else Serial.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); 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

  • Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para ESP32 no Arduino IDE.
  • Abra dois Arduino IDE no seu PC.
  • Ligue um botão/chave ao ESP32 #1
  • Ligue um LED ao ESP32 #2
  • Abra o Library Manager clicando no ícone Library Manager na barra de navegação à esquerda do 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 do ESP32
  • Digite ezButton na caixa de pesquisa e encontre a biblioteca de botão de ArduinoGetStarted
  • Clique no botão Install para instalar a biblioteca ezButton.
Biblioteca de botão do ESP32
  • Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module).
  • Conecte o ESP32 #1 ao PC por cabo USB e selecione a porta COM do ESP32 #1 no Arduino IDE #1
  • Conecte o ESP32 #2 ao PC por cabo USB e selecione a porta COM do ESP32 #2 no Arduino IDE #2
  • Copie o código do ESP32 #1, cole no Arduino IDE #1 e salve (com o nome ESP32-1)
  • Copie o código do ESP32 #2, cole no Arduino IDE #2 e salve (com o nome ESP32-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 upload do código do ESP32 #1 para o ESP32 #1
  • Faça upload do código do ESP32 #2 para o ESP32 #2
  • Abra o Serial Monitor no Arduino IDE #1
  • Abra o Serial Monitor no Arduino IDE #2
  • Pressione e segure o botão do ESP32 #1 → veja o estado do LED no ESP32 #2 (ON)
  • Solte o botão do ESP32 #1 → veja o estado do LED no ESP32 #2 (OFF)
  • Pressione, segure e solte o botão várias vezes.
  • Veja a saída nos dois Serial Monitors
    • Serial Monitor do ESP32 #1
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    ESP32 Dev Module
    Newbiely.ino
    ···
    8 Serial.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
    • Serial Monitor do ESP32 #2
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    ESP32 Dev Module
    Newbiely.ino
    ···
    8 Serial.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
    Ln 11, Col 1
    ESP32 Dev Module 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!