ESP NOW – One-way Kommunikation – ESP Basics

ESP-NOW ist ein Protokoll, welches die Möglichkeit bietet, mehrere Geräte zu verbinden, ohne das lokale Netzwerk nutzen zu müssen. Hiermit sind ESP8266 oder ESP32 in der Lage autark zu Kommunizieren. In diesem Beitrag betrachten wir eine One-way Kommunikation zwischen zwei ESP8266

ESP NOW in Kürze

Esp now nutzt den im ESP verbauten Wlan-chip um zu Komunizieren. Hirbei ist die Besonderheit das kein Wlannetzt benötigt, da die ESPs selber direkt ohne netztwerk komoniziren. Zudem benötigen wir keine zusätzliche Bibiolothek, da ESP-Now zu den standart Bibiolotheken der ESP-Boards gehört. Wie Du ESPs mit der Arduino-IDE entwickeln kannst und somit auch alle benötikten Bibiolotheken hast findest du in unserem Beitrag:

Funktionen im Überblick

  • esp_now_init(): Zum Initialisieren von ESP-NOW. Liefert 0 bei erfolgreicher Initialisierung.
  • esp_now_deinit(): zur Deinitialisieren von ESP-NOW.
  • esp_now_set_self_role(): Stellt die jeweilige Rolle ein.
  • esp_now_add_peer(): Hinzufügen eines Gerätes für die jeweilige Mac-Adresse.
  • esp_now_send(): Senden einer Nachricht.
  • esp_now_register_send_cb(): Registriert eine Funktion, welche nach dem senden einer Nachricht aufgerufen wird.
  • esp_now_register_recv_cb(): Registriert eine Funktion, welche nach dem empfangen einer Nachricht aufgerufen wird.

ESP Rollen

ESP_NOW_ROLE_IDLE: keine Funktion.
ESP_NOW_ROLE_CONTROLLER: Master, Priorität auf Station interface.
ESP_NOW_ROLE_SLAVE: Slave, Priorität auf SoftAP interface.
ESP_NOW_ROLE_COMBO: Master + Slave, Priorität auf SoftAP interface.
ESP_NOW_ROLE_MAX: Master + Slave, Priorität auf Station interface.

Durch das setzen der Rolle, mit der Funktion esp_now_set_self_role(), werden die dazugehörigen Interfaces frei.

One-way Kommunikation

ESP-NOW One-way Kommunikation
ESP-NOW One-way Kommunikation

In diesem Fall betrachten wir die Möglichkeit, Nachrichten von einem Gerät auf ein anderes zu übertragen.

Tipp
Der serielle Monitor der Arduino IDE kann nur einmal pro Instanz benutzt werden. Wenn man den seriellen Monitor parallel auf zwei COM-Ports nutzen möchte, muss die Arduino IDE mehrfach gestartet werden.

Sender Code

// Bnoetgte Bibliotheken #include <ESP8266WiFi.h> #include <espnow.h> // Trage hier die MAC-Adresse des Empfaengers ein uint8_t macAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // struct welches übertragen wird // Muss mit Empfaenger uebereinstimmen typedef struct message { long number; // Speicher reserviert char string[64]; } message; // Erzeuge struct message myMessage; // Wird aufgerufen wenn die Nachricht gesendet wurde void messageSend(uint8_t *mac_addr, uint8_t status) { if (status == 0){ Serial.println("Erfolgreich gesendet"); } else { Serial.println("Fehler beim senden"); } } void setup() { // Starte seriellen Monitor Serial.begin(115200); // Setze Geraet in Station mode WiFi.mode(WIFI_STA); // Init ESP-NOW if (esp_now_init() != 0) { Serial.println("Error initializing ESP-NOW"); } // Setze Rolle das Geraetes esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER); // Setze callback Funktion esp_now_register_send_cb(messageSend); // Koppeln auf Chanel 1 // null und 0 können durch Passwort und Passwortlenge ersetzt werden // betrachten wir in diesem Fall aber nicht esp_now_add_peer(macAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0); } void loop() { // setze Werte myMessage.number = random(100); // zufaellige Zahl char string[32] = "Das ist ein String"; memcpy(&myMessage.string, string, sizeof(string)); // Sende Nachricht ueber ESP-NOW esp_now_send(macAddress, (uint8_t *) &myMessage, sizeof(myMessage)); // 2 Sekunden warten delay(2000); }
Code-Sprache: PHP (php)

Wenn Du mehr Informationen zum Thema MAC-Adressen beim ESP wissen möchtest, schau bei unseren Beitrag ESP Basics – MAC-Adresse herausfinden vorbei.

Empfänger Code

Dieser Code wird auf dem zweiten Gerät hochgeladen. Hierbei empfängt dieser Code eine Nachrichten und gibt sie über den seriellen Monitor aus.

// Bnoetgte Bibliotheken #include <ESP8266WiFi.h> #include <espnow.h> // struct welches übertragen wird // Muss mit Sender uebereinstimmen typedef struct message { long number; char string[64]; } message; // Erzeuge struct message myMessage; // Diese Funktion wird aufgerufen wenn Daten empfangen werden void recive(uint8_t * incommingMacAddress, uint8_t *incomingData, uint8_t len) { // Daten umkopierren um ggf. spaeter nutzen zu koennen memcpy(&myMessage, incomingData, sizeof(myMessage)); // Daten ausgeben Serial.print("Number: "); Serial.println(myMessage.number); Serial.print("String: "); Serial.println(myMessage.string); Serial.println(); } void setup() { // Starte seriellen Monitor Serial.begin(115200); delay(100); // Gibt MAC-Adresse aus Serial.print("MAC Address: "); Serial.println(WiFi.macAddress()); // Setze Geraet in Station mode WiFi.mode(WIFI_STA); // Init ESP-NOW if (esp_now_init() != 0) { Serial.println("Error initializing ESP-NOW"); } // Setze Rolle esp_now_set_self_role(ESP_NOW_ROLE_SLAVE); // Sezte Callback Funktion esp_now_register_recv_cb(recive); } void loop() { }
Code-Sprache: PHP (php)

Hinweis
Strings mit variabler Länge sollten nicht im zu übertragenden struct verwendet werden. Der Grund hierfür ist, dass zur Übertragung die Größe der Daten benötigt wird. Bei einem Arduino-String ist diese Größe allerdings variabel und würde den Versand der Daten deutlich komplizierter machen. Aus diesem Grund verwenden wir ein char[] mit einer festen Länge von 64 Zeichen.

Wenn du die beiden Code Beispiele auf zwei ESP8266 spielst können diese miteinander kommunizieren. Passe diesen Code an deine Bedürfnisse an und setze deine Ideen damit um. Wir freuen uns auf deine Kommentare!

Kommentare

Kommentar schreiben
Lade Seite ...