Forum: Mikrocontroller und Digitale Elektronik ESP32 Ansteuerung einer Pumpe über WLAN


von Christian G. (aempc)


Angehängte Dateien:

Lesenswert?

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
von Joachim B. (jar)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Christian G. (aempc)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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.

von Christian G. (aempc)


Lesenswert?

Joachim B. schrieb:
> Deswegen halte ich mich jetzt mit Aussagen zurück, dein Programm zu
> durchdenken musst du leider selber.

In Ordnung. Trotzdem Danke! :)

von flash (Gast)


Lesenswert?

Du hast an der Stelle bei der Abfrage auf minutena/b "=" mit "==" 
verwechselt. Das eine ist eien Zuweisung, das andere ein Vergleich.

Gruß

von Christian G. (aempc)


Lesenswert?

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
Noch kein Account? Hier anmelden.