Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.
Über Arduino und MQTT
Wir haben hier ein detailliertes Tutorial, wie man Arduino mit MQTT verwendet:
Zwei Arduino-Boards können miteinander über einen MQTT-Server kommunizieren. Wenn Sie möchten, dass zwei Arduinos direkt ohne die Verwendung eines MQTT-Servers kommunizieren, lesen Sie bitte das Tutorial zu Arduino-zu-Arduino TCP-Client/Server-Kommunikation.
Wenn Arduino #1 und Arduino #2 Daten über einen MQTT-Broker austauschen:
Beide Arduinos verbinden sich mit dem MQTT-Broker.
Um Arduino #2 dazu zu bringen, Daten an Arduino #1 zu senden:
Arduino #1 abonniert ein Thema, zum Beispiel: arduino-1/data.
Arduino #2 kann Daten an Arduino #1 senden, indem es die Daten auf das Thema veröffentlicht, das Arduino #1 abonniert hat.
Ähnlich, um Arduino #1 Daten an Arduino #2 senden zu lassen:
Arduino #2 abonniert ein Thema, zum Beispiel: arduino-2/data.
Arduino #1 kann Daten an Arduino #2 senden, indem es die Daten auf das Thema veröffentlicht, das Arduino #2 abonniert hat.
Wenn man dieser Methode folgt, können zwei Arduinos Daten bidirektional austauschen.
Beispiel-Anwendungsfall
Lassen Sie uns die folgende Anwendung realisieren: Ein Taster/Schalter, der an Arduino #1 angeschlossen ist, steuert eine LED, die über MQTT mit Arduino #2 verbunden ist.
Wie oben erwähnt gibt es einige Anwendungsprotokolle, die wir verwenden können. In diesem Beispiel, um es einfach zu halten, definieren wir selbst ein Protokoll (ein selbst definiertes Protokoll).
Selbstdefiniertes Protokoll
Lass uns ein einfaches Protokoll definieren:
Arduino #1 und Arduino #2 verbinden sich mit dem MQTT-Broker (MQTT-Server)
Arduino #1:
Arduino #1 sendet eine MQTT-Nachricht an ein Thema, wenn der Zustand des Schalters geändert wird.
Wenn der Knopf/Schalter auf EIN geschaltet wird, ist der Payload der MQTT-Nachricht 1.
Wenn der Knopf/Schalter auf AUS geschaltet wird, ist der Payload der MQTT-Nachricht 0.
Arduino #2:
Arduino #2 abonniert das Thema
Wenn Arduino #2 eine MQTT-Nachricht mit Payload 1 erhält, schaltet die LED ein.
Wenn Arduino #2 eine MQTT-Nachricht mit Payload 0 erhält, schaltet die LED aus.
Verdrahtungsdiagramm
Arduino #1 - Schaltplan zwischen Arduino und Taster
Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
Arduino #2 - Schaltplan zwischen Arduino und LED
Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
Kommunikation zwischen zwei Arduino-Boards über MQTT
Arduino-Code Nr. 1
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/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 Nr. 2
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/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); }}
Schnelle Schritte
Verdrahte einen Knopf/Schalter an Arduino #1.
Verdrahte eine LED an Arduino #2.
Öffne die Arduino IDE (genannt Arduino IDE #1).
Öffne ein weiteres Arduino IDE-Fenster (genannt Arduino IDE #2) durch Klicken auf das Arduino IDE-Symbol auf deinem PC (wichtig!()).
Öffne den Bibliotheks-Manager, indem du auf das Symbol in der linken Navigationsleiste der Arduino IDE klickst.
Gib MQTT in das Suchfeld ein, dann suche nach der MQTT-Bibliothek von Joel Gaehwiler.
Klicke auf die Installieren-Schaltfläche, um die MQTT-Bibliothek zu installieren.
Geben Sie ezButton in das Suchfeld ein, und suchen Sie anschließend nach der Button-Bibliothek von ArduinoGetStarted
Klicken Sie auf die Install-Schaltfläche, um die ezButton-Bibliothek zu installieren.
Verbinde Arduino #1 über ein USB-Kabel mit dem PC und wähle den COM-Port von Arduino #1 in der Arduino IDE #1 aus
Verbinde Arduino #2 über ein USB-Kabel mit dem PC und wähle den COM-Port von Arduino #2 in der Arduino IDE #2 aus
Kopiere den Arduino #1 Code, füge ihn in die Arduino IDE #1 ein und speichere ihn ab (benannt Arduino-1)
Kopiere den Arduino #2 Code, füge ihn in die Arduino IDE #2 ein und speichere ihn ab (benannt Arduino-2)
Ersetze die WLAN-Informationen (SSID und Passwort) in beiden Codes durch deine eigenen.
Ersetze die MQTT-Broker-Adresse in beiden Codes (Domänenname oder IP-Adresse).
Lade den Arduino #1 Code auf Arduino #1 hoch
Lade den Arduino #2 Code auf Arduino #2 hoch
Öffne den seriellen Monitor in der Arduino IDE #1
Öffne den seriellen Monitor in der Arduino IDE #2
Drücke und halte den Knopf an Arduino #1 gedrückt – sieh den Zustand der LED auf Arduino #2 (AN)
Lass den Knopf an Arduino #1 los – sieh den Zustand der LED auf Arduino #2 (AUS)
Drücke, halte und lasse den Knopf mehrmals hintereinander los.
Sieh die Ausgaben auf beiden seriellen Monitoren
Serieller Monitor von 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: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER
Arduino - Attempting to connect to SSID: YOUR_WIFI_SSID
IP Address: 192.168.0.2
Arduino - Connecting to MQTT broker
Arduino - MQTT broker Connected!
- The button is pressed, send command: 1
Arduino - sent to MQTT:
- topic: arduino/command
- payload:1
- The button is released, send command: 0
Arduino - sent to MQTT:
- topic: arduino/command
- payload:0
Ln 11, Col 1
Arduino Uno on COM15
2
Serieller Monitor von 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: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER
Arduino - Attempting to connect to SSID: YOUR_WIFI_SSID
IP Address: 192.168.0.2
Arduino - Connecting to MQTT broker
Arduino - Subscribed to the topic: arduino/command
Arduino - MQTT broker Connected!
Arduino - received from MQTT:
- topic: arduino/command
- payload: 1
- Received command: 1 => Turned LED on
Arduino - received from MQTT:
- topic: arduino/command
- payload: 0
- Received command: 0 => Turned LED off
Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!