Hauptmenue
Netcoast.ch
Mikrocontroller

05.03.2025 - Seite im Aufbau

Einleitung

Mit dem ESP-NOW Protokoll (von Espressif entwickelt) können mehrere Geräte direkt miteinander kommunizieren, ohne Wi-Fi (ESP8266 & ESP32).
Das Protokoll ist ähnlich wie das low-power 2.4Ghz. nachdem sie verbunden sind, ist die Verbindung sicher und peer-to-peer, kein Handshake ist nötig.
Das heisst, selbst wenn eines der ESP-Geräte neustartet / Strom verliert und es danach neustartet, verbindet es sich danach automatisch neu und kann weiter arbeiten.

ESP-NOW unterstützt folgende Features:
ESP-NOW hat aber folgende Limitierungen: ESP-NOW ist ein schnelles Kommunikationsprotokoll, welches benutzt werden kann um kleine Nachrichten (bis zu 250 Bytes) zwischen ESP8266 / ESP92 Geräten auszutauschen.
Die Kommunikation kann sowohl Einweg als auch Zweiweg beinhalten.


Die ganzen Informationen habe ich von hier: https://randomnerdtutorials.com/esp-now-esp8266-nodemcu-arduino-ide/.
Dieser Artikel behandelt das Thema vertiefter und zeigt auch die verschiedenen Einsatzarten.

Einfaches Beispiel von Sender und Empfänger

In wahrscheinlich den meisten Anwendungen wo ESP-NOW zum Einsatz kommt, möchte man einfach Daten von einem oder mehrerer Geräte an ein einzelndes Senden, welches dann diese Daten verarbeitet.
Zum Beispiel Temperaturinformationen von Temperaturfühler an die Wetterstation senden, oder von einer Fernbedienung Steuerbefehle an ein Gerät senden.
Dazu benötigen wir:

MAC-Adresse von Empfänger ermitteln

Vom Gerät welches die Daten empfangen soll benötigt man die MAC-Adresse, welche dann im Sender-Code eingesetzt werden muss.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/get-change-esp32-esp8266-mac-address-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <ESP8266WiFi.h>

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.print("ESP Board MAC Address:  ");
  Serial.println(WiFi.macAddress());
}
 
void loop(){

}


Server Code (Empfänger)

Das Server-Sketch verwendet in diesem Beispiel diverse Datentypen, die müssen natürlich nicht alle verwendet werden, können auch alle in zum Beispiel nur einen Datentyp umgewandelt werden.
Wichtig ist aber, dass man im Sender-Sketch diese dann angleicht.
Achtung 250-Bytes...

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <espnow.h>

// Beispiel einer Datenstruktur um Daten zu empfangen.
// Muss dem Sender entsprechen!
typedef struct struct_message {
    char a[32];
    int b;
    float c;
    String d;
    bool e;
} struct_message;

// Erstellen einer struct_message mit Bezeichnung myData
struct_message myData;

// Callback-Funktion, welche ausgeführt wird, sobald Daten empfangen wurden
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.print("Char: ");
  Serial.println(myData.a);
  Serial.print("Int: ");
  Serial.println(myData.b);
  Serial.print("Float: ");
  Serial.println(myData.c);
  Serial.print("String: ");
  Serial.println(myData.d);
  Serial.print("Bool: ");
  Serial.println(myData.e);
  Serial.println();
}
 
void setup() {
  Serial.begin(115200);
  
  // Gerät als Wi-Fi Station definieren
  WiFi.mode(WIFI_STA);

  // Initieren von ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Fehler beim Initialisieren von ESP-NOW");
    return;
  }
  
  // Sobald ESP-NOW initiert wurde, registrieren wir recv CB zu get recv packer info
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(OnDataRecv);
}

void loop() {
  
}


Client Code (Sender)

Wichtig: die broadcastAddress[] muss jetzt mit der MAC-Adresse vom Empfänger (Server) versehen werden!
Das Client-Sketch (Sender) verwendet in diesem Beispiel diverse Datentypen, die müssen natürlich nicht alle verwendet werden, können auch alle in zum Beispiel nur einen Datentyp umgewandelt werden.
Wichtig ist aber, dass man im Empfänger-Sketch (Server) diese dann angleicht.
Achtung 250-Bytes...

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <espnow.h>

// Mit Empfänger MAC-Adresse ergänzen (Server-Gerät)
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// Beispiel einer Datenstruktur um Daten zu empfangen.
// Muss dem Empfänger entsprechen!
typedef struct struct_message {
  char a[32];
  int b;
  float c;
  String d;
  bool e;
} struct_message;

// Erstellen einer struct_message mit Bezeichnung myData
struct_message myData;

unsigned long lastTime = 0;  
unsigned long timerDelay = 2000;  // Timer in Millisekunden, alle X-Millisekunden werden die Daten gesendet.

// Callback wenn Daten gesendet wurden
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Letztes gesendetes Packet Status: ");
  if (sendStatus == 0){
    Serial.println("Erfolgreich!");
  }
  else{
    Serial.println("Fehler!");
  }
}
 
void setup() {
  // Init Serial Monitor
  Serial.begin(115200);
  
  // Definiere Gerät als Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Fehler beim Initialisieren von ESP-NOW!");
    return;
  }

  // Sobald ESP-Now initialisiert wurde, registrieren wir Send CB um
  // den Status vom übertragenen Paket zu erhalten
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(OnDataSent);
  
  // Register peer
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}
 
void loop() {
  if ((millis() - lastTime) > timerDelay) {
    // Set values to send
    strcpy(myData.a, "THIS IS A CHAR");
    myData.b = random(1,20);
    myData.c = 1.2;
    myData.d = "Hello";
    myData.e = false;

    // Sende Nachricht über ESP-NOW
    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

    lastTime = millis();
  }
}


Einleitung

Mit dem ESP-NOW Protokoll (von Espressif entwickelt) können mehrere Geräte direkt miteinander kommunizieren, ohne Wi-Fi (ESP8266 & ESP32).
Das Protokoll ist ähnlich wie das low-power 2.4Ghz. nachdem sie verbunden sind, ist die Verbindung sicher und peer-to-peer, kein Handshake ist nötig.
Das heisst, selbst wenn eines der ESP-Geräte neustartet / Strom verliert und es danach neustartet, verbindet es sich danach automatisch neu und kann weiter arbeiten.

ESP-NOW unterstützt folgende Features:
ESP-NOW hat aber folgende Limitierungen: ESP-NOW ist ein schnelles Kommunikationsprotokoll, welches benutzt werden kann um kleine Nachrichten (bis zu 250 Bytes) zwischen ESP8266 / ESP92 Geräten auszutauschen.
Die Kommunikation kann sowohl Einweg als auch Zweiweg beinhalten.


Die ganzen Informationen habe ich von hier: https://randomnerdtutorials.com/esp-now-esp8266-nodemcu-arduino-ide/.
Dieser Artikel behandelt das Thema vertiefter und zeigt auch die verschiedenen Einsatzarten.

Einfaches Beispiel von Sender und Empfänger

In wahrscheinlich den meisten Anwendungen wo ESP-NOW zum Einsatz kommt, möchte man einfach Daten von einem oder mehrerer Geräte an ein einzelndes Senden, welches dann diese Daten verarbeitet.
Zum Beispiel Temperaturinformationen von Temperaturfühler an die Wetterstation senden, oder von einer Fernbedienung Steuerbefehle an ein Gerät senden.
Dazu benötigen wir:

MAC-Adresse von Empfänger ermitteln

Vom Gerät welches die Daten empfangen soll benötigt man die MAC-Adresse, welche dann im Sender-Code eingesetzt werden muss.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/get-change-esp32-esp8266-mac-address-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <ESP8266WiFi.h>

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.print("ESP Board MAC Address:  ");
  Serial.println(WiFi.macAddress());
}
 
void loop(){

}


Server Code (Empfänger)

Das Server-Sketch verwendet in diesem Beispiel diverse Datentypen, die müssen natürlich nicht alle verwendet werden, können auch alle in zum Beispiel nur einen Datentyp umgewandelt werden.
Wichtig ist aber, dass man im Sender-Sketch diese dann angleicht.
Achtung 250-Bytes...

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <espnow.h>

// Beispiel einer Datenstruktur um Daten zu empfangen.
// Muss dem Sender entsprechen!
typedef struct struct_message {
    char a[32];
    int b;
    float c;
    String d;
    bool e;
} struct_message;

// Erstellen einer struct_message mit Bezeichnung myData
struct_message myData;

// Callback-Funktion, welche ausgeführt wird, sobald Daten empfangen wurden
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.print("Char: ");
  Serial.println(myData.a);
  Serial.print("Int: ");
  Serial.println(myData.b);
  Serial.print("Float: ");
  Serial.println(myData.c);
  Serial.print("String: ");
  Serial.println(myData.d);
  Serial.print("Bool: ");
  Serial.println(myData.e);
  Serial.println();
}
 
void setup() {
  Serial.begin(115200);
  
  // Gerät als Wi-Fi Station definieren
  WiFi.mode(WIFI_STA);

  // Initieren von ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Fehler beim Initialisieren von ESP-NOW");
    return;
  }
  
  // Sobald ESP-NOW initiert wurde, registrieren wir recv CB zu get recv packer info
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(OnDataRecv);
}

void loop() {
  
}


Client Code (Sender)

Wichtig: die broadcastAddress[] muss jetzt mit der MAC-Adresse vom Empfänger (Server) versehen werden!
Das Client-Sketch (Sender) verwendet in diesem Beispiel diverse Datentypen, die müssen natürlich nicht alle verwendet werden, können auch alle in zum Beispiel nur einen Datentyp umgewandelt werden.
Wichtig ist aber, dass man im Empfänger-Sketch (Server) diese dann angleicht.
Achtung 250-Bytes...

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <espnow.h>

// Mit Empfänger MAC-Adresse ergänzen (Server-Gerät)
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// Beispiel einer Datenstruktur um Daten zu empfangen.
// Muss dem Empfänger entsprechen!
typedef struct struct_message {
  char a[32];
  int b;
  float c;
  String d;
  bool e;
} struct_message;

// Erstellen einer struct_message mit Bezeichnung myData
struct_message myData;

unsigned long lastTime = 0;  
unsigned long timerDelay = 2000;  // Timer in Millisekunden, alle X-Millisekunden werden die Daten gesendet.

// Callback wenn Daten gesendet wurden
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Letztes gesendetes Packet Status: ");
  if (sendStatus == 0){
    Serial.println("Erfolgreich!");
  }
  else{
    Serial.println("Fehler!");
  }
}
 
void setup() {
  // Init Serial Monitor
  Serial.begin(115200);
  
  // Definiere Gerät als Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Fehler beim Initialisieren von ESP-NOW!");
    return;
  }

  // Sobald ESP-Now initialisiert wurde, registrieren wir Send CB um
  // den Status vom übertragenen Paket zu erhalten
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(OnDataSent);
  
  // Register peer
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}
 
void loop() {
  if ((millis() - lastTime) > timerDelay) {
    // Set values to send
    strcpy(myData.a, "THIS IS A CHAR");
    myData.b = random(1,20);
    myData.c = 1.2;
    myData.d = "Hello";
    myData.e = false;

    // Sende Nachricht über ESP-NOW
    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

    lastTime = millis();
  }
}