[gelöst] Probleme mit dem ESP8266 (WLAN reconnect-Problem)

Guten Tag,

ich nutze einen ESP8266-basierenden WEMOS D1 mini. Ich setze diese Mikrocontroller gern und viel ein. Leider habe ich mit einer speziellen Anwedung Probleme, die ich bisher nicht gesehen habe. Nach einigen Stunden Betrieb bleibt der WEMOS stehen (fliegt aus dem WLAN, auch WLAN-unabhängige Aufgaben werden nicht mehr ausgeführt). Ich habe bereits die Hardware durchgetauscht - es sollte also ein Software-Problem sein.

Hier der Sketch: https://pastebin.com/XDLKUaUi
Hier die Infos zu valve.h GitHub - pascaltippelt/ArduValve: Arduino Library to control electromagnetic valves

Im Prinzip steuert der Sketch zeitbasierend 2 Elektromagnetische Ventile, die an 2 Digitalen IO angebunden sind. Manuelles Schalten und Zeiteinstellung gehen per Web-Interface.

Ich versuche gerade den Ausfall-Zeitpunkt abzupassen und die DEBUG-Ausgabe des ESP abzugreifen (schrierig, da ich nicht weiß, wann es passiert).

Eventuell seht ihr etwas das ich grundsätzlich falsch umgesetzt habe? Eventuell die Deklaration des Ventil-Arrays?

MyValve* ventile[VENTILANZAHL] = { new MyValve(D3) ,new MyValve(D4) };

Gruß Pascal

Ah, ich sollte noch erwähnen: Der ESP resettet nicht, er hängt richtig. Reset wäre ja noch halbwegs ok...

Eventuell die Deklaration des Ventil-Arrays?

Die scheint ok zu sein, wenn es erstmal stundenlang richtig läuft.

Im Konstruktor MyValve(int pin), der zwar sehr früh (lange vor setup() bei globalen Variablen) aufgerufen wird, kommt ein pinMode(_pin, OUTPUT); vor, was man eigentlich lieber erst später in einer init() Methode macht, aber --wie gesagt-- es läuft ja erstmal und dynamisch werden sonst keine Ventil-Objekte angelegt, soweit ich sehe.

Geht natürlich auch ohne new:

MyValve V1(D3);
MyValve V2(D4);  // are they safer here than on the heap ?
MyValve* ventile[] {&V1, &V2};

...
 for (MyValve* ventil: ventile) { // alle ventile jeweils einzeln
    if (ventil->getMode() == false)
    ...
 }
 ....

Aber mMn kein wesentlicher Unterschied

Die ESP8266 und ESP32-Module benötigen beim Senden für einen ganz kurzen Moment einen hohen Strom
Damit da die Spannung nicht einbricht kann man einen ziemlich großen Elko möglichst nahe an Vi und GBD-Pin anschließen. Ziemlich groß heißt mindestens 1000µF. Besser 2200µF ideal 3300µF.

Könntest du denn einen PC angeschlossen lassen das der über ein Terminalprogramm mitschreibt was die serielle Ausgabe sendet? Es gibt 5m lange USB-Kabel.

Du könntest auch mit ESP-NOW entsprechenden Debugoutput senden. ESP-NOW senden geht sehr schnell.
Ich habe es aber parallel mit "normalem" WLAN noch nicht getestet. Evtl. serielle Ausgabe auf ein zweiten ESP8266 und der zweite ESP8266 sendet es dann per ESP-NOW an einen Empfänger ESP8266 und der ist an einem PC angeschlossen.

Werden in dem Programm global definierte String-variablen verwendet? Die sind auch eine Quelle für unerklärliche Abstürze.

viele Grüße Stefan

Hallo,

warum fragst Du nicht den Autor des Sketches. Mal ganz ehrlich, wenn ma so viel HTML code im Sketch unterbringt .... . Versuch doch mal herauszubekommen ob es an der Ansteuerung für die Ventile liegt oder ehr an dem Webserver.

Was macht das Ding denn zwei Ventile bei Uhrzeit ein/ aus schalten ? Dann schau dich mal auf der Seite von Fips hier im Foum um der hat sicher so was ähnliches bereits.

Heinz

"Nach ein paar Stunden" ist ziemlich unklar.
Probier mal rauszufinden, wie du diese Zeit kürzer (oder zur Not auch länger) machen kannst ...

Stefans Einwand mit dem hohen Strom würde eher einen Reset (den du ja nicht hast) erklären.

Guten Abend!

warum fragst Du nicht den Autor des Sketches.

Weil ich die valve-Bibliothek und den Sketch selber geschrieben habe. Mich selbst fragen hat leider zu keinem Ergebnis geführt.

Zuerst mal muss ich mich entschuldigen. Ich habe eine falsche Annahme getroffen: Der ESP bleibt nicht hängen. Der Loop muss weiterlaufen, denn meine Ventile schaltet er noch. Aus dem WLAN fliegt er dennoch.

Die ESP8266 und ESP32-Module benötigen beim Senden für einen ganz kurzen Moment einen hohen Strom
Damit da die Spannung nicht einbricht kann man einen ziemlich großen Elko möglichst nahe an Vi und GBD-Pin anschließen. Ziemlich groß heißt mindestens 1000µF. Besser 2200µF ideal 3300µF.

Ich vermute also, dass "nur" die WLAN-Verbindung hops geht. Um ein Strom-Problem auszuschließen, werde ich einen dicken Elko anschließen. Würde mich jedoch wundern, da das Netzteil mit 5V 3A bemessen ist. Eventuell hat es Probleme mit kurzen Stromspitzen.

Ich vermute, dass ich einen Fehler in der Funktion "handleWiFi" gemacht habe.

void handleWiFi() {
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.disconnect();
    delay(100);
    WiFi.reconnect();
  }
}

Es könnte sein, dass nach einem Verlust der Verbindung dem ESP nach einem WiFi.reconnect() nicht genug Zeit gegeben wird, und es gleich wieder disconnected (da ja WiFi.status() != WL_CONNECTED noch true ist).

Ich werde mal versuchen, statt der obrigen Routine "WiFi.setAutoReconnect(true);" zu setzen. Eventuell hilft das. Sonst prüfe ich in der Routine noch auf nicht connecting (den Wortlaut müsste ich noch nachlesen...).

Ich melde mich morgen noch einmal!

Ich danke für eure ausführlichen Antworten.

Gruß

Pascal

Okay, es sieht so aus, als wäre nun alles gut. Ich habe das "aus dem WLAN fliegen" mal simuliert (WLAN aus :smiley: )und nach kurzem folgt ein reconnect. Jetzt hat der ESP auch 24h durchgehalten.

Ich behaupte mal, das Problem ist gelöst. Sprich:

void handleWiFi() {
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.disconnect();
    delay(100);
    WiFi.reconnect();
  }
}

Verhindert korrektes Wiederverbinden, besser ist, man nimmt:

WiFi.setAutoReconnect(true);

(Im Setup())

Gruß Pascal.

PS: Jetzt muss ich nur noch herausfinden, wie ich den Thread als gelöst markieren kann 8)