Arduino-zu-Arduino MQTT-Kommunikation

In diesem Tutorial werden wir lernen:

Kommunikation zwischen zwei Arduino-Boards über MQTT

Erforderliche Hardware

2×Arduino UNO R4 WiFi
2×USB-Kabel Typ-C
1×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno R4
1×(Empfohlen) Breadboard-Shield für Arduino Uno R4
1×(Empfohlen) Gehäuse für Arduino Uno R4
1×(Empfohlen) Stromverteiler für Arduino Uno R4
1×(Empfohlen) Prototyping-Grundplatte & Breadboard-Kit für Arduino Uno

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
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:

Kommunikation zwischen zwei Arduinos über MQTT

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.

Kommunikation zwischen zwei Arduino-Boards

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
    Arduino-Taster-Verdrahtungsdiagramm

    Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

    • Arduino #2 - Schaltplan zwischen Arduino und LED
    Arduino-LED-Schaltplan

    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> const int BUTTON_PIN = 7; 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 MQTT_TOPIC[] = "arduino/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); ezButton button(BUTTON_PIN); // create ezButton that attach to pin 7 void setup() { Serial.begin(9600); button.setDebounceTime(100); // set debounce time to 100 milliseconds Serial.println("ARDUINO #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); 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(); button.loop(); // MUST call the loop() function first if (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 broker mqtt.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(char command) { 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> const int LED_PIN = 9; 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-002"; // 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 MQTT_TOPIC[] = "arduino/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ARDUINO #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); 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(); } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.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() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.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); char command = payload[0]; if (command == '1') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => Turned LED on"); digitalWrite(LED_PIN, HIGH); // Turn LED on } else if (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.
Arduino MQTT-Bibliothek
  • 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.
Arduino-Tastenbibliothek
  • 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
    COM6
    Send
    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
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Serieller Monitor von Arduino #2
    COM6
    Send
    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
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

※ UNSERE NACHRICHTEN

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