commit dfdee158883bb7c6a3460bc10bba3fbc8f157075 Author: Денис Кузнецов Date: Wed Jun 26 10:58:49 2024 +0300 1 diff --git a/Test_setup_01.ino b/Test_setup_01.ino new file mode 100644 index 0000000..903b973 --- /dev/null +++ b/Test_setup_01.ino @@ -0,0 +1,232 @@ +#include +#include +#include +#include +#include + +const IPAddress apIP(192, 168, 1, 1); +const char* apSSID = "ESP8266_SETUP"; +boolean settingMode; +String ssidList; + +DNSServer dnsServer; +ESP8266WebServer webServer(80); + +void setup() { + Serial.begin(115200); + EEPROM.begin(512); + delay(10); + if (restoreConfig()) { + if (checkConnection()) { + settingMode = false; + startWebServer(); + return; + } + } + settingMode = true; + setupMode(); +} + +void loop() { + if (settingMode) { + dnsServer.processNextRequest(); + } + webServer.handleClient(); +} + +boolean restoreConfig() +{ + Serial.println("Reading EEPROM..."); + String ssid = ""; + String pass = ""; + if (EEPROM.read(0) != 0) + { + for (int i = 0; i < 32; ++i) + { + ssid += char(EEPROM.read(i)); + } + Serial.print("SSID: "); + Serial.println(ssid); + for (int i = 32; i < 96; ++i) + { + pass += char(EEPROM.read(i)); + } + Serial.print("Password: "); + Serial.println(pass); + WiFi.begin(ssid.c_str(), pass.c_str()); + return true; + } + else + { + Serial.println("Config not found."); + return false; + } +} + +boolean checkConnection() +{ + int count = 0; + Serial.print("Waiting for Wi-Fi connection"); + while ( count < 30 ) + { + if (WiFi.status() == WL_CONNECTED) + { + Serial.println(); + Serial.println("Connected!"); + return (true); + } + delay(500); + Serial.print("."); + count++; + } + Serial.println("Timed out."); + return false; +} + +void startWebServer() +{ + if (settingMode) + { + Serial.print("Starting Web Server at "); + Serial.println(WiFi.softAPIP()); + webServer.on("/settings", []() + { + String s = "

Wi-Fi Settings

Please enter your password by selecting the SSID.

"; + s += "

Password:
"; + webServer.send(200, "text/html", makePage("Wi-Fi Settings", s)); + }); + webServer.on("/setap", []() + { + for (int i = 0; i < 96; ++i) + { + EEPROM.write(i, 0); + } + String ssid = urlDecode(webServer.arg("ssid")); + Serial.print("SSID: "); + Serial.println(ssid); + String pass = urlDecode(webServer.arg("pass")); + Serial.print("Password: "); + Serial.println(pass); + Serial.println("Writing SSID to EEPROM..."); + for (int i = 0; i < ssid.length(); ++i) + { + EEPROM.write(i, ssid[i]); + } + Serial.println("Writing Password to EEPROM..."); + for (int i = 0; i < pass.length(); ++i) + { + EEPROM.write(32 + i, pass[i]); + } + EEPROM.commit(); + Serial.println("Write EEPROM done!"); + String s = "

Setup complete.

device will be connected to \""; + s += ssid; + s += "\" after the restart."; + webServer.send(200, "text/html", makePage("Wi-Fi Settings", s)); + ESP.restart(); + }); + webServer.onNotFound([]() + { + String s = "

AP mode

Wi-Fi Settings

"; + webServer.send(200, "text/html", makePage("AP mode", s)); + }); + } + else + { + Serial.print("Starting Web Server at "); + Serial.println(WiFi.localIP()); + webServer.on("/", []() + { + String s = "

STA mode

Reset Wi-Fi Settings

"; + webServer.send(200, "text/html", makePage("STA mode", s)); + }); + webServer.on("/reset", []() + { + for (int i = 0; i < 96; ++i) + { + EEPROM.write(i, 0); + } + EEPROM.commit(); + String s = "

Wi-Fi settings was reset.

Please reset device.

"; + webServer.send(200, "text/html", makePage("Reset Wi-Fi Settings", s)); + }); + } + webServer.begin(); +} + +void setupMode() +{ + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + delay(100); + int n = WiFi.scanNetworks(); + delay(100); + Serial.println(""); + for (int i = 0; i < n; ++i) + { + ssidList += ""; + } + delay(100); + WiFi.mode(WIFI_AP); + WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); + WiFi.softAP(apSSID); + dnsServer.start(53, "*", apIP); + startWebServer(); + Serial.print("Starting Access Point at \""); + Serial.print(apSSID); + Serial.println("\""); +} + +String makePage(String title, String contents) +{ + String s = ""; + s += ""; + s += ""; + s += title; + s += ""; + s += contents; + s += ""; + return s; +} + +String urlDecode(String input) +{ + String s = input; + s.replace("%20", " "); + s.replace("+", " "); + s.replace("%21", "!"); + s.replace("%22", "\""); + s.replace("%23", "#"); + s.replace("%24", "$"); + s.replace("%25", "%"); + s.replace("%26", "&"); + s.replace("%27", "\'"); + s.replace("%28", "("); + s.replace("%29", ")"); + s.replace("%30", "*"); + s.replace("%31", "+"); + s.replace("%2C", ","); + s.replace("%2E", "."); + s.replace("%2F", "/"); + s.replace("%2C", ","); + s.replace("%3A", ":"); + s.replace("%3A", ";"); + s.replace("%3C", "<"); + s.replace("%3D", "="); + s.replace("%3E", ">"); + s.replace("%3F", "?"); + s.replace("%40", "@"); + s.replace("%5B", "["); + s.replace("%5C", "\\"); + s.replace("%5D", "]"); + s.replace("%5E", "^"); + s.replace("%5F", "-"); + s.replace("%60", "`"); + return s; +}