Mit ESP-NOW v2 hat Espressif das beliebte Protokoll für drahtlose Kommunikation zwischen ESP32-Geräten deutlich erweitert. Statt nur 250 Byte lassen sich nun bis zu 1470 Byte pro Paket übertragen – ideal für komplexere Datenstrukturen und IoT-Projekte. Doch mit den neuen Möglichkeiten kommen auch Änderungen: Limitierungen bei verschlüsselten Peers, Unterschiede in der Kompatibilität zu v1 und ein angepasstes Handling in der Arduino-Programmierung.
In diesem Beitrag zeige ich dir die wichtigsten Unterschiede zwischen ESP-NOW v1 und v2, erkläre, wie du bestehende Projekte migrierst, und stelle dir praxisnahe Beispiele für den Einsatz von ESP-NOW v2 vor.
Inhaltsverzeichnis
- Was sind die Unterschiede zwischen v1 & v2 bei ESP-NOW?
- Rückblick: ESP-NOW v1 auf dem ESP32
- Wie viel Text kann ich mit 1,4 kByte senden – und warum das wichtig ist
- Schaltung: ESP-NOW v2 mit ESP32-S3 Zero (Sender) und ESP32-C3 Super Mini (Empfänger)
- Nutze ich automatisch ESP-NOW v2?
- OLED-Display als Erweiterung der v1-Schaltung
- Fazit
Was sind die Unterschiede zwischen v1 & v2 bei ESP-NOW?
Mit ESP-NOW v2 bringt Espressif größere Datenpakete und eine bessere Abwärtskompatibilität. Die Kernunterschiede findest du in der folgenden Übersicht:
Merkmal | v1 | v2 |
---|---|---|
Max. Payload | 250 Bytes | 1470 Bytes |
Kompatibilität | Nur v1 ↔ v1 | v2 ↔ v2 (bis 1470 B) v2 ↔ v1 (max. 250 B) |
Datenrate | 1 Mbps | 1 Mbps |
Sicherheit | PMK/LMK, AES, limitierte Peers | Gleicher Mechanismus, Payload größer |
Einsatz in Mixed-Netzen | Einschränkend | Fällt auf 250 B zurück, wenn v1 dabei ist |
Details:
- Payload: v2 erlaubt bis zu 1470 Bytes pro Paket, ideal für Sensor-Bundles oder strukturierte Daten.
- Kompatibilität: In gemischten Netzwerken bist du auf 250 Bytes beschränkt.
- Sicherheit: Bleibt AES-basiert, nur die Paketgröße wächst.
- Datenrate: Keine Änderung – weiterhin 1 Mbps.
Quellen:
Rückblick: ESP-NOW v1 auf dem ESP32
Bereits in meinem früheren Beitrag habe ich gezeigt, wie sich mit ESP-NOW v1 einfache und effiziente Funkverbindungen zwischen ESP32-Boards aufbauen lassen – ganz ohne WLAN-Router oder zusätzliches Protokoll. Mit einer maximalen Paketgröße von 250 Bytes eignet sich v1 vor allem für kleine Sensordaten, Statusmeldungen oder Steuerbefehle.

Den vollständigen Beitrag findest du hier: Drahtlos und effizient: Erste Schritte mit ESP-NOW und dem ESP32-S3 Zero
Wie viel Text kann ich mit 1,4 kByte senden – und warum das wichtig ist
Mit ESP-NOW v1 war bei rund 250 Byte Schluss – das reicht für einfache Sensordaten, Steuerbefehle oder kurze Textmeldungen. Doch mit ESP-NOW v2 hat Espressif die maximale Paketgröße auf bis zu 1470 Byte erweitert. Klingt nach einer kleinen Zahl, macht in der Praxis aber einen riesigen Unterschied.
Ein einzelnes ASCII-Zeichen benötigt 1 Byte. Damit lassen sich jetzt rund 1 400 Zeichen oder etwa 200 Wörter in einer einzigen Nachricht übertragen.
Zum Vergleich: Mit v1 passt gerade einmal ein kurzer Satz hinein, während v2 Platz für ganze Absätze oder komplexe JSON-Strukturen bietet.
Version | Max. Payload | Textmenge | Beispiel |
---|---|---|---|
ESP-NOW v1 | 250 Bytes | ca. 35–40 Wörter | „Temperatur: 23.5 °C, Luftfeuchte: 45 %“ |
ESP-NOW v2 | 1470 Bytes | ca. 210–230 Wörter | „Sensordaten-Array mit mehreren Messpunkten, Statuswerten und Zeitstempeln“ |
Das eröffnet ganz neue Möglichkeiten:
- Mehrere Sensordaten in einem Paket bündeln statt viele kleine Nachrichten zu senden.
- Lange Statusmeldungen oder Debug-Informationen verschicken.
- Kleine JSON-Objekte oder Textprotokolle direkt per ESP-NOW übertragen – ohne Chunking oder Kompression.
Gerade in IoT-Anwendungen, bei denen kein WLAN oder MQTT zur Verfügung steht, wird ESP-NOW v2 dadurch deutlich flexibler und effizienter.
Schaltung: ESP-NOW v2 mit ESP32-S3 Zero (Sender)
und ESP32-C3 Super Mini (Empfänger)
Für das folgende Beispiel verwende ich zwei unterschiedliche Boards, die direkt über ESP-NOW v2 miteinander kommunizieren:
- ESP32-S3 Zero → Sender
- ESP32-C3 Super Mini → Empfänger
Der Sender verfügt über einen Taster, der beim Drücken ein JSON-Paket mit Sensordaten (z. B. Temperatur, Luftfeuchte oder Statuswerte) an den Empfänger sendet.
Der Empfänger zeigt die empfangenen Daten auf einem OLED-Display an und gibt sie zusätzlich über die serielle Schnittstelle aus.
Anschlussplan
Verbindung | ESP32-S3 Zero (Sender) | ESP32-C3 Super Mini (Empfänger) |
---|---|---|
Taster | Zwischen Pin 1 und GND | — |
VCC (3,3 V) | — | → OLED VCC |
GND | — | → OLED GND |
SDA | — | GPIO 5 |
SCL | — | GPIO 6 |
LED, Anode | GPIO 21 | |
LED, Kathode | 220 Ohm Widerstand → GND |
💡 Hinweis:
- Der Taster am ESP32-S3 Zero nutzt GPIO 0 mit internem Pull-Up. Beim Drücken wird der Eingang auf LOW gezogen.
- Das OLED-Display ist ein Standard-Modul (SSD1306 I²C). Die Pins SDA/SCL können je nach C3-Board variieren – prüfe ggf. das Datenblatt oder das Pinout deines Moduls.
Beide Mikrocontroller sind ausschließlich über ESP-NOW v2 verbunden – es ist kein WLAN-Access-Point oder Router erforderlich.
Der Datentransfer erfolgt Peer-to-Peer und zeigt in diesem Beispiel, wie sich mit v2 auch strukturierte JSON-Daten (statt einfacher Zahlen) zuverlässig übertragen lassen.
Nutze ich automatisch ESP-NOW v2?
Kurz: Nein. Du verwendest ESP-NOW v2 nur dann, wenn beide Geräte eine Firmware/Arduino-Core-Version mit v2-Support besitzen und du Payloads > 250 Bytes sendest. Es gibt keinen Umschalter im Code (kein setVersion(2)
).
- v1 funktioniert immer bis 250 B.
- v2 erlaubt bis 1470 B, greift aber nur, wenn Sender und Empfänger v2 können.
- In gemischten Netzen (v1↔v2) gilt faktisch v1 (kleine Pakete), große v2-Pakete werden verworfen/gekürzt.
OLED-Display als Erweiterung der v1-Schaltung
Für dieses Beispiel habe ich die bestehende ESP-NOW v1-Schaltung um ein kleines OLED-Display (SSD1306, 128×64 Pixel) erweitert.
Der Empfänger zeigt nun nicht mehr nur den LED-Zustand an, sondern gibt zusätzlich folgende Informationen aus:
- die Anzahl der empfangenen Bytes,
- den Zeitstempel (aus der Arduino-Funktion
millis()
), - sowie den Text „Hallo Welt!“, der vom Sender übertragen wird.
Die Daten stammen vollständig vom ESP32-S3 Zero (Sender) und werden über ESP-NOW v2 an den ESP32-C3 Super Mini (Empfänger) gesendet.
Auf dem OLED erscheint damit eine kompakte Statusanzeige, die jeden Tastendruck visuell nachvollziehbar macht.
So wird auf einen Blick deutlich, welche Daten gerade über ESP-NOW übertragen wurden und dass sich mit v2 – dank größerer Paketgröße – künftig noch komplexere Inhalte wie JSON-Objekte oder Sensordatenstrukturen darstellen lassen.
Sender
/* -------------------------------------------------------------- ESP-NOW v2 Sender – Datenübertragung mit Tasterereignis -------------------------------------------------------------- Dieses Beispiel zeigt, wie ein ESP32-S3 (oder jedes andere ESP32-Board) per ESP-NOW eine strukturierte Nachricht an einen Empfänger sendet. Beim Drücken des Tasters wird eine kleine Datenstruktur übermittelt, die den Tasterstatus, einen Zeitstempel (millis) und einen Text („Hallo Welt!“) enthält. Das Beispiel nutzt die ESP-NOW-Technologie von Espressif, um Daten direkt und ohne WLAN-Router zwischen zwei ESP32-Geräten zu übertragen. Es eignet sich ideal, um die Funktion und Vorteile von ESP-NOW v2 (größere Payloads bis 1470 Byte) praktisch zu testen. Detaillierte Anleitung, Schaltplan und Hintergrundinfos findest du hier: → https://draeger-it.blog/esp-now-v2-im-einsatz-unterschiede-migration-beispiele/ Autor: Stefan Draeger Projekt: draeger-it.blog Datum: Oktober 2025 -------------------------------------------------------------- */ #include <esp_now.h> #include <WiFi.h> // -------------------- // Pin-Definition // -------------------- #define taster 1 // GPIO für den Taster (Pull-Up aktiviert) // -------------------- // MAC-Adresse des Empfängers // -------------------- uint8_t broadcastAddress[] = { 0x40, 0x4C, 0xCA, 0xF6, 0x03, 0xCC }; // -------------------- // Datenstruktur für die zu übertragenden Werte // -------------------- struct Message { bool isActive; // Tasterstatus (true/false) long millis; // Zeitstempel (ms seit Start) uint16_t textLen; // Länge des übertragenen Textes char text[250]; // Textnachricht (max. 250 Zeichen für v1) }; // Instanz der Struktur Message message; // Peer-Information (Zielgerät) esp_now_peer_info_t peerInfo; // -------------------- // Callback nach dem Senden // -------------------- void OnDataSent(const wifi_tx_info_t* wifiInfo, esp_now_send_status_t status) { Serial.print("\r\nStatus:\tZustellung "); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "erfolgreich!" : "fehlerhaft!"); } // -------------------- // Setup // -------------------- void setup() { Serial.begin(115200); pinMode(taster, INPUT_PULLUP); // Taster als Eingang mit internem Pull-Up WiFi.mode(WIFI_STA); // Station-Mode verhindert Interferenzen // ESP-NOW initialisieren if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } // Callback für Sendestatus registrieren esp_now_register_send_cb(OnDataSent); // Empfänger (Peer) konfigurieren memcpy(peerInfo.peer_addr, broadcastAddress, 6); peerInfo.channel = 0; // aktueller Kanal peerInfo.encrypt = false; // unverschlüsselt (Demo) // Peer zur Liste hinzufügen if (esp_now_add_peer(&peerInfo) != ESP_OK) { Serial.println("Failed to add peer"); return; } } // -------------------- // Hauptschleife // -------------------- void loop() { // Prüfen, ob Taster gedrückt wurde (LOW = gedrückt) if (digitalRead(taster) == LOW) { // Tasterstatus toggeln message.isActive = !message.isActive; message.millis = millis(); // Beispieltext (max. 250 Zeichen für v1) const char *demo = "Hallo Welt!"; message.textLen = strnlen(demo, sizeof(message.text)); snprintf(message.text, sizeof(message.text), "%s", demo); // Nachricht senden esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&message, sizeof(message)); // Status ausgeben if (result == ESP_OK) { Serial.println("Senden erfolgreich!"); } else { Serial.println("Fehler beim Absenden der Daten!"); } delay(250); // Entprellzeit } delay(50); // Schleife leicht bremsen }
Empfänger
/* -------------------------------------------------------------- ESP-NOW v2 Empfänger – OLED-Anzeige und LED-Steuerung -------------------------------------------------------------- Dieses Beispiel zeigt, wie ein ESP32-C3 (oder anderes ESP32-Board) Nachrichten über ESP-NOW empfängt, die zuvor von einem Sender (z. B. ESP32-S3 Zero) verschickt wurden. Der Empfänger liest die gesendete Datenstruktur aus, gibt sie auf der seriellen Konsole aus und zeigt die empfangenen Informationen auf einem OLED-Display (SSD1306, I²C) an. Gleichzeitig wird der LED-Status entsprechend der empfangenen Daten gesetzt. Angezeigt werden: • Anzahl der empfangenen Bytes • Zeitstempel (millis) • Textnachricht („Hallo Welt!“) • LED-Status („AN“ / „AUS“) Damit lässt sich sehr gut beobachten, wie ESP-NOW v2 mit größeren Payloads arbeitet – etwa, wenn Texte oder JSON-Daten gesendet werden. Detaillierte Beschreibung und Schaltplan findest du hier: → https://draeger-it.blog/esp-now-v2-im-einsatz-unterschiede-migration-beispiele/ Autor: Stefan Draeger Projekt: draeger-it.blog Datum: Oktober 2025 -------------------------------------------------------------- */ #include <esp_now.h> #include <WiFi.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // -------------------- // OLED-Konfiguration // -------------------- #define SDA_PIN 6 #define SCL_PIN 7 #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 // kein Reset-Pin #define OLED_ADDR 0x3C // Standardadresse Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // -------------------- // LED-Pin // -------------------- #define led 21 // -------------------- // Datenstruktur (muss mit Sender identisch sein!) // -------------------- struct Message { bool isActive; // Tasterstatus (an/aus) long millis; // Zeitstempel uint16_t textLen; // Länge des Textes (ohne \0) char text[1200]; // Textpuffer (v1: ≤250 B, v2: bis ~1470 B) }; // -------------------- // Callback: wird bei Empfang ausgeführt // -------------------- void OnDataRecv(const esp_now_recv_info* info, const uint8_t* incomingData, int len) { Message message{}; // Empfangspuffer int copy = min(len, (int)sizeof(message)); // sichere Kopiergröße memcpy(&message, incomingData, copy); // Text terminieren int clamp = min((int)message.textLen, (int)sizeof(message.text) - 1); message.text[clamp] = '\0'; // --- Serielle Ausgabe --- Serial.printf("Bytes received: %d\n", len); Serial.printf("isActive=%u, millis=%lu, textLen=%u\n", message.isActive, (unsigned long)message.millis, message.textLen); Serial.printf("Msg: %s\n", message.text); // LED-Logik: invertierter Status bool isLEDActive = message.isActive == 0 ? true : false; digitalWrite(led, isLEDActive); // --- OLED-Anzeige --- display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setTextSize(1); String msg = "Bytes: " + String(len); String time = "millis: " + String(message.millis); String text = "Msg: " + String(message.text); display.setCursor(0, 5); display.println(msg); display.setCursor(0, 15); display.println(time); display.setCursor(0, 25); display.println(text); display.setTextSize(2); display.setCursor(40, 40); display.println(isLEDActive ? "AN" : "AUS"); display.display(); } // -------------------- // Setup // -------------------- void setup() { Serial.begin(115200); Wire.begin(SDA_PIN, SCL_PIN); pinMode(led, OUTPUT); digitalWrite(led, LOW); WiFi.mode(WIFI_STA); // Station-Modus = stabile MAC // ESP-NOW initialisieren if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } // OLED starten if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) { Serial.println("OLED konnte nicht gestartet werden!"); for (;;) delay(100); } // Callback registrieren esp_now_register_recv_cb(OnDataRecv); Serial.println("Empfänger bereit – wartet auf ESP-NOW-Nachrichten …"); } // -------------------- // Hauptschleife (leer – alles passiert im Callback) // -------------------- void loop() { // keine Logik nötig }
Fazit
Mit ESP-NOW v2 hat Espressif das Protokoll auf ein neues Level gebracht. Statt nur 250 Byte pro Paket stehen nun bis zu 1,47 kB Nutzlast zur Verfügung – genug für komplette JSON-Strukturen, Sensordatensätze oder Debug-Meldungen in einem Rutsch.
Die größte Stärke liegt dabei in der Kompatibilität und Einfachheit: Der Code bleibt nahezu identisch zu v1, funktioniert aber deutlich flexibler. Bestehende Projekte lassen sich mit minimalem Aufwand migrieren, und die größere Payload öffnet viele neue Anwendungsmöglichkeiten – von batteriebetriebenen IoT-Sensoren bis hin zu Mini-Datennetzwerken ohne WLAN-Infrastruktur.
Gerade in Zeiten, in denen immer mehr Mikrocontroller energieeffizient und autark arbeiten sollen, ist ESP-NOW v2 eine willkommene Weiterentwicklung: schnell, direkt und jetzt auch richtig leistungsfähig.
Letzte Aktualisierung am: 05. Oktober 2025