Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Gartenautomation
  • Mikrocontroller
    • Arduino
    • ESP32 & Co.
    • Calliope Mini
    • Raspberry Pi & Pico
  • Solo Mining
  • Deutsch
  • English
Menu

ESP-NOW v2 im Einsatz: Unterschiede, Migration & Beispiele

Veröffentlicht am 6. Oktober 20255. Oktober 2025 von Stefan Draeger

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.

ESP-NOW v2 im Einsatz: Unterschiede, Migration & Beispiele
Dieses Video auf YouTube ansehen.

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)
    • Anschlussplan
  • 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:

Merkmalv1v2
Max. Payload250 Bytes1470 Bytes
KompatibilitätNur v1 ↔ v1v2 ↔ v2 (bis 1470 B) v2 ↔ v1 (max. 250 B)
Datenrate1 Mbps1 Mbps
SicherheitPMK/LMK, AES, limitierte PeersGleicher Mechanismus, Payload größer
Einsatz in Mixed-NetzenEinschränkendFä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:

  • Espressif ESP-NOW API Reference
  • ESP-NOW v2 (ESP-IDF v5.1+)

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.

ESP-NOW Beispiel v1 - Taster und LED
ESP-NOW Beispiel v1 – Taster und LED

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.

VersionMax. PayloadTextmengeBeispiel
ESP-NOW v1250 Bytesca. 35–40 Wörter„Temperatur: 23.5 °C,
Luftfeuchte: 45 %“
ESP-NOW v21470 Bytesca. 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

VerbindungESP32-S3 Zero (Sender)ESP32-C3 Super Mini (Empfänger)
TasterZwischen Pin 1 und GND—
VCC (3,3 V)—→ OLED VCC
GND—→ OLED GND
SDA—GPIO 5
SCL—GPIO 6
LED, AnodeGPIO 21
LED, Kathode220 Ohm Widerstand → GND
ESP32-C3 Pinout
ESP32-C3 Pinout
Aufbau - ESP32-S3-Zero
Aufbau – ESP32-S3-Zero

💡 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.

ESP-NOW Beispiel v1 – Taster, LED und OLED Display

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

Foto von Stefan Draeger
Über den Autor

Stefan Draeger — Entwickler & Tech-Blogger

Ich zeige praxisnah, wie du Projekte mit Arduino, ESP32 und Smarthome-Komponenten umsetzt – Schritt für Schritt, mit Code und Schaltplänen.

Mehr Artikel von Stefan →

Schreibe einen Kommentar Antwort abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen
Tel.: 015565432686
E-Mail: info@draeger-it.blog

Folge mir auf

link zu Fabook
link zu LinkedIn
link zu YouTube
link zu TikTok
link zu Pinterest
link zu Instagram
  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}