2018-09-16

Esp8266 Connect Login Manager mit optischer Anzeige als Arduino Tab.

Die Spiffs.ino ist zum ausführen der Connect.ino erforderlich.
Solltest du den Login Manager ohne den Spiffs Datei Manager verwenden wollen musst du Zeile 95 und 97 auskommentieren.

Connect.ino

// ****************************************************************
// Sketch Esp8266 Login Manager Modular(Tab) mit optischer Anzeige
// created: Jens Fleischer, 2018-08-15
// last mod: Jens Fleischer, 2018-09-16
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266
// Getestet auf: Nodemcu, Wemos D1 Mini Pro
/******************************************************************
  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 "FS.h" #include <ESP8266WebServer.h> müssen im Haupttab aufgerufen werden
// Die Funktionalität des ESP8266 Webservers ist erforderlich.
// Die Funktion "Connect();" muss im Setup eingebunden werden.
// Die Oneboard LED leuchtet im AP Modus dauerhaft.
/**************************************************************************************/

const char HTML1[] PROGMEM = "<!DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name=viewport content='width=device-width, initial-scale=1.0,'>\
<style>button{width:120px;height:30px}body{background: #87cefa;}</style><title>Login Manager</title><SCRIPT>window.addEventListener('load',function(){document.\
querySelector('button').addEventListener('click',function(){var elem = document.querySelector('form');if(elem.checkValidity()&&document.querySelector('[pattern]')\
.checkValidity()){fetch('/',{method:'post',body:new FormData(elem)}).then(function(response){return response.text()}).then(function(text){document.querySelector\
('body').innerHTML = text})}})});</SCRIPT></head><body><h2>SSID Passwort</h2><form><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 type='button'>Absenden\
</button></form></body></html>";
const char HTML2[] PROGMEM = "<h3> Ihre Eingaben wurden erfolgreich übertragen. Der Server wird nun neu gestartet. </h3>";
const char HTML3[] PROGMEM = "<!DOCTYPE html><html lang='de'><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>\
<title>Verbunden</title></style><link rel='stylesheet' href='style.css'></head><body><center><h2>Erfolgreich angemeldet!</h2><p>Super</p></center></body></html>";

char ssid[33] = "XXX";
char password[65];

void Connect() {
  uint8_t i = 0;
  File file = SPIFFS.open("/login.txt", "r");
  if (file) {
    file.readBytesUntil('\n', ssid, sizeof(ssid));
    file.readBytesUntil('\n', password, sizeof(password));
    file.close();
  }
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);                          //Stationst-Modus --> Esp8266 im Heimnetzwerk einloggen
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {       // Led blinkt während des Verbindungsaufbaus
    pinMode(LED_BUILTIN, OUTPUT);               // OnBoardLed Nodemcu, Wemos D1 Mini Pro
    digitalWrite(LED_BUILTIN, 0);
    delay(500);
    digitalWrite(LED_BUILTIN, 1);
    delay(500);
    i++;
    Serial.printf(" % i sek\n", i);
    if (WiFi.status() == WL_NO_SSID_AVAIL || i > 30) {  // Ist die oben eingegebene SSID nicht erreichbar, wird ein eigenes Netzwerk erstellt.
      digitalWrite(LED_BUILTIN, 0);                     // Dauerleuchten der Led zeigt den AP Modus an.
      WiFi.disconnect();
      WiFi.mode(WIFI_AP);                               // Soft-Access-Point-Modus --> Access-Point Adresse http://192.168.4.1/
      Serial.println("\nStarte Soft AP");
      if (WiFi.softAP("EspConfig")) {
        Serial.printf("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) {
    Serial.printf("\nVerbunden mit: %s\nEsp8266 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")) {
    File file = SPIFFS.open("/login.txt", "w");
    file.printf("%s\n%s", server.arg(0).c_str(), server.arg(1).c_str());
    file.close();
    server.send(200, "text/html", HTML2);
    delay(500);
    Connect();
  }
}

void handleRoot() {                                     // Html Startseite
  if (WiFi.status() != WL_CONNECTED) {
    server.send(200, "text/html", HTML1);               // besteht keine Verbindung zur Station wird HTML1 gesendet
  }
  else {
    if (!handleFile(server.urlDecode(server.uri()))) {  // befindet sich eine index.html im Spiffs wird diese gesendet   // ohne "spiffs.ino" Zeile auskommentieren
      server.send(200, "text/html", HTML3);             // existiert keine index.html wird HTML3 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();              // im AP Modus aller 5 Minuten prüfen ob der Router verfügbar ist
  if (aktuelleMillis - letzteMillis >= 3e5) {
    if (WiFi.status() != WL_CONNECTED) Connect();
    letzteMillis = aktuelleMillis;
  }
}
  

Zurück