ESP8266 - MQTT

Neste tutorial, vamos explorar como usar o ESP8266 para enviar e receber dados com um broker MQTT usando o protocolo MQTT. Especificamente, vamos abordar o seguinte:

ESP8266 NodeMCU MQTT

Vamos analisar dois cenários distintos:

Hardware Necessário

1×ESP8266 NodeMCU ESP-12F
1×Alternatively, ESP8266 D1 Mini NodeMCU ESP-12F
1×Alternatively, ESP8266 NodeMCU ESP-12E (Uno-form)
1×Micro USB Cable
1×Alternatively, ESP8266 NodeMCU ESP-12F (SMD-form)
1×Cabo USB Tipo-A para Tipo-C (para PC com USB-A)
1×Cabo USB Tipo-C para Tipo-C (para PC com USB-C)
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 o ESP8266 e o MQTT

Se você ainda não conhece o protocolo MQTT, pode encontrar informações sobre ele online. Este tutorial foca no uso do ESP8266 para enviar e receber dados por meio do MQTT.

Aqui estão algumas maneiras de usar o ESP8266 com o MQTT:

  • Você pode conectar o ESP8266 a um broker MQTT online, como o Mosquitto ou o AWS IoT.
  • Como alternativa, você pode ligar o ESP8266 a um broker MQTT instalado no seu computador, como o Mosquitto ou o HiveMQ.
  • Se você tiver um Raspberry Pi, o ESP8266 pode se conectar a um broker MQTT executado nele, por exemplo, o Mosquitto.
  • Além disso, o ESP8266 pode ser conectado a um broker MQTT baseado na nuvem, como o Mosquitto ou o HiveMQ no AWS EC2.

Neste tutorial, vamos começar testando se o ESP8266 consegue se conectar a um broker Mosquitto online. Vamos demonstrar a capacidade do ESP8266 de enviar e receber dados por meio desse broker pela internet.

Em seguida, vamos orientar você na configuração do broker Mosquitto no seu computador. O ESP8266 então se conectará a esse broker local, permitindo que você continue enviando e recebendo dados.

Depois de concluir este tutorial, você pode se aprofundar explorando estes tutoriais adicionais:

Esses recursos trarão mais informações sobre os assuntos relacionados.

Conectar o ESP8266 a um broker MQTT online

Nesta parte, vamos aprender a conectar o ESP8266 ao test.mosquitto.org, um broker MQTT online criado pelo Mosquitto. Observe que esse broker deve ser usado apenas para fins de teste.

Código ESP8266

O código ESP8266 abaixo faz o seguinte:

  • Conecta-se ao broker MQTT
  • Assina um tópico
  • Publica mensagens periodicamente no mesmo tópico que assina
/* * 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-mqtt */ #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> 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 int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "YOUR-NAME-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 PUBLISH_TOPIC[] = "YOUR-NAME-esp8266-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-esp8266-001/loopback"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); 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(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); 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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP8266 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Passos Rápidos

Para começar com o ESP8266 no Arduino IDE, siga estes passos:

  • Confira o tutorial como configurar o ambiente para o ESP8266 no Arduino IDE se for a primeira vez que você usa o ESP8266.
  • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
  • Abra o Arduino IDE no seu computador.
  • Escolha a placa ESP8266 correta, como (por exemplo, NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
  • 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 ESP8266 NodeMCU
  • Digite ArduinoJson na caixa de pesquisa e procure a biblioteca ArduinoJson de Benoit Blanchon.
  • Clique no botão Install para instalar a biblioteca ArduinoJson.
Biblioteca Json do ESP8266 NodeMCU
  • Copie o código acima e abra com o Arduino IDE
  • Substitua as informações de WiFi (SSID e senha) no código pelas suas.
  • No código, você verá a palavra 'YOUR-NAME' três vezes. Substitua essa palavra pelo seu nome ou por caracteres aleatórios (somente letras do alfabeto, sem espaços). Isso é necessário porque, se você não fizer a alteração, várias pessoas podem estar executando este código ao mesmo tempo, o que pode causar conflitos, já que os IDs de cliente MQTT e os tópicos são os mesmos para todos.
  • Clique no botão Upload no Arduino IDE para fazer o upload do código para o ESP8266
  • Abra o Serial Monitor
  • Veja o resultado no Serial Monitor.
∞
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 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: YOUR-NAME-esp8266-001/loopback ESP8266 - MQTT broker Connected! ESP8266 - sent to MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload:{"timestamp":11757,"data":255} ESP8266 - received from MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload: {"timestamp":11757,"data":255} ESP8266 - sent to MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload:{"timestamp":16896,"data":259} ESP8266 - received from MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload: {"timestamp":16896,"data":259}
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Como você pode ver, o ESP8266 publica mensagens no broker MQTT e depois recebe de volta a mesma mensagem. Isso acontece porque o código acima assina o mesmo tópico no qual publica dados. Se você não quiser que o ESP8266 receba a mensagem que ele publica, basta tornar o tópico de SUBSCRIBE diferente do tópico de PUBLISH.

Conectar o ESP8266 ao broker MQTT instalado no seu PC

Instalando o Broker MQTT Mosquitto

  • Instale-o na unidade D: em vez da unidade C:. Evite instalar o broker Mosquitto na unidade C: para prevenir possíveis problemas.

Executar o broker MQTT Mosquitto

Agora, vamos verificar se o broker MQTT está funcionando corretamente seguindo estes passos:

  • Vá até o diretório onde o Mosquitto foi instalado. Por exemplo: D:\mqtt\mosquitto>
  • Crie um novo arquivo chamado test.conf, copie o conteúdo abaixo e salve-o nesse diretório:
listener 1883 allow_anonymous true
  • Execute um Prompt de Comando como Administrador no seu PC. Vamos chamá-lo de Janela do Broker. Não o feche até o final do tutorial.
Prompt de comando do Windows como administrador
  • Execute os comandos abaixo, um por um:
cd /d D:\mqtt\mosquitto mosquitto -v -c test.conf
  • Você verá:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto -v -c test.conf 1710918939: mosquitto version 2.0.18 starting 1710918939: Config loaded from test.conf. 1710918939: Opening ipv6 listen socket on port 1883. 1710918939: Opening ipv4 listen socket on port 1883. 1710918939: mosquitto version 2.0.18 running
  • Abra outro Prompt de Comando como Administrador no seu PC.
  • Descubra o endereço IP do seu PC executando o comando abaixo:
ipconfig
Command Prompt
C:\WINDOWS\system32>ipconfig Windows IP Configuration Ethernet adapter: Subnet Mask . . . . . . . . . . . : 255.0.0.0 IPv4 Address. . . . . . . . . . . : 192.168.0.26 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . :
  • Anote o endereço IP para uso posterior. No exemplo acima: 192.168.0.26

Testar se o Broker Mosquitto funciona

  • Abra outro Prompt de Comando como Administrador no seu PC. Vamos chamá-lo de Janela do Assinante
  • Assine um tópico executando os comandos abaixo, um por um (substitua pelo seu endereço IP):
cd /d D:\mqtt\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send
  • Abra outro Prompt de Comando como Administrador no seu PC. Vamos chamá-lo de Janela do Publicador
  • Publique uma mensagem no mesmo tópico executando os comandos abaixo, um por um (substitua pelo seu endereço IP):
cd /d D:\mqtt\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/send -m "Hello, MQTT!"
  • Você verá:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/send -m "Hello, MQTT!" D:\mqtt\mosquitto>

Você verá que a mensagem é encaminhada para a Janela do Assinante da seguinte forma:

Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send Hello, MQTT!

Agora você instalou com sucesso o broker MQTT Mosquitto no seu PC. Por favor, NÃO feche as três janelas: Janela do Broker, Janela do Assinante e Janela do Publicador. Vamos usá-las a seguir.

Código ESP8266

O código ESP8266 abaixo faz o seguinte:

  • Conecta-se ao broker MQTT
  • Assina um tópico
  • Publica mensagens periodicamente em outro tópico
/* * 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-mqtt */ #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> #define CLIENT_ID "ESP8266-001" // CHANGE IT AS YOU DESIRE 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[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED // The MQTT topics that this device should publish/subscribe #define PUBLISH_TOPIC "esp8266-001/send" #define SUBSCRIBE_TOPIC "esp8266-001/receive" #define PUBLISH_INTERVAL 5000 // 4 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); 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(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP8266 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); // You can process the incoming data as json object, then control something /* StaticJsonDocument<200> doc; deserializeJson(doc, payload); const char* message = doc["message"]; */ }

Passos Rápidos

  • Copie o código acima e abra com o Arduino IDE
  • Substitua as informações de WiFi (SSID e senha) no código pelas suas.
  • Substitua o endereço do broker MQTT no código (nome de domínio ou endereço IP).
  • Clique no botão Upload no Arduino IDE para fazer o upload do código para o ESP8266

Enviar mensagem do ESP8266 para o PC via MQTT

O código do ESP8266 publica dados no tópico MQTT esp8266-001/send, e a Janela do Assinante no PC assina esse tópico para receber os dados.

  • Abra o Serial Monitor e você verá o ESP8266 publicando periodicamente uma mensagem em um tópico.
∞
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 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266-001/receive ESP8266 - MQTT broker Connected! ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":10708,"data":311} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":15837,"data":298} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":20965,"data":291} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":26094,"data":286}
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2
  • Verifique a Janela do Assinante e você verá que ela recebe a mensagem publicada pelo ESP8266 como abaixo:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Enviar mensagem do PC para o ESP8266 via MQTT

O ESP8266 assina o tópico esp8266-001/receive, e a Janela do Publicador no PC publica uma mensagem nesse tópico para enviá-la ao ESP8266.

  • Publique uma mensagem no tópico que o ESP8266 assinou executando o seguinte comando na Janela do Publicador:
mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/receive -m "Hello, ESP8266!"
  • Você verá que essa mensagem é recebida pelo ESP8266 no Serial Monitor como abaixo:
∞
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 - received from MQTT: - topic: esp8266-001/receive - payload: Hello, ESP8266!
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Vídeo

※ 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!