Arduino - MQTT

In deze tutorial leren we hoe u met Arduino gegevens kunt verzenden/ontvangen naar een MQTT broker via het MQTT-protocol. In detail leert u:

Arduino MQTT

We onderzoeken twee verschillende gebruikssituaties:

Hardware benodigd

1×Arduino UNO R4 WiFi
1×Alternatief: DIYables STEM V4 IoT
1×USB-kabel Type-C
1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno R4
1×(Aanbevolen) Breadboard-Shield voor Arduino Uno R4
1×(Aanbevolen) Behuizing voor Arduino Uno R4
1×(Aanbevolen) Stromsplitter voor Arduino Uno R4
1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

Of u kunt de volgende kits kopen:

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 Arduino en MQTT

We gaan ervan uit dat u al vertrouwd bent met het MQTT-protocol. Zo niet, doe dan alstublieft eerst wat onderzoek op internet. Deze tutorial richt zich op het programmeren van Arduino om gegevens te verzenden en te ontvangen met behulp van het MQTT-protocol.

De volgende gebruikssituaties van Arduino met MQTT zijn mogelijk:

  • Arduino verbindt met een online MQTT broker, bijvoorbeeld: een online Mosquitto broker, AWS IoT...
  • Arduino verbindt met een MQTT broker geïnstalleerd op uw pc, bijvoorbeeld: Mosquitto broker, HiveMQ broker
  • Arduino verbindt met een MQTT broker geïnstalleerd op uw Raspberry Pi, bijvoorbeeld: Mosquitto broker
  • Arduino verbindt met een MQTT broker in de cloud, bijvoorbeeld: Mosquitto of HiveMQ broker op AWS EC2

In deze tutorial beginnen we met een snelle controle of Arduino kan verbinden met een online Mosquitto broker. Arduino publiceert en abonneert zich op deze broker via het internet.

Vervolgens gaan we over op het installeren van de Mosquitto broker op onze pc. Daarna verbinden we Arduino met de MQTT broker die lokaal op de pc is geïnstalleerd, en publiceren en abonneren we gegevens via deze lokale broker.

Zodra u deze tutorial hebt afgerond, kunt u verder leren over Arduino met MQTT in de volgende tutorials:

Arduino verbinden met een online MQTT broker

In dit gedeelte leert u hoe u Arduino verbindt met test.mosquitto.org, een online MQTT broker beheerd door Mosquitto. Houd er rekening mee dat deze broker uitsluitend bedoeld is voor testdoeleinden.

Arduino-code

De onderstaande Arduino-code doet het volgende:

  • Verbindt met de MQTT broker
  • Abonneert zich op een topic
  • Publiceert periodiek berichten op hetzelfde topic waar het op is geabonneerd
/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-mqtt */ #include <WiFiS3.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-arduino-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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-arduino-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-arduino-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); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - 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("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Snelle stappen

  • Als dit de eerste keer is dat u Arduino Uno R4 gebruikt, bekijk dan hoe u de omgeving instelt voor Arduino Uno R4 op Arduino IDE.
  • 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 zoekveld en zoek de MQTT-library van Joel Gaehwiler.
  • Klik op de knop Install om de MQTT-library te installeren.
Arduino MQTT library
  • Typ ArduinoJson in het zoekveld en zoek de ArduinoJson library van Benoit Blanchon.
  • Klik op de knop Install om ArduinoJson te installeren.
Arduino Json library
  • Kopieer bovenstaande code en open deze met Arduino IDE
  • Vervang de WiFi-gegevens (SSID en wachtwoord) in de code door uw eigen gegevens.
  • In de code ziet u het woord 'YOUR-NAME' drie keer staan. Vervang dit door uw naam of willekeurige letters (alleen alfabettekens, geen spaties). Dit is nodig omdat anders meerdere gebruikers dezelfde client-ID’s en topics gebruiken, wat conflicten kan veroorzaken.
  • Klik op de knop Upload in Arduino IDE om de code naar Arduino te uploaden
  • Open de Serial Monitor
  • Bekijk het resultaat op de Serial Monitor.
COM6
Send
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: YOUR-NAME-arduino-001/loopback Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":11757,"data":255} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":11757,"data":255} Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":16896,"data":259} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Zoals u ziet publiceert Arduino berichten naar de MQTT broker en ontvangt dezelfde berichten terug. Dit komt doordat de code is geprogrammeerd om zich te abonneren op hetzelfde topic als waarop wordt gepubliceerd. Als u niet wilt dat Arduino de berichten ontvangt die het zelf publiceert, kunt u het SUBSCRIBE-topic anders maken dan het PUBLISH-topic.

Arduino verbinden met de MQTT broker geïnstalleerd op uw pc

Mosquitto MQTT Broker installeren

  • Installeer deze op de D:-schijf in plaats van de C:-schijf. Vermijd installatie op C: om potentiële problemen te voorkomen.

Mosquitto MQTT broker starten

Laten we nu controleren of de MQTT broker correct werkt met de volgende stappen:

  • Ga naar de map waar Mosquitto is geïnstalleerd, bijvoorbeeld: D:\Draft\mosquitto>
  • Maak een nieuw bestand genaamd test.conf, kopieer onderstaande inhoud erin en sla het bestand op in die map:
listener 1883 allow_anonymous true
  • Start de Opdrachtprompt als Administrator op uw pc. We noemen dit venster Broker Window. Sluit dit venster niet vóór het einde van de tutorial.
Windows command prompt administrator
  • Voer de onderstaande opdrachten één voor één uit:
cd /d D:\Draft\mosquitto mosquitto -v -c test.conf
  • U ziet:
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 een tweede opdrachtprompt als Administrator op uw pc.
  • Zoek het IP-adres van uw pc op door de volgende opdracht 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 . . . . . . . . . :
  • Schrijf het IP-adres op voor later gebruik. In bovenstaand voorbeeld is dat: 192.168.0.26

Test of de Mosquitto Broker werkt

  • Open een derde opdrachtprompt als Administrator op uw pc. We noemen dit venster Subscriber Window
  • Abonneer u op een topic door onderstaande commando’s één voor één 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 arduino-001/send
  • Open een vierde opdrachtprompt als Administrator op uw pc. We noemen dit venster Publisher Window
  • Publiceer een bericht op hetzelfde topic door onderstaande opdrachten één voor één 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 arduino-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 arduino-001/send -m "Hello, MQTT!" D:\Draft\mosquitto>

Het bericht wordt doorgestuurd naar het Subscriber Window zoals hieronder:

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 arduino-001/send Hello, MQTT!

U heeft nu succesvol de Mosquitto MQTT broker op uw pc geïnstalleerd. Sluit alstublieft de drie vensters niet: Broker Window, Subscriber Window en Publisher Window. We zullen deze verder gebruiken.

Arduino-code

De onderstaande Arduino-code doet het volgende:

  • Verbindt met de MQTT broker
  • Abonneert zich op een topic
  • Publiceert periodiek berichten op een ander topic
/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-mqtt */ #include <WiFiS3.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 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[] = "arduino-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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "arduino-001/send"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "arduino-001/receive"; // 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); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - 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("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino - 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 bovenstaande code en open deze met Arduino IDE
  • Vervang de WiFi-gegevens (SSID en wachtwoord) in de code door uw eigen gegevens.
  • 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 Arduino te uploaden

Bericht verzenden van Arduino naar pc via MQTT

De Arduino code publiceert data naar het MQTT-topic arduino-001/send. Het Subscriber Window op de pc is geabonneerd op dit topic om de data te ontvangen.

  • Open de Serial Monitor, u ziet dat Arduino periodiek een bericht publiceert op een topic.
COM6
Send
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: arduino-001/receive Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":10708,"data":311} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":15837,"data":298} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":20965,"data":291} Arduino - sent to MQTT: - topic: arduino-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 Arduino gepubliceerde berichten ontvangt zoals hieronder:
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 arduino-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 Arduino via MQTT

Arduino is geabonneerd op het topic arduino-001/receive. Het Publisher Window op de pc publiceert een bericht op dat topic om het naar de Arduino te sturen.

  • Publiceer een bericht naar het topic waarop Arduino is geabonneerd door de volgende opdracht uit te voeren in het Publisher Window:
mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/receive -m "Hello, Arduino!"
  • U ziet dat dit bericht wordt ontvangen door de Arduino in de Serial Monitor, zoals hieronder:
COM6
Send
Arduino - received from MQTT: - topic: arduino-001/receive - payload: Hello, Arduino!
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.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en demonstreert alle stappen overzichtelijk.

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