Hilfe Webserver

Hallo Forum,

bin ziemlich neu auf dem Gebiet muss ich gleich sagen.

Ich habe einen ESP32 mit dem ich einen Bodenfeuchtesensor auslese. Das funktioniert soweit das ich auf der Seriellen Monitor den Wert sehe.

Ich brauche nur hilfe das ich den Wert auf dem ESP32 Webserver anzeige und von dort Weiterverarbeiten kann bzw. ich ihn über die Ferne ablesen kann.

Den ESP32 mit dem Wlan verbinden usw. das funktioniert schon, nur weiß ich nicht wie ich die Daten auf den Webserver schreibe.

Kann mir da jemand ein kurzes Beispiel geben wie das funktioniert?

Bitte um eure Hilfe

MFG

Ich empfehle Dir Esp32 Webserver Arduino Tab und dazu meine Anleitung: Einführung zu fipsok.de.

Oder auch 160+ ESP32 Projects, Tutorials and Guides with Arduino IDE.

Danke für die Antwort,

hab mir schon manche Tutorials angesehen aber das wird meistens zu viel gemacht damit (Taster, Leds die angesteuert werden usw.)

Ich will nicht mehr als einen Wert anzeigen, das kann ja ned soviel aufwand sein wie in den Tutorials angegeben wird oder?

MFG

Einfacher als ESP32 Web Server with BME280 – Advanced Weather Station weiter unten Creating the Web Server wird es nicht. Da wird der HTML-Text im Arduinoprogramm zusammengesetzt und immer komplett zum Browser übertragen.

Nachtrag: Aus mir unverständlichen Gründen wird dort WiFiServer verwendet, besser wäre WebServer und dann ohne die Headerzeilen. Inzwischen habe ich #7 probiert, das ist besser!

Doch es geht einfacher mit der ESPUI-library.
Dazu braucht man

#include <DNSServer.h>
#include <ESPUI.h>

Vorteil: Null HTML-Kenntnisse erforderlich
Nachteil: Design ist weitgehend festgelegt

Hier eine Demo-Version mit einem Datenwert.
Im Code sind meine üblichen Standardhilfsfunktionen drin.

#include <DNSServer.h>
#include <ESPUI.h>

const byte DNS_PORT = 53;
IPAddress apIP(192, 168, 4, 1);
DNSServer dnsServer;

#if defined(ESP32)
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif

const byte    OnBoard_LED = 2;

const char *home_ssid     = "heimische SSID eintragen";
const char *home_password = "heimisches Passwort eintragen";

//const char* AP_ssid = "ESPUI";
//const char* AP_password = "espui";
const char* AP_hostname = "espui";

uint16_t statusLabel_ID;
int Bodenfeuchte = 0;
unsigned long myTimerVar;


void defineGUI() {

  statusLabel_ID = ESPUI.label("Bodenfeuchte", ControlColor::Turquoise, "999");
  // statusLabel_ID     : number that is used to identfy the GUI-element
  // .label             : the type of the GUI-element
  // "Bodenfeuchte"     : the text that describes the GUI-element
  // ControlColor::Turquoise : explains ITSELF
  // "999" initial VALUE shown on the element (will be updated on runtime)
}


void setup() {
  Serial.begin(115200);
  Serial.println("Setup-Start");
  ESPUI.setVerbosity(Verbosity::VerboseJSON);
  PrintFileNameDateTime();
  connectToWiFi();
  defineGUI();

  //.begin("Title-String"); loads and serves all files from PROGMEM directly.
  ESPUI.begin("I am the website created by the ESPUI-Demo");
}


void loop() {
  BlinkHeartBeatLED(OnBoard_LED, 500);
  dnsServer.processNextRequest();

  if ( TimePeriodIsOver (myTimerVar, 3000) ) {
    Bodenfeuchte = random(0,1023);
    ESPUI.updateControlValue(statusLabel_ID, String(Bodenfeuchte) );
  }
}


void PrintFileNameDateTime() {
  Serial.println( F("Code running comes from file ") );
  Serial.println( F(__FILE__) );
  Serial.print( F("  compiled ") );
  Serial.print( F(__DATE__) );
  Serial.print( F(" ") );
  Serial.println( F(__TIME__) );
}


// easy to use helper-function for non-blocking timing
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - startOfPeriod >= TimePeriod ) {
    // more time than TimePeriod has elapsed since last time if-condition was true
    startOfPeriod = currentMillis; // a new period starts right here so set new starttime
    return true;
  }
  else return false;            // actual TimePeriod is NOT yet over
}


void BlinkHeartBeatLED(int IO_Pin, int BlinkPeriod) {
  static unsigned long MyBlinkTimer;
  pinMode(IO_Pin, OUTPUT);

  if ( TimePeriodIsOver(MyBlinkTimer, BlinkPeriod) ) {
    digitalWrite(IO_Pin, !digitalRead(IO_Pin) );
  }
}


void connectToWiFi() {

#if defined(ESP32)
  WiFi.setHostname(AP_hostname); // xxy
#else
  WiFi.hostname(AP_hostname);
#endif

  // try to connect to existing network
  WiFi.begin(home_ssid, home_password);
  Serial.print("\n\nTry to connect to existing network");
  Serial.print(" named #");
  Serial.print(home_ssid);
  Serial.println("#");

  {
    uint8_t timeout = 10;

    // Wait for connection, 5s timeout
    do {
      BlinkHeartBeatLED(OnBoard_LED, 100);
      delay(500);
      Serial.print(".");
      timeout--;
    } while (timeout && WiFi.status() != WL_CONNECTED);

    // not connected -> create hotspot
    if (WiFi.status() != WL_CONNECTED) {
      Serial.print("\n\n no connection to SSID #");
      Serial.print(home_ssid);
      Serial.println("#\n Creating hotspot");

      WiFi.mode(WIFI_AP);
      delay(100);
      WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));

#if defined(ESP32)
      uint32_t chipid = 0;
      for (int i = 0; i < 17; i = i + 8) {
        chipid |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
      }
#else
      uint32_t chipid = ESP.getChipId();
#endif
      char ap_ssid[25];
      snprintf(ap_ssid, 26, "ESPUI-%08X", chipid);
      WiFi.softAP(ap_ssid);
      Serial.print("SSID #");
      Serial.print(ap_ssid);
      Serial.println("#");

      timeout = 5;

      do {
        delay(500);
        Serial.print(".");
        timeout--;
      } while (timeout);
    }
  }

  dnsServer.start(DNS_PORT, "*", apIP);

  Serial.println("\n\nWiFi parameters:");

  Serial.print("Mode: ");
  Serial.println(WiFi.getMode() == WIFI_AP ? "Station" : "Client");
  Serial.print("IP address: ");
  Serial.println(WiFi.getMode() == WIFI_AP ? WiFi.softAPIP() : WiFi.localIP());
}

Screenshot

vgs

1 Like

Dazu gibt es von mir ja sogar eine Anleitung: ESPUI webbasierte Oberfläche für ESP32 und ESP8266.

in der IDE gibt es dazu im wesentlichen zwei Beispiele

Webserver / HelloServer
Webserver / AdvancedWebServer

Das ist zwar die richtige Basis, aber es braucht dann schon noch etwas.

Ich hab mal eben einen Webserver zusammengebastelt. Das Zip kannst dir am Ende der Seite unter downloads runterladen. Text habe ich noch nicht all zu viel dazu geschrieben, das muss ich erst machen:

https://werner.rothschopf.net/microcontroller/202307_esp_webserver_en.htm

Ist aufs erste nicht so klein, daher habe ich versucht den Sketch in logische Portionen/Tabs aufzuteilen damit man sich leichter tut.
Das OTA braucht es nicht wirklich, aber imho ist es praktisch.

Beim Server hast schon bei den IDE Beispielen gesehen:

  • im setup() definierst du für jede Seite einen handle/Funktion
  • im Tab server musst du dann eine Funktion schreiben die das HTML ausgibt.

das ist eigentlich das ganze Geheimnis. Schreib das HTML und wenn du eine Variable ausgeben willst, dann schreibe die Variable raus.
Du bist nicht beschränkt auf HTML, du kannst auch ein CSS ausgeben (ist auch im Beispiel).
Für Fehlerseiten gibts einen eigenen Handler (Seite für HTTP Response Code 404).
Und das favicon für den Browser - da ist das billigste wenn man einfach ein 204 no content antwortet.

Der Sketch ist für den ESP32 und den ESP8266, daher gibts ein paar Precompiler defines um den richtigen Webserver zu inkluden - aber das soll erkennbar sein :wink:

Sieht aktuell so aus:

forum_webserver_mini

1 Like

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