Update: 2024-01-28

Solltest du den Login Manager ohne den Spiffs Datei Manager verwenden wollen musst du Zeile 91 und 93 auskommentieren.

Esp32 Connect Login Manager mit optischer Anzeige als Arduino Tab.

Connect.ino

// ****************************************************************
// Sketch Esp32 Login Manager Modular(Tab) mit optischer Anzeige
// created: Jens Fleischer, 2018-10-30
// last mod: Jens Fleischer, 2024-01-28
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp32
// Software: Esp32 Arduino Core 1.0.4 - 2.0.14
// Getestet auf: ESP32 NodeMCU-32s
/******************************************************************
  Copyright (c) 2018 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Diese Version von Login Manager sollte als Tab eingebunden werden.
// #include <SPIFFS.h> #include <WebServer.h> müssen im Haupttab aufgerufen werden
// Die Funktionalität des ESP32 Webservers ist erforderlich.
// Die Funktion "Connect();" muss im Setup eingebunden werden.
// Die Oneboard LED leuchtet im AP Modus dauerhaft.
// Die Funktion "reStation()" sollte in der "loop" aufrufen.
/**************************************************************************************/
const char HTML1[] PROGMEM = "<!DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name='viewport' content='width=device-width, initial-scale=1'>";
const char HTML2[] PROGMEM = "<style>button,input{padding:.5em 2em}body{background:#a9a9a9}</style><title>Login Manager</title></head><body><h2>SSID Passwort\
</h2><form action='/' method='post'><p><label>SSID:<br><input name='ssid' placeholder='Name vom Netzwerk' required></label></p><p><label>Passwort:<br><input \
name='passwort' pattern='[!-~]{8,64}' placeholder='PW vom Netzwerk' required></label></p><button>Absenden</button></form></body></html>";
const char HTML3[] PROGMEM = "</head><body style ='background: #a9a9a9'><h3> Ihre Eingaben wurden erfolgreich übertragen. Der Server wird neu gestartet. </h3>";
const char HTML4[] PROGMEM = "<title>Verbunden</title></head><body style='background: #a9a9a9'><center><h2>Erfolgreich angemeldet!</h2><p>Super</p></center>";

char ssid[33] {" "};
char password[65];
constexpr char key {129};

void Connect() {
  SPIFFS.begin(true);
  uint8_t i {0};
  File file = SPIFFS.open("/credentials.dat", "r");
  if (file) {
    file.read(reinterpret_cast<uint8_t*>(&ssid), sizeof(ssid));
    file.read(reinterpret_cast<uint8_t*>(&password), sizeof(password));
    file.close();
    for (auto &c : ssid) c ^= key;                             // Dechiffrierung SSID
    for (auto &c : password) c ^= key;                         // Dechiffrierung Passwort
  }
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);                                         //Stationst-Modus --> Esp32 im Heimnetzwerk einloggen
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {                      // Led blinkt während des Verbindungsaufbaus
    pinMode(LED_BUILTIN, OUTPUT);                              // OnBoardLed Esp32 DevModule
    digitalWrite(LED_BUILTIN, 1);
    delay(500);
    digitalWrite(LED_BUILTIN, 0);
    delay(500);
    DEBUG_F(" % i sek\n", ++i);
    if (WiFi.status() != WL_CONNECTED && i > 20) {             // Ist der Router nicht erreichbar, wird ein eigenes Netzwerk erstellt.
      digitalWrite(LED_BUILTIN, 1);                            // Dauerleuchten der Led zeigt den AP Modus an.
      if (WiFi.softAP("EspConfig")) {                          // Soft-Access-Point-Modus --> Access-Point Adresse http://192.168.4.1/
        DEBUG_F("Verbinde dich mit dem Netzwerk \"EspConfig\"\nGib die IP %s im Browser ein\n\n", WiFi.softAPIP().toString().c_str());
      }
      break;
    }
  }
  if (WiFi.status() == WL_CONNECTED) {
    digitalWrite(LED_BUILTIN, 0);
    DEBUG_F("\nVerbunden mit: %s\nEsp32 IP: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
  }
  server.on("/", HTTP_GET, handleRoot);
  server.on("/", HTTP_POST, handleConfig);
}

void handleConfig() {
  if (server.hasArg("ssid") && server.hasArg("passwort")) {
    strcpy(ssid, server.arg(0).c_str());
    strcpy(password, server.arg(1).c_str());
    for (auto &c : ssid) c ^= key;                             // Chiffrierung SSID
    for (auto &c : password) c ^= key;                         // Chiffrierung Passwort
    File file = SPIFFS.open("/credentials.dat", "w");
    file.write(reinterpret_cast<uint8_t*>(&ssid), sizeof(ssid));
    file.write(reinterpret_cast<uint8_t*>(&password), sizeof(password));
    file.close();
    server.send(200, "text/html", (String)HTML1 + HTML3);
    delay(500);
    Connect();
  }
}

void handleRoot() {                                            // Html Startseite
  if (WiFi.status() != WL_CONNECTED) {
    server.send(200, "text/html", (String)HTML1 + HTML2);      // besteht keine Verbindung zur Station wird HTML2 gesendet
  }
  else {
    if (!handleFile(server.urlDecode(server.uri()))) {         // index.html aus Spiffs senden   // ohne "spiffs.ino" Zeile auskommentieren
      server.send(200, "text/html", (String)HTML1 + HTML4);    // existiert keine index.html wird HTML4 gesendet
    }                                                                                            // ohne "spiffs.ino" Zeile auskommentieren
  }
}

void reStation() {                                             // der Funktionsaufruf "reStation();" sollte im "loop" stehen
  static unsigned long letzteMillis = 0;                       // nach Stromausfall startet der Esp.. schneller als der Router
  unsigned long aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 3e5) {                  // im AP Modus aller 5 Minuten prüfen ob der Router verfügbar ist
    if (WiFi.status() != WL_CONNECTED) Connect();
    letzteMillis = aktuelleMillis;
  }
}