diff --git a/firmware/clock_ntp_ota_v1.9/wifi_manager.cpp b/firmware/clock_ntp_ota_v1.9/wifi_manager.cpp index 114a954..17fbc4e 100644 --- a/firmware/clock_ntp_ota_v1.9/wifi_manager.cpp +++ b/firmware/clock_ntp_ota_v1.9/wifi_manager.cpp @@ -67,37 +67,42 @@ void ICACHE_FLASH_ATTR setupWiFi() { WiFi.hostname(config.hostname); WiFi.mode(WIFI_STA); - // Try 1: Use WiFi.begin() without params - uses SDK stored credentials - Serial.println("Trying SDK-stored credentials..."); - WiFi.begin(); + // Try 1: Use WiFi.begin() without params - only when no SSID is configured. + // Skipped if user has a saved SSID: SDK-cached credentials may include open + // networks (e.g. public hotspots) that would be preferred over the user's + // network, and a successful connect would overwrite config.ssid (issue #3). + if (strlen(config.ssid) == 0) { + Serial.println("No SSID configured, trying SDK-stored credentials..."); + WiFi.begin(); - // SYNCHRONOUS wait for connection (max 10 seconds) - Serial.print("Connecting to WiFi"); - int attempts = 0; - while (WiFi.status() != WL_CONNECTED && attempts < 20) { - showWiFiConnecting(attempts); - delay(500); - Serial.print("."); - attempts++; - } + // SYNCHRONOUS wait for connection (max 10 seconds) + Serial.print("Connecting to WiFi"); + int attempts = 0; + while (WiFi.status() != WL_CONNECTED && attempts < 20) { + showWiFiConnecting(attempts); + delay(500); + Serial.print("."); + attempts++; + } - if (WiFi.status() == WL_CONNECTED) { - Serial.println("\nWiFi connected!"); - Serial.print("SSID: "); - Serial.println(WiFi.SSID()); - Serial.print("IP: "); - Serial.println(WiFi.localIP()); - Serial.print("Gateway: "); - Serial.println(WiFi.gatewayIP()); - Serial.print("DNS: "); - Serial.println(WiFi.dnsIP()); + if (WiFi.status() == WL_CONNECTED) { + Serial.println("\nWiFi connected!"); + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + Serial.print("IP: "); + Serial.println(WiFi.localIP()); + Serial.print("Gateway: "); + Serial.println(WiFi.gatewayIP()); + Serial.print("DNS: "); + Serial.println(WiFi.dnsIP()); - safeStringCopy(WiFi.SSID(), config.ssid, sizeof(config.ssid)); - saveConfig(); + safeStringCopy(WiFi.SSID(), config.ssid, sizeof(config.ssid)); + saveConfig(); - showIP(); - wifiConnState = WIFI_CONN_CONNECTED; - return; + showIP(); + wifiConnState = WIFI_CONN_CONNECTED; + return; + } } // Try 2: If we have EEPROM credentials, try those @@ -105,7 +110,7 @@ void ICACHE_FLASH_ATTR setupWiFi() { Serial.println("\nTrying EEPROM credentials..."); WiFi.begin(config.ssid, config.password); - attempts = 0; + int attempts = 0; while (WiFi.status() != WL_CONNECTED && attempts < 20) { showWiFiConnecting(attempts); delay(500); diff --git a/src/clock_ntp_ota_v1.9.ino b/src/clock_ntp_ota_v1.9.ino index 9bb2180..5dece97 100644 --- a/src/clock_ntp_ota_v1.9.ino +++ b/src/clock_ntp_ota_v1.9.ino @@ -761,41 +761,42 @@ void ICACHE_FLASH_ATTR setupWiFi() { // STRATEGY: First try SDK-stored credentials (from WiFiManager), then EEPROM config // WiFiManager stores credentials in ESP flash separately from our EEPROM - // Try 1: Use WiFi.begin() without params - uses SDK stored credentials - Serial.println("Trying SDK-stored credentials..."); - WiFi.begin(); // Uses credentials stored by WiFiManager/SDK + // Try 1: Use WiFi.begin() without params - only when no SSID is configured. + // Skipped if user has a saved SSID: SDK-cached credentials may include open + // networks (e.g. public hotspots) that would be preferred over the user's + // network, and a successful connect would overwrite config.ssid (issue #3). + if (strlen(config.ssid) == 0) { + Serial.println("No SSID configured, trying SDK-stored credentials..."); + WiFi.begin(); - // SYNCHRONOUS wait for connection (max 10 seconds) - Serial.print("Connecting to WiFi"); - int attempts = 0; - while (WiFi.status() != WL_CONNECTED && attempts < 20) { - delay(500); - Serial.print("."); - showNumber(attempts, false); - attempts++; - } + // SYNCHRONOUS wait for connection (max 10 seconds) + Serial.print("Connecting to WiFi"); + int attempts = 0; + while (WiFi.status() != WL_CONNECTED && attempts < 20) { + delay(500); + Serial.print("."); + showNumber(attempts, false); + attempts++; + } - if (WiFi.status() == WL_CONNECTED) { - Serial.println("\n✅ WiFi connected!"); - Serial.print("SSID: "); - Serial.println(WiFi.SSID()); - Serial.print("IP: "); - Serial.println(WiFi.localIP()); - Serial.print("Gateway: "); - Serial.println(WiFi.gatewayIP()); - Serial.print("DNS: "); - Serial.println(WiFi.dnsIP()); + if (WiFi.status() == WL_CONNECTED) { + Serial.println("\n✅ WiFi connected!"); + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + Serial.print("IP: "); + Serial.println(WiFi.localIP()); + Serial.print("Gateway: "); + Serial.println(WiFi.gatewayIP()); + Serial.print("DNS: "); + Serial.println(WiFi.dnsIP()); - // Sync connected SSID to our config - safeStringCopy(WiFi.SSID(), config.ssid, sizeof(config.ssid)); - // Note: password stays in SDK storage, we don't have access to it - saveConfig(); + safeStringCopy(WiFi.SSID(), config.ssid, sizeof(config.ssid)); + saveConfig(); - // Show IP on display - showIP(); - - wifiConnState = WIFI_CONN_CONNECTED; - return; // Success! + showIP(); + wifiConnState = WIFI_CONN_CONNECTED; + return; + } } // Try 2: If we have EEPROM credentials, try those @@ -803,7 +804,7 @@ void ICACHE_FLASH_ATTR setupWiFi() { Serial.println("\nTrying EEPROM credentials..."); WiFi.begin(config.ssid, config.password); - attempts = 0; + int attempts = 0; while (WiFi.status() != WL_CONNECTED && attempts < 20) { delay(500); Serial.print(".");