WIFI WebServer ESP32

Hallo.

Ich habe in meinem Code ein WebServer eingebaut zum testen.

Grundsätzlich funktioniert der WebServer, aber sporadisch leider nicht.

Nach dem flashen startet der WebServer meist nicht.
Nach einem Reset geht es.
Mache ich wieder einen Reset geht es oder auch nicht.

Wenn der WebServer erstmal läuft, gibt es keine Probleme scheinbar.

Gabe schon ein paar delay eingebaut, da ich dachte es geht zu schnell aber das bringt nichts.

Wäre super wenn sich das mal jemand ansehen kann.

Vielen Dank.
PS MQTT geht immer.

ESP32_MultiSensorV005.ino (41 KB)

Du solltest Dir die Beispiele zum Webserver anschauen.
Ich bezweifle, das WiFiServer und Webserver genau gleich sind.

Gruß Tommy

Tipp: Nimm den kompfortablen Webserver.

Hab es nur mal überflogen.

const char* ntpServer = "192.168.134.1"; //Adresse vom ntpServer (Fritzbox)

OK

configTime(0, 0, "192.168.134.1", "time.nist.gov");

Worin muss ich den Sinn bzw. die Verbindung zwischen beiden suchen???

configTime(0, 0, "fritz.box", "de.pool.ntp.org");
Klappt immer, mit einer Fritzbox, egal welche IP diese hat.

Gruß Fips

Derfips:
Tipp: Nimm den kompfortablen Webserver.

Hab es nur mal überflogen.OK
Worin muss ich den Sinn bzw. die Verbindung zwischen beiden suchen???

configTime(0, 0, "fritz.box", "de.pool.ntp.org");
Klappt immer, mit einer Fritzbox, egal welche IP diese hat.

Gruß Fips

Sollte eigentlich so sein :frowning:

configTime(0, 0, ntpServer);

Danke.

Also das Problem lag nicht am ESP, sondern an der VM.

Hab hier die Netzwerkeigenschaften geändert und jetzt gehts.
Komischerweise geht dann das OTA nicht.

Muss ich mir nochmal genauer anschauen.

Tommy56 und noiasca

Werde ich mir morgen anschauen.

Danke.

Tommy56

Hab gerade mal geschaut, das WebServer war noch alt, vom testen davor.
Grundsätzlich aber kein Fehler.

Danke!

Hey, bin etwas am experimentieren.

void loop() habe ich folgenden Code (Ausschnitt)

  case 8:   DisplayPresValues("HomeControl",    "Temperatur.",                      (OneWireSensor2_Calm),                          " C         S2",            "1DS18B20");    break;
    default:  Display_Counter = 1;                                                                                                                          //Zähler zurücksetzen
  }
   WiFiClient client = server.available();   // Hört auf Anfragen von Clients

  if (client) {                             // Falls sich ein neuer Client verbindet,
    Serial.println("Neuer Client.");          // Ausgabe auf den seriellen Monitor
    String currentLine = "";                // erstelle einen String mit den eingehenden Daten vom Client
    while (client.connected()) {            // wiederholen so lange der Client verbunden ist
      if (client.available()) {             // Fall ein Byte zum lesen da ist,
        char c = client.read();             // lese das Byte, und dann
        Serial.write(c);                    // gebe es auf dem seriellen Monitor aus
        header += c;
        if (c == '\n') {                    // wenn das Byte eine Neue-Zeile Char ist
          // wenn die aktuelle Zeile leer ist, kamen 2 in folge.
          // dies ist das Ende der HTTP-Anfrage vom Client, also senden wir eine Antwort:
          if (currentLine.length() == 0) {
            // HTTP-Header fangen immer mit einem Response-Code an (z.B. HTTP/1.1 200 OK)
            // gefolgt vom Content-Type damit der Client weiss was folgt, gefolgt von einer Leerzeile:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            // Hier werden die GPIO Pins ein- oder ausgeschaltet
            if (header.indexOf("GET /4/on") >= 0) {
              Serial.println("GPIO 4 on");
              output4State = "on";
              digitalWrite(output4, HIGH);
            } else if (header.indexOf("GET /4/off") >= 0) {
              Serial.println("GPIO 4 off");
              output4State = "off";
              digitalWrite(output4, LOW);
            }
            
            // Hier wird nun die HTML Seite angezeigt:
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // Es folgen der CSS-Code um die Ein/Aus Buttons zu gestalten
            // Hier können Sie die Hintergrundfarge (background-color) und Schriftgröße (font-size) anpassen
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #333344; border: none; color: white; padding: 16px 40px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: #888899;}</style></head>");
            
            // Webseiten-Überschrift
            client.println("<body><h1>ESP8266 Web Server</h1>");
            
            // Zeige den aktuellen Status, und AN/AUS Buttons for GPIO 4
            client.println("<p>GPIO 4 - State " + output4State + "</p>");
            // Wenn output4State = off, zeige den EIN Button       
            if (output4State=="off") {
              client.println("<p><a href=\"/4/on\"><button class=\"button\">EIN</button></a></p>");
            } else {
              client.println("<p><a href=\"/4/off\"><button class=\"button button2\">AUS</button></a></p>");
            }
            client.println("</body></html>");
            
            // Die HTTP-Antwort wird mit einer Leerzeile beendet
            client.println();
            // und wir verlassen mit einem break die Schleife
            break;
          } else { // falls eine neue Zeile kommt, lösche die aktuelle Zeile
            currentLine = "";
          }
        } else if (c != '\r') {  // wenn etwas kommt was kein Zeilenumbruch ist,
          currentLine += c;      // füge es am Ende von currentLine an
        }
      }
    }
    // Die Header-Variable für den nächsten Durchlauf löschen
    header = "";
    // Die Verbindung schließen
    client.stop();
    Serial.println("Client getrennt.");
    Serial.println("");
  }
}

//END

Der Code schaltet ein Relais (Ein/Aus).
Es geht zur Zeit nicht um den Code.

Wie bekomme ich es hin, das der Code in einem Unterprogramm ausgeführt wird?
Das hier geht nicht?!

void loop(){
....
TEST;
....
}
void TEST(){
  WiFiClient client = server.available();   // Hört auf Anfragen von Clients

  if (client) {                             // Falls sich ein neuer Client verbindet,
    Serial.println("Neuer Client.");          // Ausgabe auf den seriellen Monitor
    String currentLine = "";                // erstelle einen String mit den eingehenden Daten vom Client
    while (client.connected()) {            // wiederholen so lange der Client verbunden ist
      if (client.available()) {             // Fall ein Byte zum lesen da ist,
        char c = client.read();             // lese das Byte, und dann
        Serial.write(c);                    // gebe es auf dem seriellen Monitor aus
        header += c;
        if (c == '\n') {                    // wenn das Byte eine Neue-Zeile Char ist
          // wenn die aktuelle Zeile leer ist, kamen 2 in folge.
          // dies ist das Ende der HTTP-Anfrage vom Client, also senden wir eine Antwort:
          if (currentLine.length() == 0) {


          .......


                  </html>");
            
            // Die HTTP-Antwort wird mit einer Leerzeile beendet
            client.println();
            // und wir verlassen mit einem break die Schleife
            break;
          } else { // falls eine neue Zeile kommt, lösche die aktuelle Zeile
            currentLine = "";
          }
        } else if (c != '\r') {  // wenn etwas kommt was kein Zeilenumbruch ist,
          currentLine += c;      // füge es am Ende von currentLine an
        }
      }
    }
    // Die Header-Variable für den nächsten Durchlauf löschen
    header = "";
    // Die Verbindung schließen
    client.stop();
    Serial.println("Client getrennt.");
    Serial.println("");
  }
}

Versuche

TEST();

Dein TEST; ist bestenfalls die Adresse, wo die Funktion (nicht Unterprogramm) anfängt.

MfG

Kannst Du das etwas genauer Erklären? Danke.

Statt

void loop(){
....
TEST;
....
}

Versuche -->

void loop(){
....
TEST();
....
}

Hinter den Namen gehören die Klammern - auch, wenn leer!

MfG

Vielen Dank.

War gestern zu spät :frowning:

Habe das ganze jetzt am laufen.

Wollte mir jetzt "nur" noch die Werte der Sensoren anzeigen lassen, aber das geht nicht :frowning:

float                 BME280_Temp_Calm;
client.println("<p>Temperatur (BME280) = " + BME280_Temp_Calm + " &deg;C</p>");

Fehler: invalid operands of types 'const char [26]' and 'char [50]' to binary 'operator+'

Denke das ich kein float nehmen kann. Aber wie bekomme ich Werte in die Zeichenkette?!

Mit snprintf hatte auch keine Erfolg.

            char buf[26];
            sprintf(buf, "%f", BME280_Temp_Calm);

            client.println("<p>Temperatur (BME280) = " + buf + " &deg;C</p>");

So geht es.

            client.println("<p>Temperatur (BME280) = ");
            client.println(BME280_Temp_Calm);
            client.println(" &deg;C</p>");

Das geht.

            client.println("<p>Temperatur (BME280) = ") + (BME280_Temp_Calm);
            client.println(" &deg;C</p>");

Aber das geht nicht.

            client.println("<p>Temperatur (BME280) = ") + (BME280_Temp_Calm) + (" &deg;C</p>");

Aber es muss doch auch in einer Zeile gehen?!

Hi

Warum willst Du erst den ganzen Mist in einen zusammenhängenden String bappen?
Bis darauf, daß Du unnötig RAM dafür brauchst, ist's kein Unterschied.
Bei Ausgabe des Float-Wert müsstest Du noch die Kommastellen angeben können.

MfG

postmaster-ino:
Hi

Warum willst Du erst den ganzen Mist......

Ist doch klar!
Wer Anwort #1 bis #3 sauber ignoriert!

Dem ist unsere Hilfe unverständlich.

Derfips:
Ist doch klar!
Wer Anwort #1 bis #3 sauber ignoriert!

Dem ist unsere Hilfe unverständlich.

Nur kurz, ich habe nichts ignoriert.

Ich bin nur am testen und spiele auch mit dem WebServer rum.

Da es viele Beispiel gibt, wo der WebServer nicht verwendet wird, möchte auch damit mal experimentieren.

Was ist da schlimm dran? Natürlich ergeben sich dann auch Fragen. Wie meine letzte.

postmaster-ino:
Hi

Warum willst Du erst den ganzen Mist in einen zusammenhängenden String bappen?
Bis darauf, daß Du unnötig RAM dafür brauchst, ist's kein Unterschied.
Bei Ausgabe des Float-Wert müsstest Du noch die Kommastellen angeben können.

MfG

Danke für die Antwort.

Also erzeuge ich mit client.print einen langen String der dann zum Client übertragen wird?

Wie wird das den beim WebServer (z.B. Hello World) gemacht, erzeugt der im Hintergrund nicht genauso ein String?

hd458:
Da es viele Beispiel gibt, wo der WebServer nicht verwendet wird, möchte auch damit mal experimentieren.

Klar! Warum einfach?

Du solltest trotz alledem die korrekte Zeichencodierung für Html 5 verwenden.

<meta charset="UTF-8">

Dann kann man einfach °C hinschreiben.

Ansonsten, mach wie du denkst!
Meine Webseiten liegen im Spiffs, da geht die Entwicklung eben dieser, mindestens drei mal so schnell.

Gruß Fips

Fips danke für die Antwort.

Klar! Warum einfach?

Ich probiere doch nur aus, was ist schlimm daran?

Du solltest trotz alledem die korrekte Zeichencodierung für Html 5 verwenden.

Dann kann man einfach °C hinschreiben.

Danke.

Ansonsten, mach wie du denkst!

Ich glaube, das ich (schau meinen restlichen Code an) alles umgesetzt habe, was ich von Dir und den anderen als Vorschlag bekommen habe.

Meine Webseiten liegen im Spiffs, da geht die Entwicklung eben dieser, mindestens drei mal so schnell.
Werde nach Spiffs gegoogeln.

Aber nochmal, ich lerne und will doch auch mal links und rechts schauen.
Machen aus meiner Sicht leider nur noch sehr wenige (im Leben).

Zudem lerne ich durch den anderen Code dazu.

Auch ignoriere ich bestimmt nicht bewusst Eure Meinung! Sonst würde ich hier nicht fragen, wenn ich Eure Meinung nicht schätzen würde.

LINK

Dann sind solche Beispiel schlecht und die Verfasser haben keine Ahnung aus Deiner Sicht?!

PS Nur ein Beispiel.