Hallo liebes Forum. Ich beschäftige mich jetzt seit ca 8 Wochen mit Arduino und vor allem auch dem ESP32. Dies ist mein aller erstes Projekt welches in Angriff genommen wurde. Durch vieles recherchieren und ein bisschen Gehirnschmalz und natürlich auch Copy & Paste habe ich mein Ziel erreicht Ich wollte eine Pumpe im Keller über WLAN (und auch über Taster für meine Eltern^^) für eine bestimmte Zeit (10 und 15 Minuten) an schalten. Danach soll sie von allein aus gehen. Dies habe ich über einen ESP32 und einem Relais gemacht, was mir auch gelungen ist. In dem Browser möchte ich auch gerne die Zeit angezeigt haben für 10 und 15 Minuten, damit ich ganz grob abschätzen kann wie lange die Pumpe noch an ist. Aber irgendwie funktioniert das nicht mit den boolean Variablen. Könnte mir jemand vielleicht auf die Sprünge helfen, wo mein ich meinen Fehler habe? Code, sowie ein Beispielbild, befindet sich im Anhang Danke schon einmal im voraus!! :)
:
Verschoben durch User
ich blicke zwar noch nicht vollständig durch den Code durch, fange selber gerade mit dem ESP an aber: else if (c != '\r') { // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine wo wird ein möglicher Überlauf von "currentLine" verhindert? Bestimmt kann man was nachlesen in der Doku, ich persönlich finde ja char currentLine[200]; statt String currentLine = ""; besser, da weiss ich das ich Platz für 198 Zeichen + CR und NULL habe und kann so auch Zeichen mitzählen und bei currentLine[198] auf die Notbremse treten, die /0 noch anhängen und prüfen was drin steht.
Objekte der Klasse String können wachsen, d.h. ein Überlauf tritt erst auf, wenn kein Speicher mehr verfügbar ist. Das ist auch unschön und sollte abgefangen werden, ist aber im Betrieb unproblematischer als ein Array fester Größe.
Joachim B. schrieb: > ich blicke zwar noch nicht vollständig durch den Code durch, fange > selber gerade mit dem ESP an aber: > > else if (c != '\r') { // if you got anything else but a carriage return > character, > currentLine += c; // add it to the end of the currentLine > > wo wird ein möglicher Überlauf von "currentLine" verhindert? > > Bestimmt kann man was nachlesen in der Doku, ich persönlich finde ja > > char currentLine[200]; statt String currentLine = ""; > > besser, da weiss ich das ich Platz für 198 Zeichen + CR und NULL habe > und kann so auch Zeichen mitzählen und bei currentLine[198] auf die > Notbremse treten, die /0 noch anhängen und prüfen was drin steht. Ich merke gerade, dass 8 Wochen definitiv nicht ausreichend sind, um sich damit auseinander zusetzen. Dieser von ihnen angesprochene Teil war nämlich Copy&Paste aus dem Beispiel. Im Grunde geht es mir darum: Ich bekomme ein Get /H oder Get /T, worauf ich die millis abspeichere und die minutena/b je nachdem wie viele Minuten die Pumpe an sein soll auf true setze. Die Boolean Variable wurde im Void Setup bereits auf false gesetzt.
1 | if (currentLine.endsWith("GET /H")) { |
2 | |
3 | digitalWrite(5, LOW); // bei Low schaltet das Relais durch |
4 | currentMillis15 = millis(); // Zeit gespeichert 15 min |
5 | minutena = true;} |
6 | |
7 | if (currentLine.endsWith("GET /T")) { |
8 | |
9 | digitalWrite(5, LOW); // bei Low schaltet das Relais durch |
10 | currentMillis15 = millis()-300000; // Zeit gespeichert 10 min |
11 | minutenb = true; |
Ab jetzt ist der Pin 5 Low und meine Pumpe an und geht nach der definierten Zeit wieder aus.
1 | if (millis() - currentMillis15 > intervall15){ // 15 min warten |
2 | // turn LED on:
|
3 | digitalWrite(5, HIGH); |
4 | minutena = false; |
5 | minutenb = false; |
6 | }
|
Während die Pumpe an ist wollte ich dies mit den Sekunden im Browser angezeigt bekommen. Aber immer nur entsprechend der Minuten. Also 10 oder 15 Minuten Dabei hatte ich mir gedacht, dies über die boolean minutea/b Variablen zu lösen.
1 | if (minutena = true){ |
2 | client.print((millis() - currentMillis15)/1000); // einheit in Sekunden |
3 | client.print(" von 900 (Pumpe schaltet bei 900 ab.)<br>");} |
4 | else if (minutenb = true){ |
5 | client.print((millis() - currentMillis15)/1000); |
6 | client.print(" von 600 (Pumpe schaltet bei 600 ab.)<br>");} |
Aber diese Zeitanzeige im Browser wird mir immer angezeigt. Wo ist dabei mein Gedankenfehler, wenn ich schon eine Boolsche Variable verwende, dann müsste das doch eigentlich funktionieren.
Christian G. schrieb: > Wo ist dabei mein Gedankenfehler, wenn ich schon eine Boolsche Variable > verwende, dann müsste das doch eigentlich funktionieren. das ist das Problem, man muss es genau durchdenken.... Ich sitze gerade an der bevorstehenden "Winterzeitumstellung" bzw. Rücknahme der Sommerzeit. Am 28.10. wird ja von 3 Uhr auf 2 Uhr zurückgestellt und eine stunde Später ist wieder 3 Uhr. http://www.der-postillon.com/2013/10/in-zeitschleife-gefangener-mann-stellt.html Klar nun kann man ein Flag setzen, "habe umgestellt", aber das wäre nach einem Stromausfall ja weg oder muss extra gesichert werden. Was ist aber wenn der µC ewig in der Ecke liegt und keinen Bezug mehr zu der Vorzeit hat, man schaltet ein und nun weiss man gerade nicht wie reagiert das Programm? Auch boolsche Variablen helfen da nicht immer wenn Logikfehler im Programm sind. Deswegen halte ich mich jetzt mit Aussagen zurück, dein Programm zu durchdenken musst du leider selber.
Joachim B. schrieb: > Deswegen halte ich mich jetzt mit Aussagen zurück, dein Programm zu > durchdenken musst du leider selber. In Ordnung. Trotzdem Danke! :)
Du hast an der Stelle bei der Abfrage auf minutena/b "=" mit "==" verwechselt. Das eine ist eien Zuweisung, das andere ein Vergleich. Gruß
flash schrieb: > Du hast an der Stelle bei der Abfrage auf minutena/b "=" mit "==" > verwechselt. Das eine ist eien Zuweisung, das andere ein Vergleich. > > Gruß JAAAAA!!!... Stimmt... Danke...!!! Ich habe mich gewundert, warum es nicht funktioniert, weil es für mich eigentlich logisch war. kleine Fehler werden sofort bestraft! Besten Dank!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.