wemos D1 Mini Pro WLAN Einstellungen ohne Programmierung durchführen

Hallo!
Ich habe hier einen Wemod D1 Mini Pro den ich mit dem WLAN verbinde.
Die Einstellungen für das WLAN habe ich direkt im Code

const char* ssid = "ssid"; //WLAN Netzwerk
const char* password = "passwort";    //WLAN Passwort

void setup() {
  Serial.begin(74880);
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println("Connecting");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
  }
  Serial.println("Connected");
  delay(1000);
}

Wenn ich das WLAN ändern möchte muss ich den wemos immer neu programmieren.
Daher wollte ich fragen, ob es eine Möglichkeit gibt, dass ich den WLAN Zugang auch irgenwie dynamisch über einen anderen Computer oder über das Netzwerk oder ähnliches ändern könnte.

Vielen Dank für jede Antwort.

haiflosse:
Daher wollte ich fragen, ob es eine Möglichkeit gibt, dass ich den WLAN Zugang auch irgenwie dynamisch über einen anderen Computer oder über das Netzwerk oder ähnliches ändern könnte.

Ja.

Beispiel: Esp8266 Login Manager Tab

Gruß Fips

Vielen Dank für die Antwort.
Ich habe folgendes bei meinem bestehenden Sketch versucht.

  1. neuen Tab erstellt und den Code von Connect eingefügt
  2. bei meinem Code habe ich folgendes oben eingebunden:
 #include <FS.h> 
 #include <ESP8266WebServer.h>
  1. Ich habe meine WLAN Verbindungen im Haupt Tab deaktiviert
//const char* ssid = "ssid"; //WLAN Netzwerk
//const char* password = "Password";    //WLAN Passwort
/*
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
  }
  */
  1. Zeile 95 und 97 habe ich im Tab connect vorerst einmal deaktiviert, da ich dies noch nicht verstehe.
  2. Danach habe ich eine Überprüfung durchgeführt und bekomme folgene Meldung:

Arduino: 1.8.13 (Windows 10), Board: "LOLIN(WEMOS) D1 mini Pro, 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 16MB (FS:14MB OTA:~1019KB), v2 Lower Memory, Disabled, None, Only Sketch, 921600"

D:\eigene dateien\projekte\wassersensor\Harald_Zisterne\zisterne2\connect.ino: In function 'void Connect()':

connect:76:3: error: 'server' was not declared in this scope

server.on("/", HTTP_GET, handleRoot);

^

D:\eigene dateien\projekte\wassersensor\Harald_Zisterne\zisterne2\connect.ino: In function 'void handleConfig()':

connect:81:7: error: 'server' was not declared in this scope

if (server.hasArg("ssid") && server.hasArg("passwort")) {

^

D:\eigene dateien\projekte\wassersensor\Harald_Zisterne\zisterne2\connect.ino: In function 'void handleRoot()':

connect:93:5: error: 'server' was not declared in this scope

server.send(200, "text/html", HTML1); // besteht keine Verbindung zur Station wird HTML1 gesendet

^

connect:97:7: error: 'server' was not declared in this scope

server.send(200, "text/html", HTML3); // existiert keine index.html wird HTML3 gesendet

^

exit status 1

'server' was not declared in this scope


Ich habe dazu noch einige Verständnisfragen.
Wenn das Programmieren funktioniert, wie kann ich dann diese Webseite aufrufen bzw. wie lautet die URL?

Wie kann ich dann die gespeicherten bzw. dort eingegebenen Logindaten in Zukunft dauerhaft im Haupttab verwenden?

Ich verwende im Haupttab auch einen Deepsleep für 60 Minuten. Ist dies kein Problem?

Danke für eine weitere Unterstützung.

"ESP8266WebServer server(80);" hast du drin?

Gruß Fips

Du solltest schon exakt nach der Beschreibung von Fips vorgehen, dann funktioniert es auch.

Danach kannst du deine nötigen Anpassungen vornehmen.

haiflosse:
Wenn das Programmieren funktioniert, wie kann ich dann diese Webseite aufrufen bzw. wie lautet die URL?

Bei WiFi.mode(WIFI_STA); verbindet sich der ESP mit dem Router, der dem ESP eine IP zuweist, bei mir 192.168.178.34. Im seriellen Monitor wird diese IP angezeigt. Im Browser dann http://192.168.178.34 eingeben.

Wenn das Programmieren funktioniert, wie kann ich dann diese Webseite aufrufen bzw. wie lautet die URL?

Die URL werden im AP und STA Modus Seriell ausgegeben.

Wie kann ich dann die gespeicherten bzw. dort eingegebenen Logindaten in Zukunft dauerhaft im Haupttab verwenden?

Was hast du mit dem Passwort vor?

Ich verwende im Haupttab auch einen Deepsleep für 60 Minuten. Ist dies kein Problem?

Im AP Modus solltest du den nicht nutzen.

Gruß Fips

Danke für die Antworten.
Der Code funktioniert nun soweit, dass ich ihn auf den wemos übertragen kann.

D.h. mit Doku ist die ganze Seite https://fipsok.de/Esp8266-Webserver gemeint, oder gibt es da eine separate Seite oder Dokument?

Leider habe ich es nicht geschafft im Serial Monitor die IP auszugeben.
Ich habe dann versucht über den Advanced IP Scanner eine Ip Adresse zu finden. Ich habe auch zwei Einträge zu ESP gefunden:
ESP_F42A5C und ESP-D842D4. Aber über beide Ip Adresse habe ich keine Loginseite erhalten.

Den Deepsleep habe ich schon vesucht zu umgehen, solange keine Verbindung hergestellt ist, daher habe ich folgendes versucht:

if (!client.connect(host, 80)) {
    Serial.println("connection failed");
    
  } else {
  
  ESP.deepSleep(sleepSeconds * 1000000);
  }

Danach hört das blaue Lämpchen auf zu blinken, kann aber nicht sagen, ob das korrekt ist oder das blaue Lämpchen immer blinken muss.

Meine Idee ist mich einmal über eine URL die Wlan Daten einzugeben. Wenn diese eingegeben sind, sollen diese am wemos gespeichert bleiben und solange verwendet werden, bis ich wieder über die URL neue WLAN Daten eingebe.

Danke für eine weitere Hilfe.

Leider habe ich es nicht geschafft im Serial Monitor die IP auszugeben.

Die default IP vom AP ist "http://192.168.4.1".

Und der Tab gibt diese auch aus.

      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());
      }

D.h. mit Doku ist die ganze Seite https://fipsok.de/Esp8266-Webserver gemeint, oder gibt es da eine separate Seite oder Dokument?

Ich setze auf meiner Webseite gewisse Kentnisse mit dem Esp... vorraus.
Wenn dir der ein oder andere Satz zur Erklärung einfällt, schreibe ich das gerne mit hinzu.
Für mich ist es inzwischen nicht mehr so leicht es für Einsteiger zu beschreiben.

Gruß Fips

Danke für die Antwort.
Ich habe jetzt versucht mich zu den AP ESP-D842D4 und ESPConfig zu verbinden und habe dann versucht die IP Adresse http://192.168.4.1 aufzurufen. Leider bekomme ich keine Seite.

Leider bekomme ich im Serial Monitor nur die Ausgaben vom Haupttab. Wie kann ich mir die Meldungen vom Tab Connect ansehen?

Danke

haiflosse:
Leider bekomme ich im Serial Monitor nur die Ausgaben vom Haupttab. Wie kann ich mir die Meldungen vom Tab Connect ansehen?

// Die Funktion "Connect();" muss im Setup eingebunden werden.

Hast du das eventuell vergessen?

Gruß Fips

Danke für die Antwort.
Nein, habe ich im Haupttab unter Setup eingefügt.
lg

Hallo!
Habe Serial.begin(74880); erst danach gehabt. Ich habe die Reihenfolge vertauscht und habe nun folgende Meldung erhalten:
Starte Soft AP
Verbinde dich mit dem Netzwerk "EspConfig"
Gib die IP 192.168.4.1 im Browser ein

Wenn ich dies aber durchführe, wie ich schon geschreiben habe, bekomme ich leider keine Seite angezeigt.
lg

haiflosse:
Verbinde dich mit dem Netzwerk "EspConfig"
Gib die IP 192.168.4.1 im Browser ein

Wird das Netzwerk "EspConfig" an deinem Rechner/ Laptop angezeigt?

Gruß Fips

Ja

haiflosse:
Ja

Rechner/ Laptop mit dem Netzwerk "EspConfig"verbunden?

Gruß Fips

Derfips:
Wenn dir der ein oder andere Satz zur Erklärung einfällt, schreibe ich das gerne mit hinzu.

Als ich mich am Anfang durch Deine Tabs gekämpft habe, suchte ich auch nach einem Einführungstext, der die Idee hinter den Programmen verdeutlicht. Soll ich mal eine Vorlage versuchen?

haiflosse:
Ja

Im AP-Modus muß ich den ESP immer nach einem Programmstart mit meinem Läppi neu verbinden. Ob das normal ist, vermag ich nicht einzuschätzen. Du solltest es auf jeden Fall überprüfen.

agmue:
Soll ich mal eine Vorlage versuchen?

Gerne.

Gruß Fips

Vielen Dank für die Antworten.

Ich habe den Laptop neu gestartet und mich nur mit dem EspConfig WLAN Netz verbunden.
Ich kann die IP Adresse 192.168.4.1 anpingen. Wenn ich aber in einem Browser http://192.168.4.1 aufrufe bekomme ich leider keine Seite angezeigt.
Beim Wemos leuchtet ein baues Licht bei IO6.

Der Sketch im weiteren Tab sieht wie folgt aus:

// ****************************************************************
// Sketch Esp8266 Login Manager Modular(Tab) mit optischer Anzeige
// created: Jens Fleischer, 2018-08-15
// last mod: Jens Fleischer, 2019-01-22
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266
// Software: Esp8266 Arduino Core 2.4.2 / 2.5.2 / 2.6.3 / 2.7.1
// 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'>\
<style>button{width:120px;height:30px}body{background: #87cefa;}</style><title>Login Manager</title></head><body><h2>SSID Passwort</h2><form><p><label>SSID:
\
<input name='ssid' placeholder='Name vom Netzwerk' required></label></p><p><label>Passwort:
<input name='passwort' pattern='[!-~]{8,64}' placeholder='PW vom \
Netzwerk' required></label></p><button type='button'>Absenden</button></form><script>document.querySelector('button').addEventListener('click',() =>{var elem = \
document.querySelector('form');if(elem.checkValidity() && document.querySelector('[pattern]').checkValidity()){fetch('/',{method:'post',body:new FormData(elem)})\
.then(response =>{return response.text()}).then(text =>{document.body.innerHTML = text})}})</script></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'>\
<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;
  }
}

Hoffe es kann mir hier jemand noch weiterhelfen.
Vielen Dank

Den Webserver und die Sachen, die oben im Kommentar stehen, hast Du auch berücksichtigt?
Was sagt der serielle Monitor?

Gruß Tommy