ESP32 - MQTT

In deze tutorial gaan we verkennen hoe u de ESP32 kunt gebruiken om gegevens te verzenden en te ontvangen via een MQTT broker met behulp van het MQTT-protocol. We behandelen specifiek:

ESP32 MQTT

We behandelen twee verschillende scenario’s:

Hardware Benodigd

1×ESP32 ESP-WROOM-32 Ontwikkelingsmodule
1×(Alternatief) ESP32 Uno-form board
1×(Alternatief) ESP32 S3 Uno-form board
1×USB-kabel Type-C
1×(Aanbevolen) Schroefklem Uitbreidingsboard voor ESP32
1×(Aanbevolen) Breakout Expansion Board for ESP32
1×(Aanbevolen) Stromsplitter voor ESP32

Of u kunt de volgende kits kopen:

1×DIYables ESP32 Starterskit (ESP32 inbegrepen)
1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over ESP32 en MQTT

Bent u al bekend met het MQTT-protocol? Geweldig! Zo niet, dan kunt u er online informatie over vinden. Deze handleiding gaat over het gebruik van ESP32 om data te verzenden en te ontvangen met MQTT.

Hier zijn enkele manieren waarop ESP32 kan samenwerken met MQTT:

  • Verbind de ESP32 met een online MQTT broker zoals Mosquitto of AWS IoT.
  • Verbind de ESP32 met een MQTT broker die op uw computer is geïnstalleerd, zoals Mosquitto of HiveMQ.
  • Verbind de ESP32 met een MQTT broker die loopt op uw Raspberry Pi, bijvoorbeeld Mosquitto.
  • Verbind de ESP32 met een cloud-gebaseerde MQTT broker, zoals Mosquitto of HiveMQ op AWS EC2.

In deze tutorial beginnen we met controleren of de ESP32 verbinding kan maken met een online Mosquitto broker. De ESP32 zal via deze broker data verzenden en ontvangen via internet.

Daarna gaan we de Mosquitto broker op onze pc installeren. We verbinden de ESP32 met deze lokale broker en blijven data versturen en ontvangen.

Na het voltooien van deze tutorial kunt u verder ontdekken met deze extra tutorials:

Deze links bieden verdere begeleiding over gerelateerde onderwerpen.

Verbind ESP32 met een online MQTT broker

In dit gedeelte leren we hoe we ESP32 verbinden met test.mosquitto.org, een online MQTT broker beheerd door Mosquitto. Let op dat deze broker alleen voor testdoeleinden bedoeld is.

ESP32 Code

De onderstaande ESP32-code doet het volgende:

  • Verbindt met de MQTT broker
  • Abonneert zich op een topic
  • Publiceert periodiek berichten op hetzelfde topic waarop het is geabonneerd
/* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-mqtt */ #include <WiFi.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-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 PUBLISH_TOPIC[] = "YOUR-NAME-esp32-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-esp32-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); // set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); 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(); 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("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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP32 - Subscribed to the topic: "); else Serial.print("ESP32 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP32 - 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("ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP32 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Snelle Stappen

  • Als dit de eerste keer is dat u ESP32 gebruikt, bekijk dan hoe u de omgeving voor ESP32 instelt in de Arduino IDE.
  • Maak de bedrading volgens de afbeelding hierboven.
  • Verbind de ESP32 met uw pc via een USB-kabel.
  • Open Arduino IDE op uw pc.
  • Selecteer de juiste ESP32 board (bijvoorbeeld ESP32 Dev Module) en de juiste COM-poort.
  • Open Arduino IDE op uw pc.
  • Open de Library Manager door te klikken op het Library Manager icoon in de linker navigatiebalk van Arduino IDE.
  • Typ MQTT in het zoekvak en zoek de MQTT library van Joel Gaehwiler.
  • Klik op de knop Install om de MQTT library te installeren.
ESP32 MQTT library
  • Typ ArduinoJson in het zoekvak en zoek de ArduinoJson library van Benoit Blanchon.
  • Klik op de knop Install om de ArduinoJson library te installeren.
ESP32 Json library
  • Kopieer de bovenstaande code en open die in Arduino IDE.
  • Vervang in de code de WiFi-gegevens (SSID en wachtwoord) door uw eigen gegevens.
  • In de code komt driemaal het woord 'YOUR-NAME' voor. Vervang dit woord door uw naam of willekeurige karakters (alleen alfabetische letters, geen spaties). Dit is noodzakelijk omdat, als meerdere mensen dezelfde code draaien zonder dit aan te passen, er conflicten kunnen ontstaan omdat de MQTT client IDs en topics voor iedereen hetzelfde zijn.
  • Klik op de knop Upload in Arduino IDE om de code naar de ESP32 te uploaden.
  • Open de Serial Monitor.
  • Bekijk de resultaten in de Serial Monitor.
COM6
Send
ESP32 - Connecting to MQTT broker ESP32 - Subscribed to the topic: YOUR-NAME-esp32-001/loopback ESP32 - MQTT broker Connected! ESP32 - sent to MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload:{"timestamp":11757,"data":255} ESP32 - received from MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload: {"timestamp":11757,"data":255} ESP32 - sent to MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload:{"timestamp":16896,"data":259} ESP32 - received from MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Zoals u ziet publiceert de ESP32 berichten naar de MQTT broker en ontvangt vervolgens hetzelfde bericht terug. Dit komt omdat de gegeven code zich abonneert op hetzelfde topic waarop het publiceert. Wilt u dat de ESP32 het zelf gepubliceerde bericht niet ontvangt, dan kunt u dit eenvoudig bereiken door de SUBSCRIBE-topic anders te maken dan de PUBLISH-topic.

Verbind ESP32 met de MQTT broker die op uw PC is geïnstalleerd

Mosquitto MQTT Broker Installeren

  • Installeer deze op de D: schijf in plaats van de C: schijf. Vermijd installatie op de C: schijf om mogelijke problemen te voorkomen.

Mosquitto MQTT broker starten

Laten we controleren of de MQTT broker correct werkt door de volgende stappen te doorlopen:

  • Ga naar de map waar Mosquitto is geïnstalleerd, bijvoorbeeld: D:\Draft\mosquitto>
  • Maak een nieuw bestand aan met de naam test.conf, kopieer onderstaande inhoud en sla het bestand op in die map:
listener 1883 allow_anonymous true
  • Start een Command Prompt als Administrator op uw pc. We noemen dit venster de Broker Window. Sluit dit venster NIET voordat de tutorial is afgelopen.
Windows command prompt administrator
  • Voer onderstaande commando’s één voor één uit:
cd /d D:\Draft\mosquitto mosquitto -v -c test.conf
  • U ziet dit verschijnen:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\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
  • Open nog een Command Prompt als Administrator op uw pc.
  • Zoek het IP-adres van uw pc op door het volgende commando uit te voeren:
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 . . . . . . . . . :
  • Noteer het IP-adres voor later gebruik. In dit voorbeeld is het: 192.168.0.26

Test of de Mosquitto Broker werkt

  • Open nog een Command Prompt als Administrator. We noemen dit venster Subscriber Window.
  • Abonneer u op een topic door onderstaande commando’s uit te voeren (vervang het IP-adres door dat van uw pc):
cd /d D:\Draft\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t esp32-001/send
  • Open nog een Command Prompt als Administrator. We noemen dit venster Publisher Window.
  • Publiceer een bericht naar hetzelfde topic door de volgende commando’s uit te voeren (vervang het IP-adres door dat van uw pc):
cd /d D:\Draft\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t esp32-001/send -m "Hello, MQTT!"
  • U ziet het volgende:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t esp32-001/send -m "Hello, MQTT!" D:\Draft\mosquitto>

Het bericht wordt doorgegeven aan het Subscriber Window zoals hieronder zichtbaar is:

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

U hebt nu succesvol de Mosquitto MQTT broker op uw pc geïnstalleerd. Sluit de drie vensters NIET af: Broker Window, Subscriber Window en Publisher Window. We gaan ze zo gebruiken.

ESP32 Code

De onderstaande ESP32-code doet het volgende:

  • Verbindt met de MQTT broker
  • Abonneert zich op een topic
  • Publiceert periodiek berichten aan een ander topic
/* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-mqtt */ #include <WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> #define CLIENT_ID "ESP32-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 "esp32-001/send" #define SUBSCRIBE_TOPIC "esp32-001/receive" #define PUBLISH_INTERVAL 5000 // 4 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); // set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); 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(); 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("ESP32 - Connecting to MQTT broker"); while (!mqtt.connect(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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP32 - Subscribed to the topic: "); else Serial.print("ESP32 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP32 - 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("ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP32 - 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"]; */ }

Snelle Stappen

  • Kopieer de bovenstaande code en open die met Arduino IDE.
  • Vervang de WiFi-gegevens (SSID en wachtwoord) in de code door uw eigen.
  • Vervang het adres van de MQTT broker in de code (domeinnaam of IP-adres).
  • Klik op de knop Upload in Arduino IDE om de code naar ESP32 te uploaden.

Bericht verzenden van ESP32 naar PC via MQTT

De ESP32-code publiceert data naar het MQTT-topic esp32-001/send. Het Subscriber Window op de pc abonneert zich op dit topic om de data te ontvangen.

  • Open de Serial Monitor; u ziet dat ESP32 periodiek een bericht naar een topic publiceert.
COM6
Send
ESP32 - Connecting to MQTT broker ESP32 - Subscribed to the topic: esp32-001/receive ESP32 - MQTT broker Connected! ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":10708,"data":311} ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":15837,"data":298} ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":20965,"data":291} ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Controleer het Subscriber Window; u ziet dat het de door ESP32 gepubliceerde berichten ontvangt, als volgt:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp32-001/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Bericht verzenden van PC naar ESP32 via MQTT

ESP32 is geabonneerd op het topic esp32-001/receive. Het Publisher Window op PC publiceert een bericht naar dit topic om het naar ESP32 te sturen.

  • Publiceer een bericht naar het topic waarop ESP32 geabonneerd is door dit commando te gebruiken in het Publisher Window:
mosquitto_pub -h 192.168.0.26 -p 1883 -t esp32-001/receive -m "Hello, ESP32!"
  • U zult dit bericht in de Serial Monitor van ESP32 ontvangen, zoals hieronder:
COM6
Send
ESP32 - received from MQTT: - topic: esp32-001/receive - payload: Hello, ESP32!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!