ESP-NOW Nachrichten übermitteln




Ziele des Projekts

Mit ESP-NOW sol­len ESP32-Mikro­con­trol­ler

  • Text­nach­rich­ten sen­den, emp­fan­gen und im Seri­el­len Moni­tor anzei­gen
  • Daten von Tem­pe­ra­tur­sen­so­ren mes­sen und auf einem LCD/einem OLED anzei­gen

ESP-NOW

ESP-NOW ist ein draht­lo­ses Kom­mu­ni­ka­ti­ons­pro­to­koll für die Kom­mu­ni­ka­ti­on zwi­schen zwei oder meh­re­ren ESP32-Con­trol­lern, das die Über­tra­gung kur­zer Daten­pa­ke­te erlaubt. Die betei­lig­ten ESP32-Mikro­con­trol­ler kön­nen ohne Ver­wen­dung von vor­han­de­nen WiFi-Net­zen direkt mit­ein­an­der kom­mu­ni­zie­ren. ESP-NOW ähnelt zwar der klas­si­schen WLAN-Kom­mu­ni­ka­ti­on, es kommt jedoch ohne Rou­ter oder ande­re typi­sche Netz­werk­kom­po­nen­ten aus.
Vor dem Auf­bau einer Kom­mu­ni­ka­ti­on müs­sen die teil­neh­men­den Gerä­te gekop­pelt wer­den. Nach Abschluss der Kopp­lung besteht eine siche­re Ver­bin­dung zwi­schen den kom­mu­ni­zie­ren­den Gerä­ten.
Die Gerä­te iden­ti­fi­zie­ren sich unter­ein­an­der durch den Aus­tausch ihrer MAC (=Media Access Control)-Adressen.

Die Reich­wei­te ist natür­lich sehr von den bau­li­chen Gege­ben­hei­ten abhän­gig. Ich habe eine Kom­bi­na­ti­on von ESP32-C6 und ESP32-C3 sowohl als Sen­der als auch als Emp­fän­ger ver­wen­det. Alle kön­nen die Daten vom Erd­ge­schoss bis ins zwei­te Ober­ge­schoss sen­den und emp­fan­gen.

Die Hardware

Der Ein­fach­heit hal­ber habe ich aus­schließ­lich Gerä­te ver­wen­det, die über den I²C-Bus ange­steu­ert wer­den:

Natür­lich kannst du auch ande­re Sen­so­ren ver­wen­den.

I²C-Pins der Mikro­con­trol­ler:

Board installieren

Als Mikro­con­trol­ler kön­nen belie­bi­ge Modu­le aus der Fami­lie der ESP32-Mikro­con­trol­ler ver­wen­det wer­den.

MAC-Adresse ermitteln

Den Kom­mu­ni­ka­ti­ons­part­nern müs­sen die jewei­li­gen MAC-Adres­sen bekannt sein. Jedes Netz­werk­ge­rät hat eine indi­vi­du­el­le MAC-Adres­se.
Das Pro­gramm ermit­telt die MAC-Adres­se und zeigt sie im Seri­el­len Moni­tor an. Die for­ma­tier­te MAC-Adres­se kannst du anschlie­ßend kopie­ren und direkt in den Pro­gram­men ver­wen­den.

Funktionen ESP-NOW

Funk­ti­onBeschrei­bungPara­me­ter
esp_now_init();star­tet ESP-NOWRück­ga­be­wert bei Erfolg: ESP_OK
esp_now_add_peer();fügt einen ESP als Kom­mu­ni­ka­ti­ons­part­ner hin­zustruct esp_now_peer_info &peer_info
peer_info.channel -> legt den Über­tra­gungs­ka­nal fest (0 = aktu­el­ler Kanal)
peer_info.peer_addr -> MAC-Adres­se des Kom­mu­ni­ka­ti­ons­part­ners
peer_info.encrypt -> Nach­richt ver­schlüs­seln (true/false)
Rück­ga­be­wert bei Erfolg: ESP_OK
esp_now_send();Nach­richt sen­denPara­me­ter:
MAC-Adres­se
Nach­richt
Grö­ße der Nach­richt
esp_now_register_send_cb(FunktionsName);defi­niert eine Funk­ti­on, die über­prüft, ob eine Nach­richt erfolg­reich gesen­det wur­deRück­ga­be­wert bei Erfolg: ESP_NOW_SEND_SUCCESS
esp_now_register_recv_cb(FunktionsName);defi­niert eine Funk­ti­on, die über­prüft, ob eine Nach­richt erfolg­reich emp­fan­gen wur­de
wer­tet den Inhalt der Nach­richt aus
Para­me­ter:
MAC-Adres­se
Nach­richt
Grö­ße der Nach­richt

Textnachricht senden und empfangen

Sender

In einem ers­ten Schritt soll eine kur­ze Text­nach­richt von einem ESP32 an einen ande­ren ESP32 gesen­det wer­den. Der Text ent­hält eine zufäl­lig erzeug­te Zahl.

  • Es müs­sen kei­ne zusätz­li­chen Biblio­the­ken instal­liert wer­den, es wer­den die „Bord­mit­tel“ ver­wen­det.
  • Die MAC-Adres­se des Emp­fän­gers muss dem Sen­der bekannt gemacht wer­den.
  • Die Varia­ble Emp­faen­ger­Info vom Typ esp_now_peer_info_t ent­hält die benö­tig­ten Infor­ma­tio­nen über den Emp­fän­ger:
    peer_address -> MAC-Adres­se
    chan­nel -> Kanal der Ver­bin­dung (0-13) Stan­dard ist 0
    Wenn der Kanal nicht kor­rekt ist, wird beim Sen­den eine Feh­ler­mel­dung aus­ge­ge­ben:
    Peer chan­nel is not equal to the home chan­nel, send fail!
    encrypt = fal­se -> kei­ne Ver­schlüs­se­lung
  • Die Call­Back-Funk­ti­on esp_now_register_send_cb über­prüft, ob die Nach­richt gesen­det wur­de.
  • esp_now_add_peer fügt die Adres­se des Emp­fän­gers hin­zu.
  • esp_now_send sen­det die Nach­richt und über­prüft gleich­zei­tig mit esp_err_t, ob das Sen­den erfolg­reich war. Der Funk­ti­on wer­den die Adres­se des Emp­fän­gers, die Daten und die Län­ge der Daten über­ge­ben.

Empfänger

Auf der Sei­te des Emp­fän­gers wird im set­up-Teil eine Call­Back-Funk­ti­on Daten­Emp­fan­gen defi­niert: sie wer­tet die emp­fan­ge­nen Daten aus.

Daten an zwei Empfänger senden

Ein ESP32 sen­det Mess­da­ten an zwei Emp­fän­ger. Ein DHT20 lie­fert die Daten, sie wer­den auf einem OLED und einem LCD ange­zeigt.

Sender

  • Die MAC-Adres­sen der Emp­fän­ger wer­den in einem ⇒Array defi­niert.
  • Die Mess­da­ten wer­den in einer ⇒Struk­tur abge­legt.
  • Die Varia­ble Emp­faen­ger­Info vom Typ esp_now_peer_info_t ent­hält die benö­tig­ten Infor­ma­tio­nen über den Emp­fän­ger. Sie wird in einer for-Schlei­fe den jewei­li­gen Emp­fän­gern zuge­wie­sen.
  • Die Mess­da­ten des DHT wer­den den Ele­men­ten des Arrays zuge­ord­net:
    0 -> ers­ter Emp­fän­ger, 1 -> zwei­ter Emp­fän­ger
    Daten[0].Temperatur = dht.getTemperature();
    Daten[0].Luftfeuchtigkeit = dht.getHumidity();
    Daten[1].Temperatur = dht.getTemperature();
    Daten[1].Luftfeuchtigkeit = dht.getHumidity();
  • esp_now_send sen­det die Daten in einer for-Schlei­fe an die Emp­fän­ger.

Benö­tig­te Biblio­the­ken

Empfänger mit LCD

  • Die Defi­ni­ti­on der struct Daten_Struktur muss beim Sen­der und den Emp­fän­gern über­ein­stim­men.
  • Die Regis­trie­rung der Funk­ti­on Daten­Emp­fan­gen über die Call­Back-Funk­ti­on esp_now_register_recv_cb sorgt für die Dar­stel­lung der Daten..

Empfänger mit OLED

Daten von zwei Sendern an Empfänger übermitteln

Zwei Sen­der wer­den jeweils mit einem BME280 bestückt, sie lie­fern die gemes­se­nen Daten an einen Emp­fän­ger.

Benö­tig­te Biblio­thek

Sender 0

  • Die struct Daten_Struktur beinhal­tet die ID des Sen­ders als int und Tem­pe­ra­tur, Luft­feuch­tig­keit und Luft­druck als float.
  • Im loop-Teil wer­den die ID des Sen­ders und die Mess­wer­te der Daten­struk­tur (Nach­richt) zuge­ord­net.

Sender 1

Empfänger

  • Der Daten­struk­tur wer­den drei Bezeich­nun­gen zuge­ord­net (Sen­der, Sender1, Sender2).
  • Das Array Anzahl­Con­trol­ler ent­hält als Ele­men­te die bei­den Sen­der.
  • die emp­fan­ge­nen Daten müs­sen den jewei­li­gen Sen­dern zuge­ord­net wer­den:
    AnzahlSender[Sender.ID].Temperatur = Sender.Temperatur;
    AnzahlSender[Sender.ID].Luftfeuchtigkeit = Sender.Luftfeuchtigkeit;
    AnzahlSender[Sender.ID].Luftdruck = Sender.Luftdruck;
  • Anschlie­ßend wird die ID des Sen­ders abge­fragt und die Mess­da­ten im Seri­el­len Moni­tor und auf dem LCD dar­ge­stellt.

Quellen


Letz­te Aktua­li­sie­rung: Feb. 5, 2026 @ 19:07

Inhalt