#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); WebSocketsServer webSocket(81); 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(
👁
)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()); webServer.on("/", handleRoot); webServer.on("/save", HTTP_POST, handleSave); webServer.begin(); webSocket.begin(); webSocket.onEvent(webSocketEvent); Serial.println("WebSocket gestartet auf Port 81"); return true; } return false; } void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) { switch (type) { case WStype_CONNECTED: { IPAddress ip = webSocket.remoteIP(num); Serial.printf( "WS Client %u verbunden von %d.%d.%d.%d\n", num, ip[0], ip[1], ip[2], ip[3]); webSocket.sendTXT(num, "Connected"); break; } case WStype_DISCONNECTED: Serial.printf("WS Client %u getrennt\n", num); break; case WStype_TEXT: { String msg = String((char*) payload); Serial.print("WS empfangen: "); Serial.println(msg); if (msg == "/ledOn") { digitalWrite(ledPin, LOW); webSocket.sendTXT(num, "LED ON"); } else if (msg == "/ledOff") { digitalWrite(ledPin, HIGH); webSocket.sendTXT(num, "LED OFF"); } else { // webSocket.sendTXT(num, "ACK: " + msg); } break; } default: break; } } // ---------- SETUP ---------- void setup() { Serial.begin(115200); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); // LED zunächst AUS 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(); webSocket.loop(); }