Comunicação MQTT entre ESP8266 e ESP8266

Neste tutorial, vamos abordar:

comunicação entre dois esp8266 via MQTT

Hardware Necessário

2×ESP8266 NodeMCU
2×Cabo Micro USB
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para ESP8266

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.

Sobre ESP8266 e MQTT

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

Comunicação entre dois ESP8266 via MQTT

Duas placas ESP8266 podem se comunicar entre si usando um servidor MQTT. Se você prefere a comunicação direta entre dois ESP8266 sem depender de um servidor MQTT, confira o tutorial sobre comunicação TCP Cliente/Servidor entre ESP8266 e ESP8266.

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

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

    Seguindo essa abordagem, dois ESP8266 podem trocar dados de forma bidirecional.

Exemplo de Caso de Uso

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

comunicação entre dois esp8266

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 ESP8266 #1 e o ESP8266 #2 se conectam a um Broker MQTT (servidor MQTT).
  • Para o ESP8266 #1:
    • O ESP8266 #1 publica uma mensagem MQTT em um tópico específico sempre que o estado de um interruptor muda.
    • Quando o botão/interruptor é ligado, o payload da mensagem MQTT é definido como 1.
    • Quando o botão/interruptor é desligado, o payload da mensagem MQTT é definido como 0.
  • Para o ESP8266 #2:
    • O ESP8266 #2 se inscreve no mesmo tópico.
    • Se o ESP8266 #2 receber uma mensagem MQTT com payload 1, ele ativa o LED.
    • Se o ESP8266 #2 receber uma mensagem MQTT com payload 0, ele desativa o LED.

    Diagrama de Ligação

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

    This image is created using Fritzing. Click to enlarge image

    Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.

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

    This image is created using Fritzing. Click to enlarge image

Comunicação entre dois ESP8266 via MQTT

Código ESP8266 #1

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN D7 // The ESP8266 pin 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[] = "esp8266-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 ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/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("ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with 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("ESP8266 - 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("ESP8266 - MQTT broker Timeout!"); return; } Serial.println("ESP8266 - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

Código ESP8266 #2

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <ESP8266WiFi.h> #include <MQTTClient.h> #define LED_PIN D6 // The ESP8266 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.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp8266-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 ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with 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("ESP8266 - 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("ESP8266 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("ESP8266 - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("ESP8266 - 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 ESP8266 na Arduino IDE, siga estes passos:

  • Confira o tutorial como configurar o ambiente para ESP8266 na Arduino IDE se esta for a sua primeira vez usando o ESP8266.
  • Ligue os componentes como mostrado no diagrama.
  • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Escolha a placa ESP8266 correta, como (por exemplo, NodeMCU 1.0 (ESP-12E Module)), e sua respectiva porta COM.
  • Ligue um botão/interruptor ao ESP8266 #1
  • Ligue um LED ao ESP8266 #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 Gerenciador de Bibliotecas clicando no ícone Library Manager na barra de navegação à esquerda da Arduino IDE
  • Digite MQTT na caixa de busca e procure a biblioteca MQTT de Joel Gaehwiler.
  • Clique no botão Install para instalar a biblioteca MQTT.
Biblioteca MQTT para ESP8266 NodeMCU
  • Digite ezButton na caixa de busca e encontre a biblioteca de botão de ArduinoGetStarted
  • Clique no botão Install para instalar a biblioteca ezButton.
Biblioteca de botão para ESP8266 NodeMCU
  • Conecte o ESP8266 #1 ao PC por cabo USB e selecione a porta COM do ESP8266 #1 na Arduino IDE #1
  • Conecte o ESP8266 #2 ao PC por cabo USB e selecione a porta COM do ESP8266 #2 na Arduino IDE #2
  • Copie o código do ESP8266 #1, cole na Arduino IDE #1 e salve (com o nome ESP8266-1)
  • Copie o código do ESP8266 #2, cole na Arduino IDE #2 e salve (com o nome ESP8266-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 ESP8266 #1 para o ESP8266 #1
  • Faça o upload do código do ESP8266 #2 para o ESP8266 #2
  • Abra o Serial Monitor na Arduino IDE #1
  • Abra o Serial Monitor na Arduino IDE #2
  • Pressione e segure o botão do ESP8266 #1 → veja o estado do LED do ESP8266 #2 (ligado)
  • Solte o botão do ESP8266 #1 → veja o estado do LED do ESP8266 #2 (desligado)
  • Pressione, segure e solte o botão várias vezes.
  • Veja a saída nos dois Serial Monitors
    • Serial Monitor do ESP8266 #1
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Nodemcu 1.0 (ESP-12E Module)
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
    New Line
    9600 baud
    ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - MQTT broker Connected! - The button is pressed, send command: 1 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:1 - The button is released, send command: 0 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:0
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E Module) on COM15
    2
    • Serial Monitor do ESP8266 #2
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Nodemcu 1.0 (ESP-12E Module)
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
    New Line
    9600 baud
    ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266/command ESP8266 - MQTT broker Connected! ESP8266 - received from MQTT: - topic: esp8266/command - payload: 1 - Received command: 1 => Turned LED on ESP8266 - received from MQTT: - topic: esp8266/command - payload: 0 - Received command: 0 => Turned LED off
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E 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!