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 hebben een gedetailleerde tutorial over het gebruik van Arduino met MQTT hier:
Twee Arduino-boards kunnen met elkaar communiceren via een MQTT-server. Wilt u twee Arduino’s direct zonder MQTT-server laten communiceren, bekijk dan de tutorial over Arduino naar Arduino TCP Client/Server communicatie.
Wanneer Arduino #1 en Arduino #2 data uitwisselen via een MQTT-broker:
Beide Arduino’s maken verbinding met de MQTT-broker.
Om Arduino #2 data naar Arduino #1 te laten sturen:
Arduino #1 abonneert zich op een topic, bijvoorbeeld: arduino-1/data.
Arduino #2 kan data naar Arduino #1 sturen door data te publiceren op het topic waarop Arduino #1 geabonneerd is.
Op dezelfde manier, om Arduino #1 data naar Arduino #2 te laten sturen:
Arduino #2 abonneert zich op een topic, bijvoorbeeld: arduino-2/data.
Arduino #1 kan data naar Arduino #2 sturen door data te publiceren op het topic waarop Arduino #2 geabonneerd is.
Met deze methode kunnen twee Arduino’s bidirectioneel data uitwisselen.
Voorbeeldtoepassing
Laten we de volgende toepassing realiseren: Een knop/schakelaar verbonden met Arduino #1 bestuurt via MQTT een LED verbonden met Arduino #2.
Zoals hierboven vermeld zijn er diverse applicatieprotocollen die we kunnen gebruiken. In dit voorbeeld maken we het eenvoudig en definiëren we zelf een protocol (een zelfgedefinieerd protocol).
Zelfgedefinieerd Protocol
Laten we een eenvoudig protocol definiëren:
Arduino #1 en Arduino #2 maken verbinding met de MQTT Broker (MQTT-server)
Arduino #1:
Arduino #1 publiceert een MQTT-bericht op een topic wanneer de stand van de schakelaar verandert.
Wanneer de knop/schakelaar aan wordt gezet, is de payload van het MQTT-bericht 1.
Wanneer de knop/schakelaar uit wordt gezet, is de payload van het MQTT-bericht 0.
Arduino #2:
Arduino #2 abonneert zich op het topic.
Als Arduino #2 een MQTT-bericht ontvangt met payload 1, zet het de LED aan.
Als Arduino #2 een MQTT-bericht ontvangt met payload 0, zet het de LED uit.
Bedradingsschema
Arduino #1 - Bedradingsschema tussen Arduino en knop
Deze afbeelding is gemaakt met Fritzing. Klik om de afbeelding te vergroten.
Arduino #2 - Bedradingsschema tussen Arduino en LED
Deze afbeelding is gemaakt met Fritzing. Klik om de afbeelding te vergroten.
Communicatie tussen twee Arduino’s via MQTT
Arduino Code #1
/* * 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-to-arduino-mqtt-communication*/// ARDUINO #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER#include <WiFiS3.h>#include <MQTTClient.h>#include <ezButton.h>constint BUTTON_PIN = 7;constchar 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[] = "arduino-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 Arduino should publish/subscribeconstchar MQTT_TOPIC[] = "arduino/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("ARDUINO #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER");intstatus = 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();}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("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; }Serial.println("Arduino - MQTT broker Connected!");}void sendToMQTT(charcommand) {char messageBuffer[1]; messageBuffer[0] = command;mqtt.publish(MQTT_TOPIC, messageBuffer);Serial.println("Arduino - sent to MQTT:");Serial.print("- topic: ");Serial.println(MQTT_TOPIC);Serial.print("- payload:");Serial.println(messageBuffer);}
Arduino Code #2
/* * 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-to-arduino-mqtt-communication*/// ARDUINO #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER#include <WiFiS3.h>#include <MQTTClient.h>constint LED_PIN = 9;constchar 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[] = "arduino-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 Arduino should publish/subscribeconstchar MQTT_TOPIC[] = "arduino/command"; // CHANGE IT AS YOU DESIREWiFiClient network;MQTTClientmqtt = MQTTClient(256);voidsetup() {Serial.begin(9600);pinMode(LED_PIN, OUTPUT);Serial.println("ARDUINO #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER");intstatus = 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();}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("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 messageReceived() functionif (mqtt.subscribe(MQTT_TOPIC))Serial.print("Arduino - Subscribed to the topic: ");elseSerial.print("Arduino - Failed to subscribe to the topic: ");Serial.println(MQTT_TOPIC);Serial.println("Arduino - MQTT broker Connected!");}void messageReceived(String &topic, String &payload) {Serial.println("Arduino - 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); }}
Snelle stappen
Verbind een knop/schakelaar met Arduino #1
Verbind een LED met Arduino #2
Open de Arduino IDE (genoemd Arduino IDE #1)
Open een tweede Arduino IDE-venster (genoemd Arduino IDE #2) door op het Arduino IDE-pictogram op uw pc te klikken (belangrijk!())
Open de Library Manager door te klikken op het Library Manager icoon in de linkerzijbalk van de Arduino IDE
Typ MQTT in het zoekvak en zoek naar de MQTT library van Joel Gaehwiler.
Klik op de Installeren knop om de MQTT-library te installeren.
Typ ezButton in het zoekvak en zoek de button library van ArduinoGetStarted
Klik op de Installeren knop om de ezButton-library te installeren.
Verbind Arduino #1 met de pc via USB-kabel en selecteer de COM-poort van Arduino #1 in Arduino IDE #1
Verbind Arduino #2 met de pc via USB-kabel en selecteer de COM-poort van Arduino #2 in Arduino IDE #2
Kopieer de code van Arduino #1, plak deze in Arduino IDE #1 en sla het op (noem het Arduino-1)
Kopieer de code van Arduino #2, plak deze in Arduino IDE #2 en sla het op (noem het Arduino-2)
Vervang de WiFi-gegevens (SSID en wachtwoord) in beide codes door uw eigen gegevens.
Vervang het adres van de MQTT-broker in beide codes (domeinnaam of IP-adres).
Upload de code naar Arduino #1
Upload de code naar Arduino #2
Open de Serial Monitor in Arduino IDE #1
Open de Serial Monitor in Arduino IDE #2
Druk de knop op Arduino #1 in en houd vast → zie de status van de LED op Arduino #2 (AAN)
Laat de knop op Arduino #1 los → zie de status van de LED op Arduino #2 (UIT)
Druk de knop meerdere keren in, houd vast en laat weer los.
Bekijk de output in beide Serial Monitors
Serial Monitor van Arduino #1
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Arduino #1: VERBONDEN MET EEN KNOP/SCHAKELAAR, FUNCTIONEERT ALS MQTT PUBLISHER
Arduino - Poging tot verbinden met SSID: YOUR_WIFI_SSID
IP-adres: 192.168.0.2
Arduino - Verbindt met MQTT broker
Arduino - MQTT broker verbonden!
- De knop is ingedrukt, stuur commando: 1
Arduino - verzonden naar MQTT:
- topic: arduino/command
- payload:1
- De knop is losgelaten, stuur commando: 0
Arduino - verzonden naar MQTT:
- topic: arduino/command
- payload:0
Ln 11, Col 1
Arduino Uno on COM15
2
Serial Monitor van Arduino #2
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Arduino #2: VERBONDEN MET EEN LED, FUNCTIONEERT ALS MQTT SUBSCRIBER
Arduino - Poging tot verbinden met SSID: YOUR_WIFI_SSID
IP-adres: 192.168.0.2
Arduino - Verbindt met MQTT broker
Arduino - Geabonneerd op topic: arduino/command
Arduino - MQTT broker verbonden!
Arduino - ontvangen van MQTT:
- topic: arduino/command
- payload: 1
- Ontvangen commando: 1 => LED aan
Arduino - ontvangen van MQTT:
- topic: arduino/command
- payload: 0
- Ontvangen commando: 0 => LED uit
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!