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:
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.
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
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
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 buttonconstchar WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSIDconstchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORDconstchar 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 ADDRESSconstint MQTT_PORT = 1883;constchar MQTT_CLIENT_ID[] = "esp32-001"; // CHANGE IT AS YOU DESIREconstchar MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not requiredconstchar MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required// The MQTT topics that ESP32 should publish/subscribeconstchar MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIREWiFiClient network;MQTTClientmqtt = MQTTClient(256);ezButtonbutton(BUTTON_PIN); // create ezButton that attach to pin 7voidsetup() {Serial.begin(9600);button.setDebounceTime(100); // set debounce time to 100 millisecondsSerial.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();}voidloop() {mqtt.loop();button.loop(); // MUST call the loop() function firstif (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 brokermqtt.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(charcommand) {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 LEDconstchar WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSIDconstchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORDconstchar 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 ADDRESSconstint MQTT_PORT = 1883;constchar MQTT_CLIENT_ID[] = "esp32-002"; // CHANGE IT AS YOU DESIREconstchar MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not requiredconstchar MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required// The MQTT topics that ESP32 should publish/subscribeconstchar MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIREWiFiClient network;MQTTClientmqtt = MQTTClient(256);voidsetup() {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();}voidloop() {mqtt.loop();}void connectToMQTT() {// Connect to the MQTT brokermqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network);// Create a handler for incoming messagesmqtt.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() functionif (mqtt.subscribe(MQTT_TOPIC))Serial.print("ESP32 - Subscribed to the topic: ");elseSerial.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);charcommand = payload[0];if (command == '1') {Serial.print("- Received command: ");Serial.print(command);Serial.println(" => Turned LED on");digitalWrite(LED_PIN, HIGH); // Turn LED on } elseif (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); }}
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.
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.
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
···
8Serial.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
···
8Serial.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
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!