Go Down

Topic: Web-Seite gibt Statusanzeige nicht zurück (Read 2674 times) previous topic - next topic

Joggel67

Mar 29, 2020, 08:47 pm Last Edit: Mar 29, 2020, 09:10 pm by Joggel67
Hallo,

ich habe wie schon oben beschrieben folgendes Problem:
Ich habe auf einen ESP32 NodeMCU einen einfachen Sketch für einen Feuchtesensor aufgespielt.
Mit diesem Sketch kann ich die Sensorwerte auf einer Web-Seite ausgeben lassen, sowie einen Ausgang schalten lassen, in meinem noch Teststadion eine LED.
Das Programm lasse ich momentan auch schneller durchlaufen, nur um zu sehen ob alles schaltet.
Ich habe drei Stadien bisher eingegeben, die LED leuchtet auch dementsprechend auf oder geht auch aus und ich kann den Wert sowie den Pin-Anschluss auf meiner HTML-Seite ausgeben lassen.
Nun soll aber auch noch der Status der Pumpe angezeigt werden und später auch noch eine weitere Bemerkung über den Zustand der Erdfeuchte.
Aber genau da hab ich das Problem, ich bekomme diese Werte nicht angezeigt.
Habt ihr einen Tip was da falsch läuft?
Und bitte jetzt nicht schreiben: ich hätte das ganz anders gemacht.
Sicher gibt es wesentlich bessere Lösungen, ich bin auch kein Programmierer, aber für mich reicht der Sketch vom Prinzip her ja und er macht auch das was er soll. Ich verstehe eben nur nicht warum ich keine Statusanzeige in meiner Web-Seite bekomme, den Sensorwert und Pin-Anschluss sehe ich ja auch.......  :smiley-confuse:
Ich bekomme nur leider beim besten Willen keine Statusanzeige meiner Pumpe.

Code: [Select]
           {
              Sensor_1_Wert = analogRead(Sensor_1_Pin);
              client.println("<table><tr><th>Sensor</th><th>Pin Nr.:</th><th>Wert</th><th>Status Erde</th><th>Status Pumpe</th></tr>");         /* Tabelle mit Tabellenbezeichnungen, in diesem Fall 3-Spaltig  */
              client.println("<tr><td>Sensor 1</td><td>");
              client.println(Sensor_1_Pin);
              client.println("<td><span class=\"sensor\">");
              client.println(Sensor_1_Wert);
              client.println("<td><span class=\"sensor\">");

              if (digitalRead(Pumpe_1) == HIGH)
                Pumpe_1_Status = digitalRead(Pumpe_1);
                client.println("<td><span class=\"voltage\">");
                client.println(Pumpe_1_Status);
            }




Danke, Jörg

noiasca

#1
Mar 29, 2020, 09:15 pm Last Edit: Mar 29, 2020, 09:28 pm by noiasca
a) schau mal in den ausgegeben Quelltext ob da wirklich nichts steht, denn das ist nicht vollständig
Code: [Select]

              if (digitalRead(Pumpe_1) == HIGH)
                Pumpe_1_Status = digitalRead(Pumpe_1);
                client.println("<td><span class=\"voltage\">");
                client.println(Pumpe_1_Status);


du machst td nicht zu.

b) gibt dir die Werte auf der Seriellen aus, dann siehst du, was passieren sollte.

c) Validiere mal deinen HTML Quellcode: https://validator.w3.org/

d) ja ich hätte das ganz anders aufgebaut. Wenn du auf einem ESP bist, dann nimm das Beispiel Webserver | HelloServer als Basis!

edit

e) du, dein ganzes HTML ist eigentlich verbogen
Code: [Select]

client.println("</style></head><body><h1>ESP32 mit BME280</h1>");
            client.println("<tr><td>Diese Seite gibt die momentanen Klimadaten  im Wohnzimmer aus.</td><td><br>");
            client.println("<tr><td>Die Seite aktualisiert sich selbstst&auml;ndig alle 10 Sekunden<tr><td><br>");
            client.println(" <br>");


das passt doch nicht. Wo beginnt table. Alles Kraut und Rüben. Validiere dein HTML!!!

noch mal edit:

f) was machst du da unten in Zeile 170 (und auch noch öfters) mit client.print? - Da ist die Seite ja schon lange draußen beim Browser. Du hast bei 152 ja schon client.stop gemacht!
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Joggel67

Quote
f) was machst du da unten in Zeile 170 (und auch noch öfters) mit client.print? - Da ist die Seite ja schon lange draußen beim Browser. Du hast bei 152 ja schon client.stop gemacht!
War ein falscher Fehler von mir, hab ich vergessen aus dem Code raus zu nehmen.....  :smiley-confuse:

Quote
a) schau mal in den ausgegeben Quelltext ob da wirklich nichts steht, denn das ist nicht vollständig
Stimmt nur teilweise, aber selbst wenn ich so abändere:
Code: [Select]

                Pumpe_1_Status = digitalRead(Pumpe_1);
                client.println("<td><span class=\"sensor\">");
                client.println(Pumpe_1_Status);
                client.println("</td>");


ändert sich genau so wenig,
Und wenn ich jede Zeile mit " /td " beende, was irgendwie logisch erscheinen soll, erscheinen keine Daten mehr.
Ich habe aber wie du sehen kannst, wenigstens im letzten print-Abschnitt td gechlossen, was aber auch nichts ändert.

Quote
c) Validiere mal deinen HTML Quellcode
Die Seite hab ich momentan nicht Online sondern nur im Heimnetz....

Quote
b) gibt dir die Werte auf der Seriellen aus, dann siehst du, was passieren sollte.
Selbst im seriellen Terminal bekomme ich keinerlei Angaben zu den Pumpenstatus.

Quote
das passt doch nicht. Wo beginnt table
table beginnt im Sketch :
Code: [Select]
              Sensor_1_Wert = analogRead(Sensor_1_Pin);
              client.println("<table><tr><th>Sensor</th><th>Pin Nr.:</th><th>Wert</th><th>Status Erde</th><th>Status Pumpe</th></tr>");         /* Tabelle mit Tabellenbezeichnungen, in diesem Fall 3-Spaltig  */
              client.println("<tr><td>Sensor 1</td><td>");                                            /*  Spaltenbezeichnung  */
              client.println(Sensor_1_Pin);                                                           /* Ausgabe Pin-Anschluss  */
              client.println("<td><span class=\"sensor\">");                                          /* Tabulator  */
              client.println(Sensor_1_Wert);                                                          /*  Sensorwert der ausgegeben wird  */
              client.println("<td><span class=\"sensor\">");

Die Tabelle hab ich jetzt auch noch vorsichtshalber beendet, was aber dem ganzen Problem nicht behilflich ist.
Ich lege den nochmals abgeänderten Sketch bei.....

Tommy56

Selbst im seriellen Terminal bekomme ich keinerlei Angaben zu den Pumpenstatus.
Dann machst Du etwas generell falsch. Den HTML-Validator gibt es auch als addon zum Firefox.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

my_xy_projekt

Die Tabelle hab ich jetzt auch noch vorsichtshalber beendet, was aber dem ganzen Problem nicht behilflich ist.
Dann kreis das doch logisch ein.
 
a) bekommst Du im seriellen Monitor die Ausgaben
Code: [Select]
   Serial.println("Client wurde getrennt.");
   Serial.println("");


b) kannst Du
- in Zeile 161 hinter der Klammer ein
Code: [Select]
Serial.println("Start aller paar Sekunden");
- in Zeile 163 hinter der Klammer ein
Code: [Select]
Serial.println("Start Sensorausagbe");

einfügen und beide Ausgabe im seriellen Monitor validieren?


Joggel67

#5
Mar 29, 2020, 11:53 pm Last Edit: Mar 30, 2020, 12:05 am by Joggel67
Also, folgendes hab ich jetzt gemacht:
Quote
Quote
a)   Serial.println("Client wurde getrennt.");
   Serial.println("");
erscheint immer wieder mal....

Quote
GET / HTTP/1.1
Host: xxxxxxxxxxxxxxxxxxxxxx
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

Client wurde getrennt.
b) kannst Du
- in Zeile 161 hinter der Klammer ein
Quote
Serial.println("Start aller paar Sekunden");
Quote
- in Zeile 163 hinter der Klammer ein
Quote
Serial.println("Start Sensorausagbe");
Erscheinen beide Meldungen im SM (siehe Anhang)

und von wegen:
Quote
Dann machst Du etwas generell falsch. Den HTML-Validator gibt es auch als addon zum Firefox.
Bis auf ein paar Tabulatorfehler die er mir anzeigt, welche ich aber für die Tabelle brauch, alles behoben..... Waren so wie ich gesehen hab, aber auch nicht systemrelevante Fehler.

my_xy_projekt

Also, folgendes hab ich jetzt gemacht

Erscheinen beide Meldungen im SM (siehe Anhang)

Ok,
da im seriellen Monitor doch die Ausgaben der Sensoren kommen, müsstest Du jetzt noch schreiben, wo Du die Statusausgabe der Pumpen erwartest.

Denn wenn die Bedingung in Zeile 166 erfüllt ist, kommst Du nicht mehr in Zeile 177ff.
(Gilt auch für Sensor2 weiter unten)

Woanders sehe ich im Moment keine Ausgabe zum Pumpemstatus.

Sorge dafür, das Du in jeder erfüllten Bedingung eine Ausgabe zum Status bekommst, die dann auch validiert ist. (reicht ja ne LED ;)  )

Dann schaun wir nach dem html-code.

Joggel67

Die Befehle zum schalten der Status-LED`s sind ja im seriellen Abschnitt erkennbar, z.B. 169 - 178
Code: [Select]
      {
        {
          digitalWrite(Pumpe_1, 0);
          digitalWrite(ledBlau, 255);
          digitalWrite(ledRot, 0);
          Serial.println("Dem Sensor 1 ist es zu feucht");
          Serial.println();
          Serial.println();
        }
      }

Diese LED`werden auch schön brav geschaltet, hab ich aber nicht als Statusmeldungen in der seriellen Ausgabe da mir sonst der ganze Sketch zu überlaufen wird und ich nicht als Meldung brauche, da sie ja geschaltet werden...

Quote
da im seriellen Monitor doch die Ausgaben der Sensoren kommen, müsstest Du jetzt noch schreiben, wo Du die Statusausgabe der Pumpen erwartest.
Der Pumpenstatus wird nicht im seriellen Teil erwartet, sondern im HTML-Code mit Abfrage der Pins, Zeilen 112 - 115:

Code: [Select]
                Pumpe_1_Status = digitalRead(Pumpe_1);
                client.println("<td><span class=\"sensor\">");
                client.println(Pumpe_1_Status);
                client.println("</tr></td></span>");


Die Angaben vom Sensoranschluss und wie hoch der Sensorwert ist, wird ja auch ausgegeben, dazu ein Bild.
Und ich melde mich erst heute zum späten Nachmittag wieder, da ich in der glücklichen Lage bin in die Arbeit gehen zu können  :)

Ach ja, falls jemand etwas verwirrende Bemerkungen bezüglich Seitenneuaufbau oder Laufzeiten der Schaltungszustände sieht, diese sind erst einmal irrelevant und lediglich wegen Testzwecken noch nicht richtig abgeändert  :o

my_xy_projekt

Kommentiere mal reset() aus.
Auf einem Mega mit ethernetschield nachgestellt, bekomme ich eine 1 im Pumpenstatus.

Code: [Select]
void reset()
{
//  digitalWrite(Pumpe_1, 0);
//  digitalWrite(Pumpe_2, 0);
  digitalWrite(ledBlau, 0);
  digitalWrite(ledRot, 0);
}


Du machst nur an einer Stelle die Pumpe1 an (Zeile 188):

Code: [Select]
      else if (Sensor_1_Wert >= 2100)
      {
        digitalWrite(Pumpe_1, 255);


Und weiter geht es mit:

Code: [Select]
        digitalWrite(ledBlau, 0);
        digitalWrite(ledRot, 255);
        Serial.println("Dem Sensor 1 ist es zu trocken");
        Serial.println();
        Serial.println();
      }
        reset();       // ????? 


Das Ding bleibt nicht an.

Für Pumpe 2 fängst Du in Zeile 204 an
Das reset(); in Zeile 240 steht aber noch innerhalb der Bedingung.
Die Pumpe ist gleich wieder aus.

Weiter kann ich Dir jetzt nicht helfen.
Schau einfach drauf und bau Dir viel mehr Ausgaben ein. Das geht auch ohne die vielen  Serial.println(); die nur Leerzeilen erzeugen.
Schreib lieber sowas wie Serial.println("Ausgabepunkt 1 erreicht"); etc.

Und wenn ein Punkt nicht erreicht wird, such was vorher (nicht) passiert.

Und ja, der html-code gibt was aus....

Moko

#9
Mar 30, 2020, 11:12 am Last Edit: Mar 30, 2020, 11:16 am by Moko
Kommentiere mal reset() aus.
Auf einem Mega mit ethernetschield nachgestellt, bekomme ich eine 1 im Pumpenstatus.
kann man denn überhaupt eine 0 bekommen für Pumpe 1, bei der Abfrage?
Code: [Select]

              if (digitalRead(Pumpe_1) == HIGH)
                Pumpe_1_Status = digitalRead(Pumpe_1);

my_xy_projekt

kann man denn überhaupt eine 0 bekommen für Pumpe 1, bei der Abfrage?
Code: [Select]

              if (digitalRead(Pumpe_1) == HIGH)
                Pumpe_1_Status = digitalRead(Pumpe_1);


Der Teil ist in #2 nicht (mehr) vorhanden.

noiasca

das ist in seinem Sketch aus #2 auch nicht mehr in einem if.
Ich warte jetzt mal auf seinen Letztstand, weil der Sketch aus #2 ist noch nicht vollständig korrigiert, und wenn er so wie in #5 geschrieben seine 20 Fehler ausgebessert, dann kann man sich das wieder ansehen. Dazu braucht es aber den aktuellen Sketch vom TO.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Moko

Ok, sorry. Hatte nur den Sketch in #0 gesehen :(

Joggel67

Ich lege jetzt noch einmal den kompletten Sketch rein.
Ich habe den reset noch drin gelassen, jetzt aber nur noch ganz am Schluss im loop (230).
Genau so hab ich einige unötige Klammern raus genommen, ist mir gar nicht bewusst gewesen wieviel ich da noch drin hatte.
Was mir aufgefallen ist und da ist glaub ich auch der Hund begraben, ist folgendes:
Nehme ich den reset aus dem Programm, läuft zwar das Programm durch ABER meine Pumpen werden nicht mehr nach dem "millis" Befehl ein und ausgeschaltet. Sie ändern ihren Zustand erst, nachdem auch der Sensor den Wert geändert hat. Das ist ja aber nicht Sinn und Zweck der Sache, es soll ja das Programm nur alle paar Sekunden nachschauen und dementsprechend Einschalten oder auch sein lassen.... (später natürlich nur alle paar Stunden)
Nehme ich den reset Befehl dagegen raus, erscheint auch die Statusmeldung 1 oder 0......
Irgend wo ein Denk- oder Programmfehler, nur leider finde ich den Fehler nicht......   :smiley-roll-sweat:

my_xy_projekt

Quote
Was mir aufgefallen ist und da ist glaub ich auch der Hund begraben, ist folgendes:
Nehme ich den reset aus dem Programm, läuft zwar das Programm durch ABER meine Pumpen werden nicht mehr nach dem "millis" Befehl ein und ausgeschaltet. Sie ändern ihren Zustand erst, nachdem auch der Sensor den Wert geändert hat.
Ja, das kommt davon, weil Du nicht kommentierst, was Du willst!

Code: [Select]

 // Serial.println("Start aller paar Sekunden");
    if (millis() % 8000 < 5000)                                                                      /*   Timer von 8 Sekunden Led's werden für 5 Sekunden eingeschaltet  */


Und weiter oben hast Du geschrieben, das man sich nicht von den irreführenden Texten verführen lassen soll...

Der Sketch macht, wenn Du das reset(); drin lässt nicht das was Du willst.
Wenn es raus ist, kommt ansatzweise was gefordert wird.
Die Ausgabe auf dem WebMonitor UND das passende Ereignis war schon immer ok.

Du willst das sich das Ereignis verändert.
Darum habe ich gestern in #6 mit dem seriellen Monitor angefangen und bin die Ereigniskette angegangen.
Ich hatte dazu schon eine Idee, die Du leider nicht mehr zugelassen hast.

Schön, das der Sketch jetzt durchformatiert ist.
Und ich denke, ich habe jetzt auch erfasst, was Du willst.
Bitte korrigiere mich, wenn es nicht passt.

  • lese durchgängig die Sensoren
  • Wenn zu trocken, gebe Warnung aus "zu trocken" (und schalte Pumpe ein)
  • Wenn zu nass, gebe Warnung aus "zu nass" (und schalte Pumpe aus)
  • Wenn im Giessbereich, gebe aus "jetzt giessen" (und schalte Pumpe ein)
  • Wenn Pumpe ein, mache die nach xx sekunden aus
  • Fange an von vorn.


Die Ausgabe via web ist (derzeit) nur ein Nebenschauplatz.

Kürze den Sketch auf die notwendigen(!) funktionalen Komponenten mit den entsprechenden Ausgaben auf dem seriellen Monitor.
Dann kannst Du erweitern.


Go Up