Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe...
|
30.12.2020, 21:35
(Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2020 22:09 von Arduino4Fun.)
Beitrag #1
|
|||
|
|||
Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe...
Ich möchte zu meinen Erfahrungen zum ESP32 mit WLAN/MQTT berichten.
Ich habe seit einiger Zeit Applikationen mit 8266 und WLAN/MQTT am Laufen. Diese basieren weitestgehend auf dem Beispiel von PubSubClient und laufen seit einiger Zeit ziemlich stabil. Die Verwendung eines ESP32 mit dieser SW hatte immer wieder Probleme bereitet. Nachdem ich nun für eine WLAN/MQTT Applikation mit mehreren PWM Kanälen, sowie mehreren AD-Kanälen (Erfahrung dazu im eigenen Thread) benötige, war der ESP32 die erste Wahl. Im speziellen ein verfügbarer Lolin32. Die Beobachtung zeigt, dass der ESP32 immer mal wieder WLAN oder MQTT Synchronisation verliert und z.B. Reconnect erneut durchführt. Im Demo blockiert hier ein delay(5000) den Rest der Anwendung. Andere Anwendungen im Internet starten den Rechner bei verlorener Synchronisation des WLAN oder MQTT über ESP.restart() neu. Da beides für mich keine Option waren, habe ich WLAN/MQTT in eine Klasse gepackt und synchronisiere bei Verlust WLAN und/oder MQTT blockadefrei, so dass die restliche Applikation ungestört weiterläuft bzw. Zugriff per OTA jederzeit möglich ist. Doch leider läuft die SW ebenfalls nicht auf dem ESP32 stabil. Der ESP32 bleibt ab und zu (nach Minuten oder auch erst Stunden) „hängen“, so dass ich anschließend den internen Watchdog aktiviert habe, welcher auch immer wieder zuschlägt. Zwischendurch schmiert der Rechner aber auch mal mit „Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled“ ab. Die Suche nach der Ursache stellt sich als nicht so einfach dar. Erste Vermutung war der gemischte Einsatz bei der String-Verarbeitung von „char“ und „String“. (hier erfolgt immer der Hinweis von Tommy) Nach Umbau zu konsequenter Nutzung von „char“ jedoch keine deutliche Verbesserung. Aus Verzweiflung kam mir dann die Idee, die „neue“ Klasse mal mit einem 8266 zu testen (Wemos D1 mini). Dann die erstaunliche Erkenntnis: SW läuft komplett ohne Ausstiege robust. Der nun offensichtlichste Unterschied zwischen ESP32 und 8266 sind die Anzahl Core – Double und Single Core. Auf dem ESP32 läuft die Arduino Applikation in Core 0, die Systemfunktionen inkl. WLAN in Core 0. Nun kam mir eine Vermutung, dass es evtl. konkurrierende Zugriffe beim ESP32 zwischen Arduino-Applikation und System im speziellen WLAN Zugriff kommen kann (loop() in Core 1 und System in Core 2). Nun ein weiterer Ansatz für meine SW: Einführung/Einsatz „FreeRTOS“: Ich habe nun in der Arduino-Applikation den Aufruf der Klasse „WLAN/MQTT“ komplett in den Core 0 verschoben und der Rest der Applikation läuft in der Arduino loop(), bei mit im Test-System Anzeige über I2C LCD Display. Austausch der Daten zwischen der Task Core 0, sprich „MQTT“ liefert Daten und „Arduino-loop“ zeigt im Display an erfolgt über nicht speziell geschützte globale Variable -> Hier ist sicher noch eine Absicherung bzw. Schutz gegen „zeitgleichen“ Zugriff notwendig Ich bin mir noch gar nicht sicher, ob ich die tatsächliche Ursache gefunden habe – oder ob es weitere Unsauberkeiten oder „bugs“ in meinem Code gibt. Evtl. bin ich ja auf dem Holzweg. Aber aktueller Stand mit einem Demo-Aufbau zeigt folgenden Status (jeweils 2..3 Stunden getestet, LOG über Serial) 1. Zielsystem: ESP32 mit Arduino SW, WLAN+MQTT in Klasse ESP32 mit SW läuft komplett in Arduino-loop (Core 1) und System (Core 0) -> Immer wieder Ausstiege nach Minuten bis Stunden mit WDT oder Guru 2. Zielsystem: 8266 mit Arduino SW, WLAN+MQTT in Klasse Identische SW wie (1.) mit 8266 -> läuft stabil ohne Ausstieg 3. Zielsystem: ESP32 mit „RTOS“+Arduino SW, WLAN+MQTT in Klasse auf Core 0 Verlagerung der „WLAN/MQTT“ Funktion in Core 0 zeigt keine Ausstiege. Ich werde bei neuen Erkenntnissen weiter berichten. Für Tips, Hinweise oder Korrekturen bin ich ebenfalls dankbar. Ziel ist eine stabile, blockadefreie WLAN/MQTT Applikation mit ESP32 und Nutzung der entsprechenden Peripherie. Ergänzung: Ich habe nun eine bestehende Applikation analog (3.) portiert. Bis jetzt keine Auffälligkeit seit ca. 30min. Weitere Anmerkung. Beim Einlesen eines DS18B20 im 1 sek Zyklus und setWaitForConversion( false ); … hatte ich auch sporadisch das Ergebnis -127. Scheint ebenfalls weg zu sein. Mal sehen wie es weiter läuft… Gruß Arduino4Fun |
|||
30.12.2020, 22:05
Beitrag #2
|
|||
|
|||
RE: Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe...
(30.12.2020 21:35)Arduino4Fun schrieb: 2. Zielsystem: ESP32 mit Arduino SW, WLAN+MQTT in KlasseDa ist ein Widerspruch zwischen Überschrift und Inhalt ![]() Ansonsten danke für die Analyse. Ich bleibe beim ESP8266. Ich habe den Eindruck, die bekommen beim ESP32 das 2-Kerne-System nicht gebacken. Gruß Tommy "Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt) |
|||
30.12.2020, 22:10
(Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2020 22:14 von Arduino4Fun.)
Beitrag #3
|
|||
|
|||
RE: Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe...
Hi Tommy,
danke für den Hinweis, war natürlich mit 8266 (Wemos D1 mini) Beim 8266 "gefällt" mir die Peripherie nicht - ADC ... (Anzahl+Bereich), Verhalten der Posts beim StartUp etc. Für vieles recht dieser auch bei mir. Der ESP32 hat da schon einiges zu bieten. Wenn die Verlagerung der WLAN/MQTT Funktionalität in Core 0 die notwendige Stabilität bringt wäre das für mich o.k. Portiere gerade zwei weitere Applikationen. Gruß Arduino4Fun |
|||
30.12.2020, 22:22
Beitrag #4
|
|||
|
|||
RE: Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe...
Schöne Aufstellung, die Du da gemacht hast!
Ich habe ähnliche (nicht so detaillierte) Erfahrungen mit dem ESP32 in Verbindung mit WLAN/MQTT: Mal keine MQTT-Daten mehr, lässt sich aber noch anpingen, mal komplett weg. Jetzt ne Frage in die Runde: Hat schonmal jemand Stabilitätsprobleme beim ESP32 ohne WLAN-Betrieb festgestellt? Sonst wäre ja evtl eine stabile Lösung, dass man das WLAN im ESP32 nicht nutzt, sondern stattdessen einen 8266, der die Kommunikation übernimmt? Grüße Jan |
|||
30.12.2020, 22:32
(Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2020 22:34 von Arduino4Fun.)
Beitrag #5
|
|||
|
|||
RE: Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe...
Hallo Jan,
ich bin da nicht so pessimistisch. Meine nun "WLAN/MQTT nach Core 0" portierte Applikation nutzt regen MQTT Datenverkehr mit einem iOBroker und hat von anderen Teilnehmern Daten abonniert. Sie läuft jetzt seit ca. 90 min ohne jede Auffälligkeit. Lücken im Datenstrom sowie Disconnect WLAN oder MQTT logge ich mit. Die Pflege eine zwei Rechner System ist aus meiner Sicht fehlerbehaftet und mühsam. Habe ein „Kombi“-System am Laufen – 8266+Mirco Pro, da ich bei dem einen die Maus/Keyboard Emulation und beim anderen WLAN/MQTT benötige, gekoppelt über I2C. All in one im ESP32 hätte da schon Vorteile Gruß Arduino4Fun |
|||
31.12.2020, 14:17
(Dieser Beitrag wurde zuletzt bearbeitet: 31.12.2020 14:19 von Arduino4Fun.)
Beitrag #6
|
|||
|
|||
RE: Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe...
Hallo,
anbei mein WLAN/MQTT Test Code für ESP32 zur Diskussion - bisher keine Auffälligkeiten. Verwende kein Delay, Synchronisierung von WLAN und MQTT bei Bedarf. Der eigentliche Applikations-Code läuft im Ziel nur in den "Loop_Taskxxx" Routinen. Weiterhin sind die Sende/Empfangsbotschaften in den MQTT Routinen anzupassen. Serial.print im loop() und Core_x sollte im Ziel nicht drin bleiben. Bin auf Rückmeldung gespannt Gruß Arduino4Fun Code: // ----------------------------------------- |
|||
31.12.2020, 17:59
Beitrag #7
|
|||
|
|||
RE: Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe...
Hallo,
habe jetzt das Testprogramm, siehe oben ca. 4,5 Stunden fehlerfrei am laufen. Ohne Verschiebung des WLAN/MQTT Anteil in Core 0 blieb der Rechner nach ca. 5 min erstmalig hängen. Meine beiden "portierten" Applikationen laufen nun auch komplett stabil. Scheint tatsächlich ein Problem der verteilten SW auf den Cores zu sein - Fokus WLAN. Gruß Arduino4Fun |
|||
31.12.2020, 22:34
Beitrag #8
|
|||
|
|||
RE: Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe...
(31.12.2020 14:17)Arduino4Fun schrieb: Hallo, Moin und Danke, ich wollte schon fragen, ob Du das mal zur Verfügung stellen könntest ![]() Ich werde das mal durchsehen, versuchen zu verstehen und dann mal meine Wetterstation auf Basis dieses Ansatzes aufbauen. Ich melde mich dann mit Ergebnissen. Hab ich das jetzt richtig verstanden, dass der Trick an der Sache darin besteht, einen der beiden Kerne gar nicht zu nutzen? Zitat:...die unabhängig voneinander z.T. auf unterschiedlichen CPU’s laufen, sich dennoch aber eine Ressource (den COM Port des ESP‘s) teilen. Da grundsätzlich die Tasks nichts voneinander „wissen“ und somit auch nicht, wann eine Ressource von einem anderen Task belegt oder verändert wird., kann es hier zu Kollisionen kommen... Grüße und gleich einen guten Rutsch! Jan |
|||
|
|
Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste