Hallo,
ich bitte um Hilfe zu ESP now :
Ich habe eine funktionierende Verbindung mit ESP now mit 2 Transmittern und einem Receiver aufgebaut. Nun möchte ich im Receiver erkennen ob ein T sich abgehängt hat. Ein Lifebit im struct der Daten nützt nichts da das ( nenne es mal so ) Empfangspuffer den letzten Wert einfriert. Die Funktion peer exist ist statisch.
Ich komme da nicht weiter - hat jemand bitte eine Idee ?
Weiterhin habe ich ein grundsätzliches Problem das die Abfrage und die Ausgaben sich alle im void setup befinden - es dürfte somit nur einmal aufgerufen werden??.
setup() wird einmalig nach Reset abgearbeitet. loop() ist die Hauptschleife und wird ständig wiederholt durchlaufen.
Bei ESP kann ich dir nicht helfen, aber damit dir jemand überhaupt helfen kann wäre dein Sketch von Vorteil. Wenn zu groß als Dateianhang, ansonsten in Code Tags einbetten. Siehe hier wo du schreibst im Editor Menü der Code Tags Button.
Merk dir die Zeit, wenn du ein Paket empfängst (für jeden Transmitter einzeln).
Wenn der letzte Empfang zu lange her ist, hast du die Verbindung verloren.
ist das der komplette Sketch?
Weil die loop() fehlt. Ist die leer? Leere loop() sollte man nicht weglassen, denke ich.
Das Verhalten eines ESP kenne ich nicht.
Füge einmal nach Serial.begin() ein Serial.println("ESP Reset");
hinzu. Nicht das er sich ständig resetet. Könnte ja sein.
Hallo,
wenn Du schon ein lifebit nutzen willst dann eventuell so: Der Sender muss das Bit toggeln bei jeden senden. Der Empfänger überprüft ob sich das empfangene Bit in einer gewissen Zeit geändert hat. Wenn nicht ist die Verbindung weg.
@Rentner war schneller
Ich hätte auch togglen vorgeschlagen. Wird oft auch in industriesteuerungen so gemacht mit identischem anwendungsfall um z.b. zu überwachen ob ein peripherie modul "eingefroren" bzw abgehängt ist. Wenn sich der zustand vom lifebit nicht x sekunden geändert hat => alarm etc.
Lifebit Abfragen sind Standard in der SPS Welt wo ich herkomme, danke.
Es wird in keiner Beschreibung der ESP now Funktion auf eine Abfrage der Transmitter eingegangen was ich als sehr wichtig ertrachte. Beim Abhängen frieren ja auch die Daten ein.
Und bitte an die Spezialisten : wie wird die zyklische Abfrage im setup realisiert bei nur dem einen Durchlauf nach Reset ?
Damit gibst Du die function an die dann aufgerufen wird wenn was vom Sender angekommen ist. In der Function kannst Du dann die Auswertung des Lifebits oder der Zeit machen. Die Funktion selbst wird vom ESP dann im Hintergrund aufgerufen.
Wenn Du Dich mit Lifebits auskennst warum fragst Du dann ?
Eventuell gibt es innerhalb der ESP Now Funktionalität eine andere Möglichkeit , mit ESP Now kenne ich mich nicht so wirklich aus.
Heinz
Schicken die Transmitter regelmäßig Daten *)? Dann soll es doch ein leichtes sein sich bei eintreffen der Nachricht die millis() zu merken und im loop zu prüfen ob ein Intervall überschritten wurde.
Also eigentich genau so wie es @Whandall schon vorgeschlagen hat.
*) Wenn sie noch nicht regelmäßig senden - dann lass sie regelmäßig senden.
Das ist nur ein Missverständnis deinerseits.
Du hast im setup die callbackfunktion für den Event "recv" bekanntgegeben. Damit weis die Library im Hintergrund nun, was sie bei eintreffen einer Nachricht machen soll. Nämlich die Funktion OnDataRecv ausführen.
Langsam wird es komisch. Wenn es zyklisch sein soll musst du es in der loop() behandeln.
Das setup() nur einmal abgearbeitet wird sollte nun klar sein.
Siehe Antwort von Whandall und noiasca.
Letztlich halte ich das auch für die einfachste Lösung, da muss der Sender gar nichts machen , nur der Empfänger prüft ob Daten im richtigen Zeitraster angekommen sind. Voraussetzung ist natürlich das es ein mehr oder weniger festes Zeitraster gibt. Aber wenn nicht macht auch ein Lifebit wenig Sinn.
Erst mal vielen Dank für die Hilfe an alle.
Ich verwende leider Begriffe die vll. nicht immer in die uC Welt passen.
Mit dem setup ist es genau mein Verständnisproblem. Ich habe mich strikt an die Vorlagen Santos und Wolle gehalten, sie machen den Aufruf identisch.
Laut dem code kann ja das nur im Hintergrund laufen da ja die Funktion nur einmal aufgerufen wird.
Die Vorlagen der Transmitter benutzen in allen Vorlagen einen Zyklus mit delay.
Das ist für mich bei dieser tollen Funktion widersprüchlich und ich hatte gehofft das mir da jemand auf die Sprünge helfen kann.
Es gab ja schon Denkanstöße die immer hilfreich sind.
noiasca hatte den richtigen Ansatz, habe es aber leider überlesen.
Hatte noch einen Beitrag gefunden der etwas darauf eingeht : mit dem Aufruf im setup wird wohl
sie Funktion durch die ESP now Funktion mit Daten gefüttert.
Ich werde mal probieren den Parameter über die Abfrage der peers mit Leben zu füllen.
Nochmal danke an alle, wenn aber jemand etwas weiss bitte übermitteln
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len)
wird als sogenannte CALLBACK-function registriert.
// Once ESPNow is successfully Init, we will register for recv CB to
// Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info
esp_now_register_recv_cb(OnDataRecv);
Die Registrierung der callback-function muss nur einmal im setup-gemacht werden
call-back bedeutet:
jedesmal wenn Daten empfangen werden wird die CALLBACK-function aufgerufen.
ESP-NOW ist ein ziemlich großes Programmpaket was da im Hintergrund läuft.
Der Empfang von WiFi-Daten ist ziemlich komplex. Das bekommt man mit pollendem Abfragen in loop() wahrscheinlich gar nicht hin.
Mit dem registrieren der CALLBACK-function machst du als Programmierer
Hallo ESP-NOW-Funktionen immer dann wenn Daten empfangen wurden dann rufe
OnDataRecv() auf.
Das kannst du dir so ähnlich vorstellen wie
du baust dir einen Sensor und eine Kamera in deinen Briefkasten ein.
Aus dem dass der Sensor und die Kamera im Briefkasten eingebaut sind (=Registrierung der call-back-function)
hast du noch keine Daten.
Daten gibt es erst dann wenn der Sensor das Einwerfen (=Datenpaket empfangen) eines Briefes in den Briefkasten detektiert
und darauf hin die Kamera einschaltet und die Kamera ein Bild vom eingeworfenen Brief überträgt.
Das entspricht dem Aufrufen der callback-function.
Einmal Sensor und Kamera einbauen (= callback-function registrieren)
tausende mal ein Bild gesendet bekommen (= callback-function ausführen)