#include #include #include #include const byte DNS_PORT = 53; DNSServer dnsServer; WebServer server(80); Preferences prefs; IPAddress apIP(192,168,4,1); const char* AP_SSID = "ESP32_Portal"; String wifi_ssid; String wifi_pass; void handleRoot() { server.send(200, "text/html", "WiFi Setup"); } void handleSave() { wifi_ssid = server.arg("ssid"); wifi_pass = server.arg("pass"); // Save credentials prefs.begin("wifi", false); prefs.putString("ssid", wifi_ssid); prefs.putString("pass", wifi_pass); prefs.end(); server.send(200, "text/html", "Saved. Connecting..."); WiFi.softAPdisconnect(true); WiFi.mode(WIFI_STA); WiFi.begin(wifi_ssid.c_str(), wifi_pass.c_str()); } void handleNotFound() { server.sendHeader("Location", "/", true); server.send(302, "text/plain", ""); } void startPortal() { WiFi.mode(WIFI_AP); WiFi.softAP(AP_SSID); WiFi.softAPConfig(apIP, apIP, IPAddress(255,255,255,0)); dnsServer.start(DNS_PORT, "*", apIP); server.on("/", handleRoot); server.on("/save", HTTP_POST, handleSave); server.onNotFound(handleNotFound); server.begin(); } void connectWiFi() { prefs.begin("wifi", true); wifi_ssid = prefs.getString("ssid", ""); wifi_pass = prefs.getString("pass", ""); prefs.end(); if (wifi_ssid == "") return; WiFi.mode(WIFI_STA); WiFi.begin(wifi_ssid.c_str(), wifi_pass.c_str()); unsigned long start = millis(); while (WiFi.status() != WL_CONNECTED && millis() - start < 15000) { delay(500); } } void setup() { Serial.begin(115200); connectWiFi(); if (WiFi.status() != WL_CONNECTED) { Serial.println("Starting captive portal"); startPortal(); } else { Serial.println("Connected to WiFi"); Serial.println(WiFi.localIP()); } } void loop() { dnsServer.processNextRequest(); server.handleClient(); }