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
agmue
July 26, 2023, 9:16am
2
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
agmue
July 26, 2023, 10:06am
4
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
agmue
July 26, 2023, 10:40am
6
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
Sieht aktuell so aus:
1 Like
system
Closed
January 23, 2024, 7:41am
8
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.