#include #include #include #include #include "WebServer.h" #include const IPAddress apIP(192, 168, 4, 1); const char* apSSID = "M5STACK_SETUP"; boolean settingMode; String ssidList; String wifi_ssid; String wifi_password; // DNSServer dnsServer; WebServer webServer(80); // wifi config store Preferences preferences; void setup() { m5.begin(); M5.Power.begin(); preferences.begin("wifi-config"); delay(10); if (restoreConfig()) { if (checkConnection()) { settingMode = false; startWebServer(); return; } } settingMode = true; setupMode(); } void loop() { if (settingMode) { } webServer.handleClient(); } boolean restoreConfig() { wifi_ssid = preferences.getString("WIFI_SSID"); wifi_password = preferences.getString("WIFI_PASSWD"); Serial.print("WIFI-SSID: "); M5.Lcd.print("WIFI-SSID: "); Serial.println(wifi_ssid); M5.Lcd.println(wifi_ssid); Serial.print("WIFI-PASSWD: "); M5.Lcd.print("WIFI-PASSWD: "); Serial.println(wifi_password); M5.Lcd.println(wifi_password); WiFi.begin(wifi_ssid.c_str(), wifi_password.c_str()); if(wifi_ssid.length() > 0) { return true; } else { return false; } } boolean checkConnection() { int count = 0; Serial.print("Waiting for Wi-Fi connection"); M5.Lcd.print("Waiting for Wi-Fi connection"); while ( count < 30 ) { if (WiFi.status() == WL_CONNECTED) { Serial.println(); M5.Lcd.println(); Serial.println("Connected!"); M5.Lcd.println("Connected!"); return (true); } delay(500); Serial.print("."); M5.Lcd.print("."); count++; } Serial.println("Timed out."); M5.Lcd.println("Timed out."); return false; } void startWebServer() { if (settingMode) { Serial.print("Starting Web Server at "); M5.Lcd.print("Starting Web Server at "); Serial.println(WiFi.softAPIP()); M5.Lcd.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", []() { String ssid = urlDecode(webServer.arg("ssid")); Serial.print("SSID: "); M5.Lcd.print("SSID: "); Serial.println(ssid); M5.Lcd.println(ssid); String pass = urlDecode(webServer.arg("pass")); Serial.print("Password: "); M5.Lcd.print("Password: "); Serial.println(pass); M5.Lcd.println(pass); Serial.println("Writing SSID to EEPROM..."); M5.Lcd.println("Writing SSID to EEPROM..."); // Store wifi config Serial.println("Writing Password to nvr..."); M5.Lcd.println("Writing Password to nvr..."); preferences.putString("WIFI_SSID", ssid); preferences.putString("WIFI_PASSWD", pass); Serial.println("Write nvr done!"); M5.Lcd.println("Write nvr 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)); delay(3000); 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 "); M5.Lcd.print("Starting Web Server at "); Serial.println(WiFi.localIP()); M5.Lcd.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", []() { // reset the wifi config preferences.remove("WIFI_SSID"); preferences.remove("WIFI_PASSWD"); String s = "

Wi-Fi settings was reset.

Please reset device.

"; webServer.send(200, "text/html", makePage("Reset Wi-Fi Settings", s)); delay(3000); ESP.restart(); }); } webServer.begin(); } void setupMode() { WiFi.mode(WIFI_MODE_STA); WiFi.disconnect(); delay(100); int n = WiFi.scanNetworks(); delay(100); Serial.println(""); M5.Lcd.println(""); for (int i = 0; i < n; ++i) { ssidList += ""; } delay(100); WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); WiFi.softAP(apSSID); WiFi.mode(WIFI_MODE_AP); // WiFi.softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); // WiFi.softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0); // dnsServer.start(53, "*", apIP); startWebServer(); Serial.print("Starting Access Point at \""); M5.Lcd.print("Starting Access Point at \""); Serial.print(apSSID); M5.Lcd.print(apSSID); Serial.println("\""); M5.Lcd.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; }