ESP32: keine Web Anwendung

Hallo,
mein ESP32 (LOLIN32) verarbeitet keine Anwendung mehr mit einem Webbrowser Aufruf.
Z.B. dieses Beispiel hat vorher funktioniert, jetzt aber nicht mehr:

// ESP32 Webserver
// Eingabe WLAN SSID und PASSWORD
// Beispiel von:
// https://techtutorialsx.com/2017/12/16/esp32-arduino-async-http-server-serving-a-html-page-from-flash-memory/
// Test: http://ipaddress/html

#include <WiFi.h>
#include <FS.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
 
const char* ssid = "ssid";
const char* password =  "password";

AsyncWebServer server(80);

// Webpage
const char HTML[] PROGMEM = "<form onSubmit=\"event.preventDefault()\"><label class=\"label\">Network Name</label><input type=\"text\" name=\"ssid\"/>
<label>Password</label><input type=\"text\" name=\"pass\"/>
<input type=\"submit\" value=\"Submit\"></form>";

void setup() {
  Serial.begin(115200);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
 
  Serial.println(WiFi.localIP());
  server.on("/html", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/html", HTML);
  });
 
  server.begin();
}
 
void loop(){
}

void preventDefault() {
  Serial.println("Button 'Submit' actuated");
}

Normale Anwendungen ohne Webaufruf funktionieren weiterhin.

MfG

Juergen B.

Hi

Dann ist jetzt irgend etwas anders, als vorher.
Ok, der Hilfe-Gehalt wird nur marginal sein, aber da Du auch keine Frage gestellt hast, wird's wohl so passen.

MfG

Hallo
Ich denke da fehlt was im Loop
Schau dir noch Mal das Beispiel dazu an

Heinz

@Heinz: Der Server nutzt Callback-Funktionen. Da darf die Loop leer bleiben. Man sollte da aber trotzdem immer einen kleinen Delay reinmachen, da u. U. anderer Code nicht zum Zuge kommt.

@Juergen:
Ich geh mal davon aus, dass die IP auf der Seriellen ausgegeben wird.

Bei mir kam auch nichts im Browser. Du hast aber nur eine Callback-Funktion gesetzt. Ich hab mal die Funktion
“void NotFound( AsyncWebServerRequest *request )”
reingemacht. Angehängt wird sie in der Zeile
server.onNotFound( NotFound );
Das heisst, sie wird aufgerufen wenn Deine “server.on(”/html", HTTP_GET, (AsyncWebServerRequest *request)" nicht passt.

Ausserdem hab ich “WiFi.mode( WIFI_AP );” aufgerufen (war aber hier nicht das Problem).

Probiers mal aus. Hier der komplette Code:

#include <Arduino.h>
#include <WiFi.h>
//#include <FS.h>
#include "AsyncTCP.h"
#include "ESPAsyncWebServer.h"
 
const char* ssid = "HOTSPOT......";
const char* password =  "1432.....";
const char* PARAM_MESSAGE = "message";

void NotFound( AsyncWebServerRequest *request );

AsyncWebServer server(80);

// Webpage
const char HTML[] PROGMEM = "<form onSubmit=\"event.preventDefault()\"><label class=\"label\">Network Name</label><input type=\"text\" name=\"ssid\"/>
<label>Password</label><input type=\"text\" name=\"pass\"/>
<input type=\"submit\" value=\"Submit\"></form>";

void setup() {
  Serial.begin(115200);
 
	WiFi.mode( WIFI_AP );
	delay( 200 );

  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
 
  Serial.println(WiFi.localIP());
  server.on("/html", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    request->send(200, "text/html", HTML);
  });

	server.onNotFound( NotFound );

  server.begin();
}
 
void loop()
{
}



void NotFound( AsyncWebServerRequest *request )
{
  Serial.println( "NotFound()" );

	uint8_t vers = request->version();
	if( vers == 0)
		Serial.println( "  Version:       HTTP/1.0" );
	else if(vers == 1)
		Serial.println( "  Version:       HTTP/1.1" );
	else
		Serial.println( "  Version:       unknown version" );

	WebRequestMethodComposite meth = request->method();
	switch(meth)
	{
		case HTTP_GET:
			Serial.println( "  Method:        HTTP_GET" );
			break;
		case HTTP_POST:
			Serial.println( "  Method:        HTTP_POST" );
			break;
		case HTTP_DELETE:
			Serial.println( "  Method:        HTTP_DELETE" );
			break;
		case HTTP_PUT:
			Serial.println( "  Method:        HTTP_PUT" );
			break;
		case HTTP_PATCH:
			Serial.println( "  Method:        HTTP_PATCH" );
			break;
		case HTTP_HEAD:
			Serial.println( "  Method:        HTTP_HEAD" );
			break;
		case HTTP_OPTIONS:
			Serial.println( "  Method:        HTTP_OPTIONS" );
			break;
		case HTTP_ANY:
			Serial.println( "  Method:        HTTP_ANY" );
			break;
		default:
			Serial.println( "  Method:        empty or unknown" );
			break;
	}

	Serial.println( "  URL:           " + request->url() );									// String:  URL of the request( not including host, port or GET parameters )
	Serial.println( "  Host:          " + request->host() );								// String:  The requested host (can be used for virtual hosting)
	Serial.println( "  Content type:  " + request->contentType() );					// String:  ContentType of the request (not avaiable in Handler::canHandle)
	Serial.print( "  Content lenth: " ); Serial.println( request->contentLength() );				// size_t:  ContentLength of the request (not avaiable in Handler::canHandle)
	Serial.println( "  Has multipart: " + request->multipart() );						// bool:    True if the request has content type "multipart"
	delay( 1 );

  String page = "<html lang=en-EN><head><meta http-equiv='refresh' content='60'/>";
  page += "<title>ESP32 WebServer</title>";
	page += "Hallo Juergen, geht doch....";
	page += "</body></html>";

	request->send( 200, "text/html", page );
}

Bevor einer wegen Groß-/Kleinschreibung meckert: Ich komme aus der C#-Ecke. Bei mir sind normalerweise globale Variable großgeschrieben, lokale klein. Ne geschweifte Klammer… :sunglasses:

Gruß,
Otmar

Hallo Juergen,

gib mal statt nur der IP-Adresse im Browser “IP/html” (zB “http://192.168.137.190/html”) ein, dann geht auch Dein ursprünglicher Code.

Alternativ kannst Du auch die Zeile
server.on("/html", HTTP_GET, (AsyncWebServerRequest *request)
in
server.on("/", HTTP_GET, (AsyncWebServerRequest *request)
ändern, dann gehts auch nur mit der IP.

Gruß,
Otmar

Hallo,
vielen Dank für Eure schnelle Hilfe.
Der Programm-Code OtmarK funktioniert bei mir und auch mein ürsprunglicher Code funktioniert nun (?).
Ich hatte gedacht mein Problem liegt am ESP32 selbst (defekter Speicher usw.).

MfG

Juergen B.

Hallo,

mit dem folgenden Programm-Code habe ich das Problem das die Dateien im SPIFFS nicht angezeigt werden:

// https://randomnerdtutorials.com/esp32-web-server-spiffs-spi-flash-file-system/
// ESP32 Web Server using SPIFFS (SPI Flash File System)

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
*********/

// Import required libraries
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>

// Replace with your network credentials
const char* ssid = "ssid";
const char* password = "password";

// Set LED GPIO
const int ledPin = 13;  // LED Red
// Stores LED state
String ledState;

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

// Replaces placeholder with LED state value
String processor(const String& var){
  Serial.println(var);
  if(var == "STATE"){
    if(digitalRead(ledPin)){
      ledState = "ON";
    }
    else{
      ledState = "OFF";
    }
    Serial.print(ledState);
    return ledState;
  }
  return String();
}
 
void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);

  // Initialize SPIFFS
  if(!SPIFFS.begin(true)){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html", String(), false, processor);
  });
  
  // Route to load style.css file
  server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/style.css", "text/css");
  });

  // Route to set GPIO to HIGH
  server.on("/on", HTTP_GET, [](AsyncWebServerRequest *request){
    digitalWrite(ledPin, HIGH);    
    request->send(SPIFFS, "/index.html", String(), false, processor);
  });
  
  // Route to set GPIO to LOW
  server.on("/off", HTTP_GET, [](AsyncWebServerRequest *request){
    digitalWrite(ledPin, LOW);    
    request->send(SPIFFS, "/index.html", String(), false, processor);
  });

  // Start server
  server.begin();
}
 
void loop(){
  
}

Es werden folgende Dateien im Verzeichnis “data” benötigt:
index.html
style.css
favicon.ico

MfG
Juergen B.

data.zip (11.6 KB)