Ich dachte immer mein Programm stürzt nach einigen Stunden ab.
Aber nach etlichen Versuchen musste ich feststellen: Der ESP verliert die Internetverbindung und verbindet sich nicht neu.
Starte ich nur meinen Router neu funktioniert wieder alles.
Hat jemand einen Tip für mich? Was mache ich falsch?
...
void loop()
{
//Anzeige der Zeit am seriellen Monitor
//digitalClockDisplay();
Alarm.delay(1000); // wait one second between clock display
//Prozess um Tastenimpuls auszugeben - Aufruf mit trigger();
if (triggered && (millis() - previousMillis > 100))
{
digitalWrite(Ausgangsnummer, LOW);
triggered = false;
}
if (hour()<WLANaus && hour()>=WLANan) //kein WLAN zwischen 23-6°°
{
// check if WLAN is connected
if (WiFi.status() != WL_CONNECTED)
{
WiFiStart(); //Wenn keine Verbindung zum Router dann Unterprogramm aufrufen
}
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return; //Wenn kein Client da gehe zurück zum Anfang loop()
}
// Wait until the client sends some data
Serial.println("new client");
unsigned long ultimeout = millis()+250;
while(!client.available() && (millis()<ultimeout) )
{
delay(1);
}
if(millis()>ultimeout)
{
Serial.println("client connection time-out!");
return;
}
// Read the first line of the request
req1 = client.readStringUntil('\r');
Serial.println(req1);
client.flush();
req2 = req1;
req3 = req1;
//192.168.100.56/DATA/18:00/00:15/4
//192.168.100.56/RESP/18:00/00:15/4
if (req1.substring(5, 9)== ("DATA")) {
WiFiDatenEmpfangen();
DatenResponse(); //Unterprogramm um interne Daten per HTML zu senden. Aufruf mit 192.168.100.54/RESP/
client.print(resp); // Send the response to the client
}
//GET /RESP?Startstunde=19&Startminute=20&Dauer=1&Umlauf=4 HTTP/1.1
//GET /RESP?WiFiStartzeit=6&WiFiAusschaltzeit=22 HTTP/1.1
q = 0;
if (req1.substring(5, 9)== ("RESP")) { //ohne RESP an dieser Stelle erfolgt keine Reaktion
Serial.println(req1.substring(9, 22));
if (req1.substring(9, 10)== ("/")) { //falls nach RESP ein / steht muss ein Zeichen + gelesen werden
q = 1;
}
if (req1.substring((9+q), (22+q))== ("?Startstunde=")) { //Startzeiten nur einstellen wenn nach RESP auch Daten folgen
WiFiDatenEmpfangenWebseite(); //von der generierten Webseite gesendete Daten einlesen
}
Serial.println(req1.substring((9+q), (24+q)));
if (req1.substring((9+q), (24+q))== ("?WiFiStartzeit=")) { //WiFi-Startzeiten nur einstellen wenn nach RESP auch Daten folgen
WiFiAusschaltzeitenDatenEmpfangenWebseite(); //von der generierten Webseite gesendete Daten einlesen
}
DatenResponse(); //Unterprogramm um interne Daten per HTML zu senden. Aufruf mit 192.168.100.54/RESP/
client.print(resp); // Send the response to the client
}
}
else //Wenn zw. 23-6°° dann WiFi aus
{
if (WiFi.status() == WL_CONNECTED)
{
//client.disconnect();
WiFi.disconnect();
Serial.println("WiFi disconnected");
delay(1);
}
}
}
void WiFiStart() // Unterprogramm um WiFi am Router anzumelden
{
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.println(WiFi.localIP());
}
...
Ja, nur anderen Sketch geladen. An der Hardware kann es nicht liegen. Ist jetzt sogar am I2C ein LCD 16x2 Shield dran. Lasse mir dort "new client" usw anzeigen.
Der ESP stürzt bei meinem Programm nicht ab, er reagiert nur nicht mehr auf Wifi-Anfragen. Wenn ich Wifi am Router aus/einschalte geht wieder alles.
Ich werde jetzt mal testweise Stück für Stück alles andere in meinem Programm deaktivieren. Irgendetwas muss "stören".
Alles was mit Wifi & client zu tun hat ist eigentlich identisch mit dem "stabilen Webserverprogramm".
Ich kenne dein Alarm Delay nicht, aber vielleicht das Problem. ohne Gewähr
Das ist eine ESP Typische Angelegenheit.
Grundsätzlich muss mindestens alle 50 mS delay(0), yield(), aufgerufen, oder loop() durchlaufen werden, sonst versagt WiFi. Der WiFi Part braucht Rechenzeit, und die musst du ihm geben.
Ohne "Alarm.delay()" funktioniert Time.Alarm nicht mehr.
Hab jetzt mal von "Alarm.delay(1000)" auf "Alarm.delay(1)" gestellt:
Time.Alarm funktioniert wieder
Webserver scheint stabil zu laufen (der Seeehr-Langzeittest steht noch aus)
Ich glaube, die 1000 von "Alarm.delay(1000)" werden nur benötigt um nur jede Sekunde serial.print auszugeben - bräuchte ich eh nicht. Hab ja digitalClockDisplay() von Time.Alarm deaktiviert.
Fazit: Schau an, was nicht alles so stänkern kann.... So ein kleiner Scheißer wie Alarm.delay... erst mal drauf kommen... :o
Ja, das funktioniert. Danke für den Tip! Hab im loop getestet:
//Anzeige der Zeit am Display
++c;
if (c == 2000) {
digitalClockDisplay();
c = 0;
}
//digitalClockDisplay();
Alarm.delay(1); // wait one second between clock display
Ist nur recht unbestimmt, wann genau die Anzeige aktualisiert. Muss man viel "testen" um in ca. 1s Rytmus zu kommen.
Ich steh zwar immer noch mit den millis auf Kriegsfuß aber Stoni wäre ja nicht Stoni wenn ihm nicht eine "umgehende" Alternative eingefallen wäre.
Unter dem Motto: "Viele Wege führen nach Rom" & "Nutze schon vorhandene millis", habe ich mich auf die im Hintergrund eh schon laufende "second()" gestürzt und sie schamlos ausgenutzt.
Jetzt läuft meine Uhr schamlos und peinlich genau... Und das, ohne Wifi zu stören...
.
.
.
void loop()
{
//Anzeige der Zeit am Display
if (second() != lastsecond) {
digitalClockDisplay(); // UP um Zeit anzuzeigen
lastsecond = second();
}
Alarm.delay(1); // wait one second between clock display
.
.
.
void digitalClockDisplay()
{
// digital clock display of the time
display.setTextSize(1);
display.setCursor(78,0);
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.print(" ");
display.display();
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.setCursor(78,0);
display.print(hour());
printDigits(minute()); //Unterprogramm um evtl. 0 vor Minute
printDigits(second()); //Unterprogramm um evtl. 0 vor Sekunde
display.display();
}
void printDigits(int digits)
{
display.print(":");
if(digits < 10)
display.print('0');
display.print(digits);
}