EPS32 mit ESP-Now (Senden und Empfangen mit 11 ESP32)

Hallo zusammen,
ich kenne mich leider kaum mit ESP-Now aus und schaffe es nicht die Beispielcodes für mein Project anzupassen.

Mein Project (Nerf-Zielscheiben):

Eine App aktiviert zufällige Ziele (LED an), werden diese getroffen (Piezo), soll das an die App gemeldet werden. Die Zeit wird gestoppt und fehl Treffer geben Strafzeit. Die App ist mit dem App Inventor geschrieben und so gut wie fertig.

Umsetzung:
Mein Smartphone schickt Daten per bluetooth an ein ESP32 (Master) und dieser soll sie per ESP-now an zehn weitere ESP32 (Slaves) schicken. Die zehn Slaves schicken, nach einem Knopfdruck, einen Sensorwert zurück.

https://www.bilder-upload.eu/bild-ec0e04-1591519188.jpg.html

Am liebsten hätte ich die zehn ESP-32, ohne Master, direkt mit dem Smartphone verbunden, aber ich kann nicht 10 EPS32s per BT damit verbinden und über eine HTML Steuerung verliere ich zu viel Zeit.
Alles soll ohne Router funktionieren, damit man auch draußen spielen kann.

Ich habe breits viele Videos geschaut (meistens sind da nur 2 ESP32 miteinander verbunden) und auch viel gelesen. Es scheitert aber schon daran, dass ich nicht wies ob welchen Beispiel Code ich auf welchen ESP32 laden muss. Oder ob ich die Daten per Broadcast schicke oder direkt per MAC Adresse.

Ich brauche eine Starthilfe, am besten mit einem Beispielcode und der Angabe auf welchen ESP32 ich ihn aufspielen soll. Das anpassen bekomme ich wahrscheinlich selbst hin,

Kann mir bitte jemand helfen, wie ich eine ESP-Now Verbindung richtig aufbaue, um schnell Daten auszutauschen?

Vielen Dank

Grüße Sebastian

Hi

Was interpretierst Du jetzt als "schnell"?
Selber kenne ich mich mit den ESP noch nicht aus - zwar vorhanden, aber noch unbespielt.
Wenn Die ähnlich 'ticken' wie die normalen Arduino und Du Deinen Sketch nicht nur mit delay() aufgebaut hast, bekommt der ESP eher einen Drehwurm vom arbeitslos im Kreis durch den Sketch rennen, als daß Du zeitliche Probleme bekommst.

Dürfen die Slaves selbstständig das Senden beginnen? Würde die Sache vereinfachen.

Handy schickt dem Master den Auftrag, x Ziele binnen y Sekunden auszulösen.
Der Master sendet eine Synchronisations-Information 'Jetzt ist Zeit Null' - diese Zeit merken sich die Slaves als gemeinsame Basis.
Nun würfelt der Master ein (oder mehrere) Ziele aus und schickt diese Information raus - die Slaves, Die gemeint sind, nehmen Sich Derer an, stellen die Ziele hoch und warten (ohne delay() ) auf einen Treffer oder die Dead-Time (Ziele ungetroffen wieder runter).
Diese Information (Treffer nach x/kein Treffer) senden Sie an den Master.

Der Master kann mit den Informationen nun Dein Handy beglücken - auch schon während die Aufgabe noch läuft.

MfG

Vielen Dank für deine Antwort!
ESP32 sind sehr ähnlich zu den Arduinos.
Die Slaves senden sobald Sie getroffen werden (egal ob sie aktiv waren oder nicht). Dadurch können fehl Treffer erfasst werden.

Die gestoppte Zeit soll auf 0,1 Sekunden genau sein.

Mein Problem ist, dass ich die Zeit in der App stoppe. Die Zeit startet und dann wird das Programm verschickt.
Ich hatte es mit Painless Mesh probiert, aber da wird nur jede Sekunde geprüft ob eine Nachricht empfangen wurde. Im schlechtesten Fall verliere ich 1 Sekunde beim Senden und eine weitere beim Empfangen.

Ich habe zwei Spielmodi:

Parallel: Es wird gestartet und es werden mehrere Ziele parallel aufgestellt und alle aktiven sind zu treffen
Reihe: Es wird nur ein Ziel aufgestellt. Wird es getroffen, wird das nächste Aufgestellt.

Beim Reihenfolgenmodus würden dann auch immer bis zu 2 Sekunden vergehen bis das nächste Ziel aufgestellt wird. Bei 10 Zielen wäre die Verzögerung dann 0-20 Sekunden.

Wie würdest du die Verbindungen zwischen den ESP32 aufbauen (sollte Kabellos sein)?

Dass der Master oder sogar die Slaves die Zeit stoppen, wäre auf jeden Fall genauer. Ich würde am liebsten alles über die App machen. Kriege ich das nicht gut hin, werde ich es aber so machen, wie du geschrieben hast. DANKE

Grüße Sebastian

Hi

Da die App wohl nur 'alle Jubeljahre' Mal nach dem Rechten sieht, würde ich die Zeiten vom Master erfassen lassen.
Die Stoppuhr auf dem Handy-Display kann ja trotzdem als Augenwischerei weiter laufen - die richtige Zeit und die Anzahl der Treffer/Fehltreffer bekommt die App ja vom Master zugeschickt und kann Das dann in schönem Outfit zur Anzeige bringen.

Die ganze Ablaufsteuerung würde ich dem Master in die Hand geben - Dieser horcht halt auch auf's Handy, wenn Das STOPP befiehlt, wird halt Alles gestoppt - sonst wird der Ablauf fein säuberlich durchgezogen - OHNE Wartezeit zwischen gefallenen Zielen (sofern Diese ohne Wartezeit aufgestellt werden sollen - auch Das ist ja durchaus eine Überlegung wert).
Auch hast Du so die Zeit seit Aufstellen des Ziel bis zum Treffer - und nicht 'Zeit seit grünem Knopf auf Handy'.

Per BT zum Handy - ist ja nur Datenaustausch ohne große Anforderung an die einzuhaltende Zeit.
Untereinander etwas, wo Alle gleichzeitig mitspielen können - kann der ESP32 WLAN von Haus aus?
Mit meinen Arduinos wäre mein Weg wohl nrf24L01, Da reichen 'die ganz Billigen', da auch keine Reichweite überbrückt werden muß.
Sofern die Synchronisierung halbwegs gleichzeitig durchgeführt werden kann, spielt spätere Latenz auch keine Rolle mehr - Jeder hat die Uhrzeit und kann über die vergangenen Ereignisse berichten - auf mehrere Stellen hinterm Komma genau.

Was gibt's an Beispielen zur Kommunikation mehrere ESP32 untereinander?
Das wäre mein Ansatzpunkt, den Master mit den Slaves aufzubauen - eines der Ziele kann ja der Master selber übernehmen - ggf. kann man die verwendeten ESP32 auch 'auswürfeln' lassen, Wer nun der Master ist - damit man nicht immer darauf achten muß, den Master auf jeden Fall aufzustellen.
(bei einer nrf24L01 Spielerei nehmen die Teilnehmer die ID Null an und prüfen, ob 'auf der Null schon Jemand sendet' - wenn Ja, sucht sich der Jüngere eine neue ID, dieses Siel beginnt von Neuem.)
Diese Abhandlung passiert in der ersten Sekunde nach Anschalten - also beim Einschalten des ersten Ziel steht der Master quasi fest, die danach aktivierten Ziele reihen sich ein (oder per Zufall, wie bei mir).

MfG

ESP now nutzt die gleiche Technologie wie WiFi - da ist per se nichts schneller oder langsamer.
Du hast die gleichen Limits (10 Verbindungen) wie bei Wifi.

Wenn es dir um eine möglichst exakte Treffer Zeit geht, dann würde ich die einzelnen ESP's mittels NTP die Zeit syncen lassen dann kann ja jeder ESP seinen Zeitstempel mitschicken. Egal in welcher Reihenfolge die Messages einlangen - du weist wann der eigentiche Treffer vor Ort geschehen ist.

Die ESP32 können BT und Wifi von Haus aus.

Vielen Dank für die Tipps zum besseren erfassen bei der Zeit. Ich werde versuchen sie umzusetzen.

Mein anderes Problem besteht darin eine Wifi Verbindung (am liebsten per ESP-Now) aufzubauen.

Das ist super schnell und alle Geräte können Senden und Empfangen. Bei mir scheitert es aber an der Umsetzung.

Hier wird beschrieben wie man es mit zwei ESP32 macht, aber ich habe keine Ahnung wie ich das auf 11 ausweiten soll.

Vielleicht hat ja jemand schon mal ESP-Now mit mehr als 2 ESP32 und tow-way-comunication gemacht und kann mir helfen?

Grüße Sebastian

Auf ESP32 auf denen ESP-NOW-Nachrichten empfangen werden sollen darf man KEIN delay() verwenden.
Während des Befehls delay() wird die gesamte Rechenleistung des ESP zum delayen verbraten. Sprich es bleibt keine Rechenzeit um ESP-NOW-Nachrichten zu empfangen.

Da der Empfänger nicht weiß wann eine ESP-NOW-Message hereingeschneit kommt muss er immer bereit sein.
Deshalb kein delay().

Ich habe ESP-NOW bisher nur zum laufen bekommen wenn ich WiFi.disconnect() ausgeführt habe.
Wenn ein ESP einmal mit einem WLAN verbunden war dann MUSSTE ich WiFi.disconnect() vorher lief ESP-NOW nicht.

Im ESP-NOW-Sendebefehl muss man die MAC-Adresse des Empfängers angeben.
Was ich noch nicht ausprobiert habe ist broad-casting. Wenn mehrere Sender quasi gleichzeitig senden und das aber zu Problemen führen würde könnte man das so lösen:

Von einem NTP-Server die Zeit holen. Dann WiFi-Verbindung wieder beenden mit WiFi.disconnect().
in der RTZ läuft die Zeit weiter wird halt nur nicht mehr mit dem NTP synchronisiert.

Die ESPs merken sich die Zeit wann sie getroffen wurden und man fragt der Reihe nach per polling alle ESPs ab.
Das bedeutet die Zielscheiben ESPs warten auf eine Anfrage vom "Master" und wenn Anfrage eingetroffen ist senden Sie die Zeitdaten.
Dadurch kann der ESP der die Daten einsammelt steuern wann welcher sendet.
Der Nachrichtenversand per ESP-NOW geht wirklich schnell. Ich hatte mal den nonblocking-delay per millis() auf einem sendendnen ESP auf 50 Millisekunden stehen. Das hat den seriellen Monitor auf dem Empfänger-ESP zugeballert. Alle ESP-NOW mesagges kamen praktisch ohne Verzögerung ab.

viele Grüße

Stefan

Hi Stefan,
das hilft auf jeden fall weiter.

Weist du wie ich eine Nachricht per ESP-Now an mehrere MAC-Adressen schicken kann? Liste?
Für Broadcast und an eine einzelne MAC-Adresse habe ich Beispiele gefunden, nur nicht für mehrere MAC-Adressen.
Das hätte den Vorteil dass ich ein Callback bekommen, den ich beim Boradcast nicht erhalte.

Soweit ich weis, haben die ESP32 ein Clockmodul eingebaut und ich kann mir einfach die Dauer schicken lassen und verzichte auf den Zeit Sync am Anfang.

@Stefan könntest du mir bitte deinen Code schicken, damit ich den mal ausprobieren kann?
Grüße Sebastian

Hi guntweety,

also den ganzen code da musste dann fünf libraries wieder herausoperieren

Wie schon im posting oben geschrieben. Im Send-Befehl wird die Mac-Adresse des Empfängers angegeben.
alle MAC-adressen als peer eintragen

  uint8_t ESP_NOW_MAC_adrOfRecv[] = {0x18, 0xFE, 0x34, 0xCE, 0xD2, 0xBB};
  memcpy(peerInfo.peer_addr, ESP_NOW_MAC_adrOfRecv, 6); //xxy
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;
         
  if (esp_now_add_peer(&peerInfo) != ESP_OK)
  {
    Serial.println("Failed to add peer");
    return;
  }
}

und das machste dann für jede MACadresse

Zum senden

  esp_err_t result = esp_now_send(ESP_NOW_MAC_adrOfRecv, (uint8_t *) &ESP_Data_ToSend, sizeof(ESP_Data_ToSend));

Die Variable "ESP_NOW_MAC_adrOfRecv" enthält die MAC-Adresse vom Empfänger
wie der selbsterklärende Name schon sagt.
(Dieses dämliche Geschwafel von master und slave ist eine völlig mißlungene Art Sender und Empfänger zu unterscheiden)

Du hast einen send-Befehl in deinem code. Und in diesem Send-Befehl ist als erster Parameter die Mac-Adresse des Empfängers
Um eine Nachricht an mehrere ESPs zu verschicken machst du einen eigenen send-befehl an jeden Empfänger

esp_err_t result = esp_now_send(ESP_NOW_MAC_adrOfRecv1, (uint8_t *) &ESP_Data_ToSend, sizeof(ESP_Data_ToSend));
PrintESP_Status(result);
esp_err_t result = esp_now_send(ESP_NOW_MAC_adrOfRecv2, (uint8_t *) &ESP_Data_ToSend, sizeof(ESP_Data_ToSend));
PrintESP_Status(result);

esp_err_t result = esp_now_send(ESP_NOW_MAC_adrOfRecv3, (uint8_t *) &ESP_Data_ToSend, sizeof(ESP_Data_ToSend));
PrintESP_Status(result);

genauso wie du an Tante Herta aus München, Onkel Otto aus Hamburg und Cousine Genovefa je eine eigene Einladung zur Einweihungsfeier deines fertig gestellten Arduino-Projekts versendest ;-)))

Vielen Dank. Das ist genau das was ich gebraucht habe.

Wenn ich den oberen Block wiederhole wird zusätzlich zur MAC-Adresse auch

ESP_NOW_MAC_adrOfRecv1
zu
ESP_NOW_MAC_adrOfRecv2 angepasst oder?

Danke noch mal an euch beide für eure Hilfe!

Grüße Sebastian

postmaster-ino:
Untereinander etwas, wo Alle gleichzeitig mitspielen können - kann der ESP32 WLAN von Haus aus?

Ja, kann er, sogar als Access Point.

Nur für den Fall, Du solltest es nicht wissen: ESP-NOW ist ein Kommunikationsprotokoll, siehe beispielsweise ESP-NOW Two-Way Communication Between ESP32 Boards. Für ein anderes Thema hatte ich angefangen, zu lesen. Aber leider ist das Thema im Sande verlaufen, ebenso wie in der Folge meine praktischen Tests, weshalb ich in diesem Thema leider nichts beitragen kann.