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:
- Verschlüsselte und unverschlüsselte Kommunikation.
- Gemischt verschlüsselte und unverschlüsselte Geräte.
- Maximale Datenlast von 250-Byte können transportiert werden.
- Möglichkeit von Verwendung von Callback-Funktionen für erfolgreiche oder fehlgeschlagene Übertragung rückmelden.
ESP-NOW hat aber folgende Limitierungen:
- Limitierte verschlüsselte Peer-Geräte. 10 verschlüsselte Peer-Geräte sind das Maximum im Station Modus. 6 als Maximum im SoftAP oder SoftAP und Station Modus.
- Unverschlüsselte Peer-Geräte sind circa 20 Stück (unverschlüsselte und verschlüsselte zusammen).
- Maximale Datenlast von 250-Byte können transportiert werden.
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:
- Sender-ESP
- Empfänger-ESP
- MAC-Adresse von Empfänger-ESP
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:
- Verschlüsselte und unverschlüsselte Kommunikation.
- Gemischt verschlüsselte und unverschlüsselte Geräte.
- Maximale Datenlast von 250-Byte können transportiert werden.
- Möglichkeit von Verwendung von Callback-Funktionen für erfolgreiche oder fehlgeschlagene Übertragung rückmelden.
ESP-NOW hat aber folgende Limitierungen:
- Limitierte verschlüsselte Peer-Geräte. 10 verschlüsselte Peer-Geräte sind das Maximum im Station Modus. 6 als Maximum im SoftAP oder SoftAP und Station Modus.
- Unverschlüsselte Peer-Geräte sind circa 20 Stück (unverschlüsselte und verschlüsselte zusammen).
- Maximale Datenlast von 250-Byte können transportiert werden.
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:
- Sender-ESP
- Empfänger-ESP
- MAC-Adresse von Empfänger-ESP
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();
}
}