ESP32-naar-ESP32 MQTT Communicatie

In deze tutorial behandelen we de volgende onderwerpen:

communication between two esp32 via MQTT

Benodigde Hardware

2×ESP32 ESP-WROOM-32 Ontwikkelingsmodule
2×USB-kabel Type-C
1×(Aanbevolen) Schroefklem Uitbreidingsboard voor ESP32
1×(Aanbevolen) Breakout Expansion Board for ESP32
1×(Aanbevolen) Stromsplitter voor ESP32

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

We hebben een uitgebreide tutorial over het gebruik van ESP32 met MQTT:

Communicatie tussen twee ESP32 via MQTT

Twee ESP32-boards kunnen via een MQTT-server (broker) met elkaar communiceren. Wilt u ze rechtstreeks laten communiceren zonder gebruik van een MQTT-server, raadpleeg dan de tutorial over ESP32 naar ESP32 TCP Client/Server communicatie.

Als ESP32 #1 en ESP32 #2 data uitwisselen via een MQTT-broker:

  • Beide ESP32’s verbinden met de MQTT-broker.
  • Om ESP32 #2 in staat te stellen data naar ESP32 #1 te sturen:
    • ESP32 #1 abonneert zich op een topic, bijvoorbeeld: esp32-1/data.
    • ESP32 #2 kan data sturen naar ESP32 #1 door te publiceren op het topic waarop ESP32 #1 geabonneerd is.
  • Op dezelfde manier, om ESP32 #1 data te laten sturen naar ESP32 #2:
    • ESP32 #2 abonneert zich op een topic, zoals esp32-2/data.
    • ESP32 #1 kan data sturen naar ESP32 #2 door te publiceren op het topic waarop ESP32 #2 geabonneerd is.

    Op deze manier kunnen twee ESP32’s bidirectioneel data uitwisselen.

Praktijkvoorbeeld

We realiseren de volgende toepassing: Een knop of schakelaar aangesloten op ESP32 #1 bestuurt een LED die verbonden is met ESP32 #2 via MQTT.

communication between two esp32

Zoals hierboven vermeld, zijn er verschillende toepassingsprotocollen mogelijk. In dit voorbeeld maken we het simpel door zelf een protocol te definiëren (zelf-gedefinieerd protocol).

Werking

De volgende eenvoudige protocoldefinitie gebruiken we:

  • Zowel ESP32 #1 als ESP32 #2 verbinden met een MQTT-broker (MQTT-server).
  • Voor ESP32 #1:
    • Het publiceert een MQTT-bericht naar een specifiek topic telkens wanneer de staat van de knop/schakelaar verandert.
    • Wanneer de knop/schakelaar wordt ingedrukt, is de payload van het MQTT-bericht 1.
    • Wanneer de knop/schakelaar wordt losgelaten, is de payload van het MQTT-bericht 0.
  • Voor ESP32 #2:
    • Het abonneert zich op hetzelfde topic.
    • Ontvangt ESP32 #2 een MQTT-bericht met payload 1, dan gaat de LED aan.
    • Ontvangt ESP32 #2 een MQTT-bericht met payload 0, dan gaat de LED uit.

    Bedradingsschema

    • ESP32 #1 – Bedradingsschema tussen ESP32 en knop
    ESP32 Button Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

    • ESP32 #2 – Bedradingsschema tussen ESP32 en LED
    ESP32 LED Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

Communicatie tussen twee ESP32 via MQTT

ESP32 Code #1

/* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-to-esp32-mqtt-communication */ // ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN 21 // ESP32 pin GPIO21 connected to button 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[] = "esp32-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 ESP32 should publish/subscribe const char MQTT_TOPIC[] = "esp32/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("ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP32 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); 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("ESP32 - 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("ESP32 - MQTT broker Timeout!"); return; } Serial.println("ESP32 - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

ESP32 Code #2

/* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-to-esp32-mqtt-communication */ // ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <WiFi.h> #include <MQTTClient.h> #define LED_PIN 18 // ESP32 pin GPIO18 connected to LED 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[] = "esp32-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 ESP32 should publish/subscribe const char MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP32 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); 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("ESP32 - 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("ESP32 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("ESP32 - Subscribed to the topic: "); else Serial.print("ESP32 - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("ESP32 - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("ESP32 - 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

  • Als u voor het eerst met ESP32 werkt, bekijk dan hoe de omgeving op te zetten voor ESP32 in Arduino IDE.
  • Open twee Arduino IDE vensters op uw PC.
  • Verbind een knop/schakelaar met ESP32 #1
  • Verbind een LED met ESP32 #2
  • Open de Library Manager door te klikken op het Library Manager icoon in de linkerzijbalk van Arduino IDE.
  • Typ MQTT in het zoekvak en zoek de MQTT library van Joel Gaehwiler.
  • Klik op de knop Install om de MQTT library te installeren.
ESP32 MQTT library
  • Typ ezButton in het zoekvak en vind de button library van ArduinoGetStarted
  • Klik op de knop Install om de ezButton library te installeren.
ESP32 button library
  • Selecteer het juiste ESP32-board (bijvoorbeeld ESP32 Dev Module).
  • Verbind ESP32 #1 met de PC via USB-kabel en selecteer de COM-poort van ESP32 #1 in Arduino IDE #1
  • Verbind ESP32 #2 met de PC via USB-kabel en selecteer de COM-poort van ESP32 #2 in Arduino IDE #2
  • Kopieer de code voor ESP32 #1, plak deze in Arduino IDE #1 en sla het bestand op (bijvoorbeeld ESP32-1).
  • Kopieer de code voor ESP32 #2, plak deze in Arduino IDE #2 en sla het bestand op (bijvoorbeeld ESP32-2).
  • Vervang de WiFi-gegevens (SSID en wachtwoord) in beide codes door uw eigen gegevens.
  • Vervang het MQTT broker-adres in beide codes (domeinnaam of IP-adres).
  • Upload de code van ESP32 #1 naar ESP32 #1
  • Upload de code van ESP32 #2 naar ESP32 #2
  • Open de Serial Monitor in Arduino IDE #1
  • Open de Serial Monitor in Arduino IDE #2
  • Druk de knop in en houd deze vast op ESP32 #1 → zie de status van de LED op ESP32 #2 (AAN)
  • Laat de knop los op ESP32 #1 → zie de status van de LED op ESP32 #2 (UIT)
  • Druk, houd vast en laat de knop meerdere keren los.
  • Bekijk de uitvoer op beide Serial Monitors:
    • Serial Monitor van ESP32 #1
    COM6
    Send
    ESP32 #1: VERBONDEN MET EEN KNOP/SCHAKELAAR, FUNGEERT ALS EEN MQTT PUBLISHER ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP32 - Connecting to MQTT broker ESP32 - MQTT broker Connected! - The button is pressed, send command: 1 ESP32 - sent to MQTT: - topic: esp32/command - payload:1 - The button is released, send command: 0 ESP32 - sent to MQTT: - topic: esp32/command - payload:0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Serial Monitor van ESP32 #2
    COM6
    Send
    ESP32 #2: VERBONDEN MET EEN LED, FUNGEERT ALS EEN MQTT SUBSCRIBER ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP32 - Connecting to MQTT broker ESP32 - Subscribed to the topic: esp32/command ESP32 - MQTT broker Connected! ESP32 - received from MQTT: - topic: esp32/command - payload: 1 - Received command: 1 => Turned LED on ESP32 - received from MQTT: - topic: esp32/command - payload: 0 - Received command: 0 => Turned LED off
    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!