ESP32 HTML Script

Moin zusammen,
Ich sitze gerade an einem Projekt mit meinem ESP32 und ich würde gerne eine website damit verbinden. Ich habe dazu schon die Wlan Verbindung und meine webserver datei sieht im moment so aus:

#include "webserver.h"
#include "schranke.h"

String header;
String output26State = "off";
String output27State = "off";
String output_state = "nicht festgelegt";
const int output26 = 26;
const int output27 = 27;




void handleClient() {
    WiFiClient client = server.available();

    if (client) {
        unsigned long currentTime = millis();
        unsigned long previousTime = currentTime;
        const long timeoutTime = 2000;

        Serial.println("New Client.");
        String currentLine = "";

        while (client.connected() && currentTime - previousTime <= timeoutTime) {
            currentTime = millis();
            if (client.available()) {
                char c = client.read();
                Serial.write(c);
                header += c;

                if (c == '\n') {
                    if (currentLine.length() == 0) {
                        client.println("HTTP/1.1 200 OK");
                        client.println("Content-type:text/html");
                        client.println("Connection: close");
                        client.println();

                        if (header.indexOf("GET /26/on") >= 0) {
                            Serial.println("GPIO 26 on");
                            output26State = "on";
                            digitalWrite(output26, HIGH);
                            auf();
                        } else if (header.indexOf("GET /26/off") >= 0) {
                            Serial.println("GPIO 26 off");
                            output26State = "off";
                            digitalWrite(output26, LOW);
                        } else if (header.indexOf("GET /27/on") >= 0) {
                            Serial.println("GPIO 27 on");
                            output27State = "on";
                            digitalWrite(output27, HIGH);
                        } else if (header.indexOf("GET /27/off") >= 0) {
                            Serial.println("GPIO 27 off");
                            output27State = "off";
                            digitalWrite(output27, LOW);
                        }
                        if(state = true){
                          Serial.println(state);
                          output_state = "AUF";
                        }
                        else{
                          output_state = "ZU";
                          Serial.println(state);
                        }

                        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:,\">");
                        client.println("<style>html { font-family: Helvetica; text-align: center;}");
                        client.println(".button { background-color: #4CAF50; color: white; padding: 16px 40px;");
                        client.println("font-size: 30px; margin: 2px; cursor: pointer;}");
                        client.println(".button2 {background-color: #555555;}</style></head>");

                        client.println("<body><h1>ESP32 Web Server</h1>");
                        client.println("<p>GPIO 26 - State " + output26State + "</p>");
                        client.println(output26State == "off" ? "<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>"
                                                              : "<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
                        client.println("<p>Aktueller schrnaken zustand" + output_state + "</p>");
                        client.println("<p>GPIO 27 - State " + output27State + "</p>");
                        client.println(output27State == "off" ? "<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>"
                                                              : "<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>");
                        client.println("</body></html>");
                        client.println();

                        break;
                    } else {
                        currentLine = "";
                    }
                } else if (c != '\r') {
                    currentLine += c;
                }
            }
        }
        header = "";
        client.stop();
        Serial.println("Client disconnected.");
    }
}

Nun frage ich mich ob man das auch alles in einer externe HTML Datei auslagern kann.

Vielen Dank für die Hilfe!

Ja, die kannst Du im Dateisystem des ESP32 (LittleFS) speichern.
Beispiele dazu gibt es bei Fips. Eine Einführung von @agmue in die Website von Fips gibt es hier.

Gruß Tommy

Was ist wenn ich ein unabhängige website mit html css js habe kann ich dadrauf daten übermitteln wie zum beispiel sensor Daten

Klar, z.B. über Javascript und die Fetch-API.

Gruß Tommy

oder Websockets

oder AJAX :wink:

Gruß Tommy

oder FROSCH

Kannst du das näher beschreiben?
Wo ist diese "unabhängige website" gehostet?

Ohne Link finde ich da nicht, was du meinen könntest.

AJAX:

FROSCH:

.... ja ja ja Karneval kommt erst ... ich konnte es mir trotzdem nicht verkneifen ... :sunglasses:

Dann der Vollständigkeit halber: AJAX.

Gruß Tommy

Wenn Du damit eine Datei im Dateisystem LittleFS des ESP32 meinst, kann sich diese Seite Daten beispielsweise im JSON-Format holen.

Im Programm:

buff += ""C180":["";
buff += kw180; // Variable mit den Daten
buff += ""],";

html-Datei JavaScript:

document.getElementById("kw180").innerHTML=obj.C180+" KWh";

html-Datei body:

<td>Bezug gesamt: &nbsp;&nbsp;&nbsp;</td><span id="kw180"></span></td>

Anzeige im Browser:

image

Nur damit Du eine grobe Vorstellung hast :slightly_smiling_face:

Ich habe in der Regel nicht mal JSON verwendet, sondern Name/Wert-Paare mit ; getrennt. Dabei die Namen so wie die ID des HTML-Zielfeldes gewählt.

feld1=325;feld2="Hallo";

Da kannst Du im Javascript den String am ; trennen und das in ein Array schieben und in einer Schleife über das Array die Felder füllen;

Da die Länge der Antwort bekannt ist, kann man mit String.reserve(Länge) auch das Fragmentierungsproblem umgehen oder es gleich mit snprintf bauen..

Gruß Tommy

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.