ESP-NOW Nachrichten übermitteln

Lesezeit: 10 Minuten


Ziele des Projekts

Mit ESP-NOW sollen ESP32-Mikro­con­troller

  • Textnachricht­en senden, emp­fan­gen und im Seriellen Mon­i­tor anzeigen
  • Dat­en von Tem­per­atursen­soren messen und auf einem LCD/einem OLED anzeigen

ESP-NOW

ESP-NOW ist ein draht­los­es Kom­mu­nika­tion­spro­tokoll für die Kom­mu­nika­tion zwis­chen zwei oder mehreren ESP32-Con­trollern, das die Über­tra­gung kurz­er Daten­pakete erlaubt. Die beteiligten ESP32-Mikro­con­troller kön­nen ohne Ver­wen­dung von vorhan­de­nen WiFi-Net­zen direkt miteinan­der kom­mu­nizieren. ESP-NOW ähnelt zwar der klas­sis­chen WLAN-Kom­mu­nika­tion, es kommt jedoch ohne Router oder andere typ­is­che Net­zw­erkkom­po­nen­ten aus.
Vor dem Auf­bau ein­er Kom­mu­nika­tion müssen die teil­nehmenden Geräte gekop­pelt wer­den. Nach Abschluss der Kop­plung beste­ht eine sichere Verbindung zwis­chen den kom­mu­nizieren­den Geräten.
Die Geräte iden­ti­fizieren sich untere­inan­der durch den Aus­tausch ihrer MAC (=Media Access Control)-Adressen.

Die Reich­weite ist natür­lich sehr von den baulichen Gegeben­heit­en abhängig. Ich habe eine Kom­bi­na­tion von ESP32-C6 und ESP32-C3 sowohl als Sender als auch als Empfänger ver­wen­det. Alle kön­nen die Dat­en vom Erdgeschoss bis ins zweite Obergeschoss senden und emp­fan­gen.

Die Hardware

Der Ein­fach­heit hal­ber habe ich auss­chließlich Geräte ver­wen­det, die über den I²C-Bus anges­teuert wer­den:

Natür­lich kannst du auch andere Sen­soren ver­wen­den.

I²C-Pins der Mikro­con­troller:

Board installieren

Als Mikro­con­troller kön­nen beliebige Mod­ule aus der Fam­i­lie der ESP32-Mikro­con­troller ver­wen­det wer­den.

MAC-Adresse ermitteln

Den Kom­mu­nika­tion­spart­nern müssen die jew­eili­gen MAC-Adressen bekan­nt sein. Jedes Net­zw­erkgerät hat eine indi­vidu­elle MAC-Adresse.
Das Pro­gramm ermit­telt die MAC-Adresse und zeigt sie im Seriellen Mon­i­tor an. Die for­matierte MAC-Adresse kannst du anschließend kopieren und direkt in den Pro­gram­men ver­wen­den.

Funktionen ESP-NOW

Funk­tionBeschrei­bungPara­me­ter
esp_now_init();startet ESP-NOWRück­gabe­w­ert bei Erfolg: ESP_OK
esp_now_add_peer();fügt einen ESP als Kom­mu­nika­tion­spart­ner hinzustruct esp_now_peer_info &peer_info
peer_info.channel -> legt den Über­tra­gungskanal fest (0 = aktueller Kanal)
peer_info.peer_addr -> MAC-Adresse des Kom­mu­nika­tion­spart­ners
peer_info.encrypt -> Nachricht ver­schlüs­seln (true/false)
Rück­gabe­w­ert bei Erfolg: ESP_OK
esp_now_send();Nachricht sendenPara­me­ter:
MAC-Adresse
Nachricht
Größe der Nachricht
esp_now_register_send_cb(FunktionsName);definiert eine Funk­tion, die über­prüft, ob eine Nachricht erfol­gre­ich gesendet wurdeRück­gabe­w­ert bei Erfolg: ESP_NOW_SEND_SUCCESS
esp_now_register_recv_cb(FunktionsName);definiert eine Funk­tion, die über­prüft, ob eine Nachricht erfol­gre­ich emp­fan­gen wurde
wertet den Inhalt der Nachricht aus
Para­me­ter:
MAC-Adresse
Nachricht
Größe der Nachricht

Textnachricht senden und empfangen

Sender

In einem ersten Schritt soll eine kurze Textnachricht von einem ESP32 an einen anderen ESP32 gesendet wer­den. Der Text enthält eine zufäl­lig erzeugte Zahl.

  • Es müssen keine zusät­zlichen Bib­lio­theken instal­liert wer­den, es wer­den die “Bor­d­mit­tel” ver­wen­det.
  • Die MAC-Adresse des Empfängers muss dem Sender bekan­nt gemacht wer­den.
  • Die Vari­able Emp­faen­ger­In­fo vom Typ esp_now_peer_info_t enthält die benötigten Infor­ma­tio­nen über den Empfänger:
    peer_address -> MAC-Adresse
    chan­nel -> Kanal der Verbindung (0–13) Stan­dard ist 0
    Wenn der Kanal nicht kor­rekt ist, wird beim Senden eine Fehler­mel­dung aus­gegeben:
    Peer chan­nel is not equal to the home chan­nel, send fail!
    encrypt = false -> keine Ver­schlüs­selung
  • Die Call­Back-Funk­tion esp_now_register_send_cb über­prüft, ob die Nachricht gesendet wurde.
  • esp_now_add_peer fügt die Adresse des Empfängers hinzu.
  • esp_now_send sendet die Nachricht und über­prüft gle­ichzeit­ig mit esp_err_t, ob das Senden erfol­gre­ich war. Der Funk­tion wer­den die Adresse des Empfängers, die Dat­en und die Länge der Dat­en übergeben.

Empfänger

Auf der Seite des Empfängers wird im set­up-Teil eine Call­Back-Funk­tion Daten­Emp­fan­gen definiert: sie wertet die emp­fan­genen Dat­en aus.

Daten an zwei Empfänger senden

Ein ESP32 sendet Mess­dat­en an zwei Empfänger. Ein DHT20 liefert die Dat­en, sie wer­den auf einem OLED und einem LCD angezeigt.

Sender

  • Die MAC-Adressen der Empfänger wer­den in einem ⇒Array definiert.
  • Die Mess­dat­en wer­den in ein­er ⇒Struk­tur abgelegt.
  • Die Vari­able Emp­faen­ger­In­fo vom Typ esp_now_peer_info_t enthält die benötigten Infor­ma­tio­nen über den Empfänger. Sie wird in ein­er for-Schleife den jew­eili­gen Empfängern zugewiesen.
  • Die Mess­dat­en des DHT wer­den den Ele­menten des Arrays zuge­ord­net:
    0 -> erster Empfänger, 1 -> zweit­er Empfänger
    Daten[0].Temperatur = dht.getTemperature();
    Daten[0].Luftfeuchtigkeit = dht.getHumidity();
    Daten[1].Temperatur = dht.getTemperature();
    Daten[1].Luftfeuchtigkeit = dht.getHumidity();
  • esp_now_send sendet die Dat­en in ein­er for-Schleife an die Empfänger.

Benötigte Bib­lio­theken

Empfänger mit LCD

  • Die Def­i­n­i­tion der struct Daten_Struktur muss beim Sender und den Empfängern übere­in­stim­men.
  • Die Reg­istrierung der Funk­tion Daten­Emp­fan­gen über die Call­Back-Funk­tion esp_now_register_recv_cb sorgt für die Darstel­lung der Dat­en..

Empfänger mit OLED

Daten von zwei Sendern an Empfänger übermitteln

Zwei Sender wer­den jew­eils mit einem BME280 bestückt, sie liefern die gemesse­nen Dat­en an einen Empfänger.

Benötigte Bib­lio­thek

Sender 0

  • Die struct Daten_Struktur bein­hal­tet die ID des Senders als int und Tem­per­atur, Luft­feuchtigkeit und Luft­druck als float.
  • Im loop-Teil wer­den die ID des Senders und die Mess­werte der Daten­struk­tur (Nachricht) zuge­ord­net.

Sender 1

Empfänger

  • Der Daten­struk­tur wer­den drei Beze­ich­nun­gen zuge­ord­net (Sender, Sender1, Sender2).
  • Das Array AnzahlCon­troller enthält als Ele­mente die bei­den Sender.
  • die emp­fan­genen Dat­en müssen den jew­eili­gen Sendern 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 Senders abge­fragt und die Mess­dat­en im Seriellen Mon­i­tor und auf dem LCD dargestellt.

Quellen


Let­zte Aktu­al­isierung: Dez. 1, 2025 @ 22:08

Inhalt