Türkontankte ob Tür offen oder geschlossen auf einer Internseite darstellen

Bei meinem Projekt habe ich einen Microschalter (Taster) in das Türschloss eingebaut,
damit ich sehen kann, ob die Tür verschlossen ist oder offen. Dafür nehme ich D1 Mine und ein Display,
und lasse mir darüber den Status anzeigen, ob die Tür offen oder geschlossen ist.
Nun meine Frage: wie kann ich die Sketch D1 Mine und ein Display mit dem Sketch Web Server miteinander
verbinden, so dass ich auf der Internetseite den Status des Microschalters sehe, ob die Tür geschlossen oder offen ist?Verwende dieses Symbol um Code zu posten
Im Anhang habe ich die beiden Sketch beigefügt.

Vielleicht können Sie mir helfen.
Aufrufen eine Web Seite mDNS Server

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
ESP8266WebServer server(80);
const char* ssid = " ";
const char* password = " ";
// http://makesmart-esp.local/
const char* dns_name = "Tuer_Kontakte";
void eigeneFunktion();
void setup()
{
Serial.begin(9600);
Serial.println("ESP Gestartet");
WiFi.begin(ssid, password);
Serial.print("Verbindung wird hergestellt ...");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Verbunden! IP-Adresse: ");
Serial.println(WiFi.localIP());
// Bei Android-Geräten wird der mDNS oft nicht unterstützt, dann muss auf die IP-
Adresse zurückgegriDen werden
if (MDNS.begin(dns_name)) {
Serial.println("DNS gestartet, erreichbar unter: ");
Serial.println("http://" + String(dns_name) + ".local/");
}
server.onNotFound([](){
server.send(404, "text/plain", "Link wurde nicht gefunden!");
});
server.on("/", []() {
server.send(200, "text/plain", "ESP-Startseite!");
});
server.on("/custom", []() {
server.send(200, "text/plain", "Nur eine Beispiel-Route");
eigeneFunktion();
});
server.begin();
Serial.println("Webserver gestartet.");
}
void loop() {
Abfrage von 3 Taster und anzeige auf Display
#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek
einbinden
LiquidCrystal_I2C lcd(0x27, 20, 4); //Für ein vierzeiliges I2C-LCD verwendet man den
Code "LiquidCrystal_I2C lcd(0x27, 20, 4)"
int pinStatusGargentor = 16;
int pinStatuswerkstattor = 14;
int pinStatuskellertor = 12;
void setup()
{
Serial.begin(115200);
pinMode(pinStatusGargentor,INPUT);
pinMode(pinStatuswerkstattor,INPUT);
pinMode(pinStatuskellertor, INPUT);
lcd.begin();
lcd.backlight();
}
void loop()
{
if (digitalRead(pinStatusGargentor) == LOW)//16
{
Serial.println("Tür geschlosen");
lcd.setCursor(0, 0);
lcd.print("Garge.Tuer geschosen");
Werkstatttor();
Kellertor();
}
else
{
Serial.println("Tür offen");
lcd.setCursor(0, 0);
lcd.print("Garge.Tuer offen ");
Werkstatttor();
Kellertor();
}
}
void Werkstatttor()
{
if (digitalRead(pinStatuswerkstattor) == LOW)//14
{
lcd.setCursor(0, 1);
lcd.print("Werks.Tuer geschosen");
}
else
{
lcd.setCursor(0, 1);
lcd.print("Werks.Tuer offen ");
}
}
void Kellertor()
{
if (digitalRead(pinStatuskellertor) == LOW)//12
{
lcd.setCursor(0, 2);
lcd.print("Kellertuer geschosen");
}
else
{
lcd.setCursor(0, 2);
lcd.print("Kellertuer offen ");
}
}

Wie man dieses Forum benutzt - bitte lesen

Was ist das?

Gruß Tommy

1 Like

Hallo ich meine einen ESP8266 Wemos D1 Mini WiFi als mikrocontroller

Du könntest ESPhome auf den Controller laden als Schaltsensor und dann Home Assistant benutzen - das Dashboard kannst du recht frei gestalten und eine Webseite ist das per se. Inklusive History und auf deinen Kontakten aufsetzender Automation, sofern du das wünschst.

1 Like

Füge deinen Sketch bitte erst mal so ein, wie es in der Beschreibung (Link von J-M-L) steht.
Dann kann man den besser lesen und auch kopieren.

du müsstest halt in deiner Seite auch den Status des Schalters ausgeben.

Aber vieleicht fängst mal weiter hinten an, hier habe ich Beispiele wie man Werte auf einem Webserver ausgibt:

ESP8266 ESP32 webserver maxi (rothschopf.net)

oder

ESP8266 ESP32 webserver mini (rothschopf.net)

Hallo hier mein Code

[code]
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

ESP8266WebServer server(80);

const char* ssid = "--------";
const char* password = "---------";

// http://makesmart-esp.local/ 
const char* dns_name = "Tuer_Kontakte";
int pinStatusGargentor = 16;
void eigeneFunktion();

void setup()
{
  pinMode(pinStatusGargentor,INPUT);

  Serial.begin(9600);
  Serial.println("ESP Gestartet");

  WiFi.begin(ssid, password);

  Serial.print("Verbindung wird hergestellt ...");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Verbunden! IP-Adresse: ");
  Serial.println(WiFi.localIP());

  // Bei Android-Geräten wird der mDNS oft nicht unterstützt, dann muss auf die IP-Adresse zurückgegriffen werden
  if (MDNS.begin(dns_name)) {
    Serial.println("DNS gestartet, erreichbar unter: ");
    Serial.println("http://" + String(dns_name) + ".local/");
  }

  server.onNotFound([](){
    server.send(404, "text/plain", "Link wurde nicht gefunden!");  
  });

  server.on("/", []() {
    server.send(200, "text/plain", "ESP-Startseite!");
  });

  server.on("/custom", []() {
    server.send(200, "text/plain", "Nur eine Beispiel-Route");
    eigeneFunktion();  
  });
  server.on("/state", []() {
    server.send(200, "text/plain", String(digitalRead(pinStatusGargentor)));
    eigeneFunktion();  
  });
  server.begin();
  Serial.println("Webserver gestartet.");
  //Serial.println("Tür geschlosen");
}

void loop() {
  server.handleClient();  
  MDNS.update();`Verwende dieses Symbol um Code zu posten`
  eigeneFunktion();
}

void eigeneFunktion(){
 //Serial.println("unsere eigene Funktion wird ausgeführt ...");
   //{
 if (digitalRead(pinStatusGargentor) == LOW)//16
  
 {
  Serial.println("Tür geschlosen");
  digitalWrite(16, LOW);
}
   else
{
  Serial.println("Tür  offen");
  digitalWrite(16, HIGH);
}
}
[/code]
[code]
#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x27, 20, 4); //Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)" 


int pinStatusGargentor = 16;
int pinStatuswerkstattor = 14;
int pinStatuskellertor = 12;
void setup()
{
  Serial.begin(115200);
  pinMode(pinStatusGargentor,INPUT);
  pinMode(pinStatuswerkstattor,INPUT);
  pinMode(pinStatuskellertor, INPUT);
  lcd.begin();
  lcd.backlight();
  
}

void loop()
{
 if (digitalRead(pinStatusGargentor) == LOW)//16
  
 {
  Serial.println("Tür geschlosen");
 
  lcd.setCursor(0, 0);
  lcd.print("Garge.Tuer geschosen");
  Werkstatttor();
  Kellertor();
}
   else
{
  Serial.println("Tür  offen");
  lcd.setCursor(0, 0);
  lcd.print("Garge.Tuer offen    ");
  Werkstatttor();
  Kellertor();
}
 }
 
void Werkstatttor()
{
   if (digitalRead(pinStatuswerkstattor) == LOW)//14
   {
   lcd.setCursor(0, 1);
  lcd.print("Werks.Tuer geschosen");
  
   }
   else
{
  lcd.setCursor(0, 1);
  lcd.print("Werks.Tuer offen      ");
}
}
void Kellertor()
{
   if (digitalRead(pinStatuskellertor) == LOW)//12
   {
   lcd.setCursor(0, 2);
  lcd.print("Kellertuer geschosen");
  
   }
  else
{
  lcd.setCursor(0, 2);
  lcd.print("Kellertuer offen      ");
}
}
[/code]

[code]
#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x27, 20, 4); //Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)" 


int pinStatusGargentor = 16;
int pinStatuswerkstattor = 14;
int pinStatuskellertor = 12;
void setup()
{
  Serial.begin(115200);
  pinMode(pinStatusGargentor,INPUT);
  pinMode(pinStatuswerkstattor,INPUT);
  pinMode(pinStatuskellertor, INPUT);
  lcd.begin();
  lcd.backlight();
  
}

void loop()
{
 if (digitalRead(pinStatusGargentor) == LOW)//16
  
 {
  Serial.println("Tür geschlosen");
 
  lcd.setCursor(0, 0);
  lcd.print("Garge.Tuer geschosen");
  Werkstatttor();
  Kellertor();
}
   else
{
  Serial.println("Tür  offen");
  lcd.setCursor(0, 0);
  lcd.print("Garge.Tuer offen    ");
  Werkstatttor();
  Kellertor();
}
 }
 
void Werkstatttor()
{
   if (digitalRead(pinStatuswerkstattor) == LOW)//14
   {
   lcd.setCursor(0, 1);
  lcd.print("Werks.Tuer geschosen");
  
   }
   else
{
  lcd.setCursor(0, 1);
  lcd.print("Werks.Tuer offen      ");
}
}
void Kellertor()
{
   if (digitalRead(pinStatuskellertor) == LOW)//12
   {
   lcd.setCursor(0, 2);
  lcd.print("Kellertuer geschosen");
  
   }
  else
{
  lcd.setCursor(0, 2);
  lcd.print("Kellertuer offen      ");
}
}
[/code]

Gruß K-P

Zusätzlich zum Beispiel von noiasca, kannst du dir auch mal die Beispiele auf der Seite von fips anschauen. Diese sind durchaus hilfreich.

Nein eben nicht!
Das fängt damit an das sich die Hauptseite so präsentiert.
Jede Menge links aber kein Hinweis wo fängt man an?

1 Like

Das dürfte aber eher an Dir liegen.
Außerdem gibt es die Einführung von @agmue

Gruß Tommy

2 Likes

Zwei Fragen:

  1. könntest du so nett sein und den Link benennen mit dem man am besten einsteigt?

  2. Welcher Neueinsteiger verfügt über das Wissen das es von agmue ein Einführung gibt?

  1. Den Link der Einführung hast Du gerade zitiert.
  2. Die wurde schon oft im Forum benannt. Es gibt eine Suchfunktion.
  3. Wer für alles eine mundgerechte Anleitung ohne Denken und Suchen braucht, hat sich wohl das falsche Hobby gesucht.
  4. Wenn Dir das alles nicht genügt, steht es Dir natürlich frei, selbst einen Einstieg zu beschreiben und bereit zu stellen.

Gruß Tommy

Hallo Tommy56 Ich bin Einsteiger und verfügr nicht über die Kenntnisse von einer WEB Server Seite aufbau.
Ich wollte nur eine leere Seite mit folgenden Daten sehen:

WEB Seite

Garagentür: offen
Werkstatttür: geschlossen
Waschhaustür: geschlossen

So ganz ohne Kenntnisse schreibt sich eine Webseite schwer. Also ist erst mal Lernen angesagt.
Zum Einstieg: Selfhtml.

Gruß Tommy

Na super die ganz große Ladung.

Wenn Du an allen unseren Antworten rum zu meckern hast, warum schreibst Du ihm nicht seine Webseite oder eine Anleitung dazu?
Ich weiß, nur meckern ist einfacher, als etwas konstruktives zu verfassen.

Gruß Tommy

Man kann auch eher alles schlecht reden, um die Leute vom selber Denken abzuhalten.

Was genau ist eine "leere Seite" mit den von dir gewünschten Informationen ?

eine Webseite auf der einfach nur

steht

Hat gedauert das umzuschreiben.
nachdem ich jetzt das Mini webserver-Beispiel von Noiasca angepasst habe mein Kommentar:

Ziemlich unübersichtlich den html-Quäl-Kot - äh 'tschuldigung Quellcode wollte ich schreiben - anzupassen.

Ich bevorzuge nach wie vor ESPUI oder ESP-DASH
Nichts detso trotz hier das umgestrickte Mini-Webserver-Beispiel

#define TXT_BOARDNAME "ESP Webserver Mini"    // the name of the board on webgui and Serial

const byte wifiActivityPin = 2;               // if you want to indicate Wifi activity on a pin. Set to 255 if activity LED is not needed

#ifdef ARDUINO_ARCH_ESP8266            // libraries if you compile for a ESP8266
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>          // for the webserver
#include <ESP8266mDNS.h>               // Bonjour/multicast DNS, finds the device on network by name
#include <ArduinoOTA.h>                // OTA Upload via ArduinoIDE
#endif
#ifdef ARDUINO_ARCH_ESP32              // libraries if you compile for a ESP32
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>                 // for the webserver
#include <ESPmDNS.h>                   // Bonjour/multicast DNS, finds the device on network by name   
// #include <ArduinoOTA.h>                // OTA Upload via ArduinoIDE
#endif

#define VERSION "1.0.0"                // the version of this sketch

/* *******************************************************************
         define which board variant should be compiled
         set the number to one of your defined boards
 ********************************************************************/

#define USE_BOARD 1                   // the actual board to compile:
//                                         1 a generic demo / base configuration for your boards

/* *******************************************************************
         other settings / weitere Einstellungen für den Anwender
 ********************************************************************/

//#include <credentials.h>               // if you have an external file with your credentials you can use it - remove before upload


//#ifndef STASSID                        // either use an external .h file containing STASSID and STAPSK - or
//#define STASSID "your-ssid"            // ... modify these line to your SSID
//#define STAPSK  "your-password"        // ... and set your WIFI password
//#endif

const char *ssid       = "deine SSID";
const char *password = "dein Passwort";

//const char* ssid = STASSID;
//const char* password = STAPSK;

/* *******************************************************************
         Globals - Variables and constants
 ********************************************************************/

#ifdef ARDUINO_ARCH_ESP8266
ESP8266WebServer server(80);           // an instance for the webserver
#else
WebServer server(80);
#endif

// some user variables
//int anInteger = 123;
//float aFloat = 12.34;
String aString = "abcd";
/* *******************************************************************
         S E T U P
 ********************************************************************/

const byte pinStatusGargentor = 16;
const byte pinStatuswerkstattor = 14;
const byte pinStatuskellertor = 12;

byte aufZuGaragenTor;
byte aufZuWerkstattTor;
byte aufZuKellerTor;


void setup() {
  Serial.begin(115200);
  pinMode(pinStatusGargentor, INPUT);
  pinMode(pinStatuswerkstattor, INPUT);
  pinMode(pinStatuskellertor, INPUT);

  Serial.print(F("\n" TXT_BOARDNAME "\nVersion: " VERSION " Board "));
  Serial.println(USE_BOARD);
  Serial.print  (__DATE__);
  Serial.print  (" ");
  Serial.println(__TIME__);
  //printDefinitions();// debug only

  if (wifiActivityPin < 255)
    pinMode(wifiActivityPin, OUTPUT);
  char myhostname[16] {"esp"};         // The sketch will add the board ID. Take care about the total length of the char array (including null)
  char val[8];
  itoa(USE_BOARD, val, 10);            // before we can concatenate the precompiler integer, we have to convert it to char array
  strcat(myhostname, val);
  WiFi.hostname(myhostname);
#ifdef ARDUINO_ARCH_ESP32
  WiFi.setSleep(false);                // disable powersafe https://github.com/espressif/arduino-esp32/issues/1484
#endif
  Serial.print("try ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  // Wait for connection
  int8_t i = 0;  // just a counter to be able generate a line feed
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print('.');
    if (wifiActivityPin < 255)
      digitalRead(wifiActivityPin) == LOW ? digitalWrite(wifiActivityPin, HIGH) : digitalWrite(wifiActivityPin, LOW); // blink one pin as indicator
    i++;
    if (i >= 40) {
      Serial.println();
      i = 0;
    }
  }
  Serial.print(F("\nConnected to "));
  Serial.println(ssid);
  Serial.print(F("IP address: "));
  Serial.println(WiFi.localIP());
  if (MDNS.begin(myhostname)) {
    Serial.println(F("MDNS responder started"));
  }
  if (wifiActivityPin < 255) digitalWrite(wifiActivityPin, wifiActivityPin);
  //define the pages and other content for the webserver
  server.on("/",      handlePage);               // send root page
  server.on("/0.htm", handlePage);               // the page can use the same handle
  server.on("/1.htm", handlePage1);              // another page, another handle
  server.on("/f.css", handleCss);                // a stylesheet
  server.on("/favicon.ico", handle204);          // not available, send 204
  server.onNotFound(handleNotFound);             // show a typical HTTP Error 404 page
  server.begin();                                // start the webserver
  Serial.println(F("HTTP server started\n"));

  //ArduinoOTASetup();
}

/* *******************************************************************
         M A I N L O O P
 ********************************************************************/

void loop(void) {

  aufZuGaragenTor   = digitalRead(pinStatusGargentor);
  aufZuWerkstattTor = digitalRead(pinStatuswerkstattor);
  aufZuKellerTor    = digitalRead(pinStatuskellertor);

  server.handleClient();               // call the webserver
  ArduinoOTA.handle();                 // OTA Upload via ArduinoIDE
  // do your calculation, sensor readings and update your global variables


  // add displays, serial outputs here
}

/* *******************************************************************
   Example board setting
   use this as base for your own setting
   Controller:   should be compatible with ESP32 and ESP8266
   Description:  Describe the board you have

   Amazon:       paste a link where you have bought it or a link to a datasheet
   Aliexpress:

  ********************************************************************/


/* *******************************************************************
   Webserver

   How it all works together:

   page   0.htm         includes the f.css in the header
          1.htm         just another page
   css    f.css         a css stylesheet for all on flash (program) memory
   ***************************************************************** */

// the html output
// Advice: check your generated HTML output if it is valid HTML: https://validator.w3.org
// *** HOME ***  0.htm
void handlePage() {
  String message;

  message =  F("<!DOCTYPE html>\n"
               "<html lang='en'>\n"   // english or any other language code you using for your page content
               "<head>\n"
               "<title>" TXT_BOARDNAME " - Board " );
  message += USE_BOARD;
  message += F("</title>\n"
               "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n"
               "<meta name=\"viewport\" content=\"width=device-width\">\n"
               "<link rel='stylesheet' type='text/css' href='f.css'>\n"
               "</head>\n");
  message += F("<body>\n");
  message += F("<header>\n<h1>" TXT_BOARDNAME " - Board " );
  message += USE_BOARD;
  message += F("</h1>\n"
               "<nav><p><a href=\"/\">[Home]</a> <a href=\"1.htm\">[More]</a></nav>\n"
               "</header>\n"
               "<main>\n");
  /*
    message += F("<article>\n"
                 "<h2>Values</h2>\n"
                 "<p>The integer variable  is currently: ");
    message += anInteger;
    message += F("</p>\n");
    message += F("<p>The float variable is currently: ");
    message += aFloat;
    message += F("</p>\n");
    message += F("</article>\n");

  */

  // print whatever you need on the web page:
  message += F("<article>\n"
               "<h2>Türenstatus</h2>\n");

  message += F("<p>Garagentür: ");

  if (aufZuGaragenTor == HIGH) {
    message += F("offen");
  }
  else {
    message += F("geschlossen");
  }
  message += F("</p>\n");


  message += F("<p>Werkstatt-Tor: ");
  if (aufZuWerkstattTor == HIGH) {
    message += F("offen");
  }
  else {
    message += F("geschlossen");
  }
  message += F("</p>\n");


  message += F("<p>Keller-Tor: ");
  if (aufZuKellerTor == HIGH) {
    message += F("offen");
  }
  else {
    message += F("geschlossen");
  }
  message += F("</p>\n");

  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__) );  

  message += F("<article>\n"
               "<h2>Quellcode</h2>\n");

  message += F("<p>Code running comes from file ");
  message += F(__FILE__);
  message += F("  compiled ");
  message += F("\n");
  message += F(__DATE__);
  message += F(" ");
  message += F(__TIME__);  
  message += F("</p>\n");

  message += F("</article>\n");
  // end of content
  message += F("</main>\n");
  // a footer line
  message += F("<footer>\n"
               "<p>Running since:");
  message += millis() / 1000;
  message += F(" seconds<p>\n"
               "</footer>\n");

  server.send(200, "text/html", message);
}

// *** Other ***  1.htm
// just some basic examples
void handlePage1() {
  String message;

  message =  F("<!DOCTYPE html>\n"
               "<html lang='en'>\n"   // english or any other language code you using for your page content
               "<head>\n"
               "<title>" TXT_BOARDNAME " - Board " );
  message += USE_BOARD;
  message += F("</title>\n"
               "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n"
               "<meta name=\"viewport\" content=\"width=device-width\">\n"
               "<link rel='stylesheet' type='text/css' href='f.css'>\n"
               "</head>\n");
  message += F("<body>\n");
  message += F("<header>\n<h1>" TXT_BOARDNAME " - Board " );
  message += USE_BOARD;
  message += F("</h1>\n"
               "<nav><p><a href=\"/\">[Home]</a> <a href=\"1.htm\">[More]</a></nav>\n"
               "</header>\n"
               "<main>\n");

  // print whatever you need on the web page:
  message += F("<article>\n"
               "<h2>Comments</h2>\n"
               "<p>This is just a simple Demo of a Webserver running on an ESP32 or ESP8266. "
               "Give your webpage a well definied structure. Put the content in 'main'. </p>"
               "<p>Style your webpage with CSS. Avoid using inline styles. "
               "</p>\n");
  message += F("</article>\n");

  // end of content
  message += F("</main>\n");
  // a footer line
  message += F("<footer>\n"
               "<p>Running since:");
  message += millis() / 1000;
  message += F("<p>\n"
               "</footer>\n");

  server.send(200, "text/html", message);
}

void handleCss() {
  // output of stylesheet
  // this is a straight forward example how to generat a static page from program memory
  String message;
  message = F("*{font-family:sans-serif}\n"
              "body{margin:10px}\n"
              "h1, h2{color:white;background:#1279b1;text-align:center}\n"
              "h1{margin:1px;padding:5px;font-size:1.2em}\n"
              "main{text-align:center}\n"
              "nav{background-color:silver;margin:1px;padding:5px;font-size:0.8em}\n"
              "article{margin:0.2em;padding:0.1em;border-style:solid;border-width:thin;border-color:#C0C0C0;text-align:center;background-color:#E5E5E5}\n"
              "footer p{font-size:0.7em;color:dimgray;background:silver;text-align:center;margin-bottom:5px}\n"
             );
  server.send(200, "text/css", message);
}

// Output a "404 not found" page. It includes the parameters which comes handy for test purposes.
void handleNotFound() {
  Serial.println(F("D124 handleNotFound()"));
  String message;
  message += F("404 - File Not Found\n"
               "URI: ");
  message += server.uri();
  message += F("\nMethod: ");
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += F("\nArguments: ");
  message += server.args();
  message += F("\n");
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

// Output a "204 no content" page. Used for the favicon.ico request (as we don't have any favicon currently)
void handle204() {
  server.send(204);                // this page doesn't send back content
}