#include "Arduino.h" #include #include #include #include const int ledPin = LED_BUILTIN; // The built-in LED on the Wemos D1 Mini is on GPIO2 (D4) ESP8266WebServer webServer(80); WiFiServer server(1234); DNSServer dnsServer; const byte DNS_PORT = 53; // AP Daten const char *ap_ssid = "Wemos_Setup"; const char *ap_pass = "admin123"; // WLAN Config struct Config { char ssid[32]; char pass[64]; bool valid; }; Config config; // ---------- EEPROM ---------- void saveConfig() { EEPROM.begin(sizeof(Config)); EEPROM.put(0, config); EEPROM.commit(); } void loadConfig() { EEPROM.begin(sizeof(Config)); EEPROM.get(0, config); if (config.valid != true) { config.valid = false; } } // ---------- CAPTIVE PORTAL PAGE ---------- void handleRoot() { String mac = WiFi.macAddress(); String html = R"rawliteral( Wemos Setup

Wemos Setup

Device: )rawliteral" + mac + R"rawliteral(
Verbinde deinen Wemos mit einem WLAN Netzwerk
)rawliteral"; webServer.send(200, "text/html", html); } // ---------- SAVE ---------- void handleSave() { String ssid = webServer.arg("ssid"); String pass = webServer.arg("pass"); ssid.toCharArray(config.ssid, 32); pass.toCharArray(config.pass, 64); config.valid = true; saveConfig(); webServer.send(200, "text/html", "

Gespeichert!

Wemos startet neu...

"); delay(1500); ESP.restart(); } // ---------- NOT FOUND (CAPTIVE REDIRECT) ---------- void handleNotFound() { webServer.sendHeader("Location", "http://192.168.4.1/", true); webServer.send(302, "text/plain", ""); } // ---------- START ACCESS POINT ---------- void startAP() { WiFi.mode(WIFI_AP); WiFi.softAP(ap_ssid, ap_pass); delay(500); IPAddress apIP = WiFi.softAPIP(); Serial.print("AP IP: "); Serial.println(apIP); // DNS: ALLE Domains auf ESP IP umleiten dnsServer.start(DNS_PORT, "*", apIP); // Webserver Routes webServer.on("/", handleRoot); webServer.on("/save", HTTP_POST, handleSave); webServer.onNotFound(handleNotFound); webServer.begin(); Serial.println("Captive Portal gestartet"); } // ---------- CONNECT STA ---------- bool connectSTA() { WiFi.mode(WIFI_STA); WiFi.begin(config.ssid, config.pass); Serial.println(); Serial.print("Verbinde mit WLAN: "); Serial.println(config.ssid); int tries = 0; while (WiFi.status() != WL_CONNECTED && tries < 20) { delay(500); Serial.print("."); tries++; } if (WiFi.status() == WL_CONNECTED) { Serial.println(); Serial.println("\nVerbunden!"); Serial.print("IP: "); Serial.println(WiFi.localIP()); server.begin(); Serial.println("TCP Server gestartet auf Port 1234"); return true; } return false; } // ---------- SETUP ---------- void setup() { Serial.begin(115200); loadConfig(); if (config.valid && connectSTA()) { Serial.println("STA Mode aktiv"); } else { Serial.println(); Serial.println(); Serial.println("Starte Captive Portal"); startAP(); } } // ---------- LOOP ---------- void loop() { if (WiFi.getMode() == WIFI_AP) { dnsServer.processNextRequest(); webServer.handleClient(); return; } webServer.handleClient(); // optional auch im STA Mode WiFiClient client = server.available(); if (!client) { return; } Serial.println("Client verbunden"); client.println("Connected"); while (client.connected()) { if (!client.available()) { delay(1); continue; } String msg = client.readStringUntil('\n'); msg.trim(); Serial.print("Empfangen: "); Serial.println(msg); client.println("ACK: " + msg); if (msg.equalsIgnoreCase("/ledOn")) { digitalWrite(ledPin, LOW); } if (msg.equalsIgnoreCase("/ledOff")) { digitalWrite(ledPin, HIGH); } if (msg.equalsIgnoreCase("quit")) { break; } } client.stop(); Serial.println("Client getrennt"); }