Comunicação entre dois Arduino Nano ESP32 via MQTT

Neste tutorial, vamos abordar o seguinte:

comunicação entre dois arduino via MQTT

Hardware Necessário

2×Arduino Nano ESP32
2×Cabo USB Tipo-C
1×Botão para Protoboard com Capa
1×Kit de Botões para Protoboard
1×Botão de Pressão para Painel
1×Módulo de Botão
1×LED Kit
1×LED (red)
1×LED Module
1×(Alternativa) Button and LED Kit
1×220Ω Resistor
1×Protoboard
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano ESP32

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.

Buy Note: Use the LED Module for easier wiring. It includes an integrated resistor.

Sobre o Arduino Nano ESP32 e o MQTT

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

Comunicação entre dois Arduino Nano ESP32 via MQTT

Duas placas Arduino Nano ESP32 podem se comunicar entre si usando um servidor MQTT. Se você preferir que elas se comuniquem diretamente, sem usar um servidor MQTT, consulte o tutorial sobre comunicação Cliente/Servidor TCP entre Arduino Nano ESP32 e Arduino Nano ESP32.

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

  • Os dois Arduino Nano ESP32 se conectam ao broker MQTT.
  • Para fazer o Arduino Nano ESP32 #2 enviar dados ao Arduino Nano ESP32 #1:
    • O Arduino Nano ESP32 #1 assina um tópico, por exemplo: arduino-nano-esp32-1/data.
    • O Arduino Nano ESP32 #2 pode enviar dados ao Arduino Nano ESP32 #1 publicando os dados no tópico que o Arduino Nano ESP32 #1 assinou.
  • Da mesma forma, para fazer o Arduino Nano ESP32 #1 enviar dados ao Arduino Nano ESP32 #2:
    • O Arduino Nano ESP32 #2 assina um tópico, por exemplo: arduino-nano-esp32-2/data.
    • O Arduino Nano ESP32 #1 pode enviar dados ao Arduino Nano ESP32 #2 publicando os dados no tópico que o Arduino Nano ESP32 #2 assinou.

    Seguindo este método, dois Arduino Nano ESP32 podem trocar dados de forma bidirecional.

Exemplo de Caso de Uso

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

comunicação entre dois arduino

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

Como Funciona

Vamos estabelecer um protocolo simples:

  • Tanto o Arduino Nano ESP32 #1 quanto o Arduino Nano ESP32 #2 se conectam a um Broker MQTT (servidor MQTT).
  • Para o Arduino Nano ESP32 #1:
    • O Arduino Nano ESP32 #1 envia uma mensagem MQTT para um tópico sempre que o estado de um interruptor muda.
    • Quando o botão ou interruptor é ligado, o payload da mensagem MQTT é definido como 1.
    • Quando o botão ou interruptor é desligado, o payload da mensagem MQTT é definido como 0.
  • Para o Arduino Nano ESP32 #2:
    • O Arduino Nano ESP32 #2 assina o tópico.
    • Se o Arduino Nano ESP32 #2 receber uma mensagem MQTT com payload 1, ele liga um LED.
    • Se o Arduino Nano ESP32 #2 receber uma mensagem MQTT com payload 0, ele desliga o LED.

    Diagrama de Ligação

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

    This image is created using Fritzing. Click to enlarge image

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

    This image is created using Fritzing. Click to enlarge image

Comunicação entre dois Arduino Nano ESP32 via MQTT

Código Arduino Nano ESP32 #1

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/communication-between-two-arduino-nano-esp32-via-mqtt */ // ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN D2 // The Arduino Nano ESP32 pin connected to the 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.5"; // 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("Arduino Nano ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("Arduino Nano 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("Arduino Nano 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("Arduino Nano ESP32 - MQTT broker Timeout!"); return; } Serial.println("Arduino Nano ESP32 - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("Arduino Nano ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

Código Arduino Nano ESP32 #2

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/communication-between-two-arduino-nano-esp32-via-mqtt */ // ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <WiFi.h> #include <MQTTClient.h> #define LED_PIN D5 // The Arduino Nano ESP32 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.5"; // 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("Arduino Nano ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("Arduino Nano 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("Arduino Nano 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("Arduino Nano ESP32 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("Arduino Nano ESP32 - Subscribed to the topic: "); else Serial.print("Arduino Nano ESP32 - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("Arduino Nano ESP32 - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("Arduino Nano 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

Para começar com o Arduino Nano ESP32, siga estes passos:

  • Se você é novo no Arduino Nano ESP32, consulte o tutorial sobre como configurar o ambiente para o Arduino Nano ESP32 na Arduino IDE.
  • Ligue os componentes de acordo com o diagrama fornecido.
  • Conecte a placa Arduino Nano ESP32 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Selecione a placa Arduino Nano ESP32 e a porta COM correspondente.
  • Ligue um botão/interruptor ao Arduino Nano ESP32 #1
  • Ligue um LED ao Arduino Nano ESP32 #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, depois procure a biblioteca MQTT de Joel Gaehwiler.
  • Clique no botão Install para instalar a biblioteca MQTT.
Biblioteca MQTT para Arduino Nano ESP32
  • Digite ezButton na caixa de pesquisa, depois encontre a biblioteca de botão de ArduinoGetStarted
  • Clique no botão Install para instalar a biblioteca ezButton.
Biblioteca de botão para Arduino Nano ESP32
  • Conecte o Arduino Nano ESP32 #1 ao PC por cabo USB e selecione a porta COM do Arduino Nano ESP32 #1 na Arduino IDE #1
  • Conecte o Arduino Nano ESP32 #2 ao PC por cabo USB e selecione a porta COM do Arduino Nano ESP32 #2 na Arduino IDE #2
  • Copie o código do Arduino Nano ESP32 #1, cole na Arduino IDE #1 e salve-o (com o nome Arduino Nano ESP32-1)
  • Copie o código do Arduino Nano ESP32 #2, cole na Arduino IDE #2 e salve-o (com o nome Arduino Nano 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).
  • Envie o código do Arduino Nano ESP32 #1 para o Arduino Nano ESP32 #1
  • Envie o código do Arduino Nano ESP32 #2 para o Arduino Nano ESP32 #2
  • Abra o Serial Monitor na Arduino IDE #1
  • Abra o Serial Monitor na Arduino IDE #2
  • Pressione e segure o botão do Arduino Nano ESP32 #1 → veja o estado do LED no Arduino Nano ESP32 #2 (ON)
  • Solte o botão do Arduino Nano ESP32 #1 → veja o estado do LED no Arduino Nano ESP32 #2 (OFF)
  • Pressione, segure e solte o botão várias vezes.
  • Veja a saída nos dois Serial Monitors
    • Serial Monitor do Arduino Nano ESP32 #1
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Nano ESP32
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
    New Line
    9600 baud
    Arduino Nano ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER Arduino Nano ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID Arduino Nano ESP32 - Connecting to MQTT broker Arduino Nano ESP32 - MQTT broker Connected! - The button is pressed, send command: 1 Arduino Nano ESP32 - sent to MQTT: - topic: arduino/command - payload:1 - The button is released, send command: 0 Arduino Nano ESP32 - sent to MQTT: - topic: arduino/command - payload:0
    Ln 11, Col 1
    Arduino Nano ESP32 on COM15
    2
    • Serial Monitor do Arduino Nano ESP32 #2
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Nano ESP32
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
    New Line
    9600 baud
    Arduino Nano ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER Arduino Nano ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID Arduino Nano ESP32 - Connecting to MQTT broker Arduino Nano ESP32 - Subscribed to the topic: arduino/command Arduino Nano ESP32 - MQTT broker Connected! Arduino Nano ESP32 - received from MQTT: - topic: arduino/command - payload: 1 - Received command: 1 => Turned LED on Arduino Nano ESP32 - received from MQTT: - topic: arduino/command - payload: 0 - Received command: 0 => Turned LED off
    Ln 11, Col 1
    Arduino Nano ESP32 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!