Arduino naar Arduino MQTT-communicatie

In deze tutorial gaan we leren:

communicatie tussen twee arduino via MQTT

Benodigde hardware

2×Arduino UNO R4 WiFi
2×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 hebben een gedetailleerde tutorial over het gebruik van Arduino met MQTT hier:

Communicatie tussen twee Arduino’s via MQTT

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.

communicatie tussen twee arduino

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
    Arduino Button Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

    • Arduino #2 - Bedradingsschema tussen Arduino en LED
    Arduino LED Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

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> 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 #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> 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); } }

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.
Arduino MQTT library
  • Typ ezButton in het zoekvak en zoek de button library van ArduinoGetStarted
  • Klik op de Installeren knop om de ezButton-library te installeren.
Arduino button library
  • 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
    COM6
    Send
    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
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Serial Monitor van Arduino #2
    COM6
    Send
    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
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

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