From ffbcde7229b5605d016f77192620d13c654b09e1 Mon Sep 17 00:00:00 2001 From: scayac Date: Wed, 26 Aug 2026 08:36:34 +0200 Subject: [PATCH] Ajout gestion reconnexion en cas de coupure wifi --- README.md | 9 +++++++++ src/main.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 48bc1e9..acaaf68 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,11 @@ Application ESP32 pour contrôler intelligemment un chauffe-eau avec l'excédent - ✅ Mise à jour OTA du firmware et du filesystem via `/update.html` - ✅ Support ArduinoOTA pour mise à jour via l'IDE +### Connectivité WiFi +- ✅ Mode AP automatique si la connexion WiFi échoue au démarrage +- ✅ Reconnexion automatique toutes les 30s en mode STA si la connexion est perdue +- ✅ Depuis le mode AP (SSID configuré), tentative de reconnexion toutes les 5 minutes sans interrompre l'AP + ### Modes de Fonctionnement - **Mode OFF (0)**: Chauffe-eau désactivé - **Mode JOUR (2)**: Chauffe progressive pour atteindre la température maximale à l'heure cible @@ -34,6 +39,8 @@ La configuration se fait exclusivement via l'interface web à `/settings.html`. - **SSID et mot de passe** : Configurables via l'interface web - **Mot de passe AP** : Pour le mode Access Point (min 8 caractères) - **Mode AP automatique** : Si la connexion WiFi échoue, l'ESP32 démarre un point d'accès +- **Reconnexion automatique** : En mode STA, vérification toutes les 60s ; l'ESP32 relance `WiFi.reconnect()` si la connexion est perdue. `WiFi.setAutoReconnect(true)` gère également les micro-coupures. +- **Retour STA depuis AP** : Si un SSID est configuré et que l'ESP32 est en mode AP, une tentative de connexion STA est effectuée toutes les 5 minutes (mode `WIFI_AP_STA` pour ne pas couper l'AP). En cas de succès, l'ESP32 redémarre en mode STA. #### Authentification Web - **Utilisateur par défaut** : `admin` @@ -304,6 +311,8 @@ Timer PWM initialisé (100Hz) [ESPEASY] Température reçue: 48.5°C Enphase - Total: 1500.0W, Panneaux: 800.0W, Net: 700.0W [MODE] Mode changé via GET: 14 +[WIFI] Connexion perdue, tentative de reconnexion... +[WIFI] Connexion rétablie! IP: 192.168.0.29 [OTA] Mise à jour démarrée: firmware.bin [OTA] Espace sketch disponible [OTA] Mise à jour réussie: 1441792 octets diff --git a/src/main.cpp b/src/main.cpp index 3048b96..0fcce6b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,6 +17,15 @@ String wifiSSID; String wifiPassword; String apPassword = "123456"; +// Variables pour la reconnexion WiFi automatique +bool wifiAPMode = false; // true si démarré en mode Access Point +bool wifiReconnecting = false; // true pendant une tentative de reconnexion +unsigned long lastWifiReconnectAttempt = 0; // Timestamp de la dernière tentative +unsigned long wifiReconnectStartTime = 0; // Début de la tentative en cours +const unsigned long WIFI_RECONNECT_INTERVAL = 30000; // Intervalle en mode STA (60s) +const unsigned long WIFI_AP_RETRY_INTERVAL = 300000; // Intervalle depuis mode AP (5min) +const unsigned long WIFI_CONNECT_TIMEOUT = 15000; // Timeout de connexion (15s) + // Configuration de l'authentification String authUsername = "admin"; String authPasswordHash = ""; @@ -657,6 +666,7 @@ void setup() { // Connexion WiFi Serial.printf("Connexion à %s ", wifiSSID.c_str()); WiFi.mode(WIFI_STA); + WiFi.setAutoReconnect(true); WiFi.begin(wifiSSID.c_str(), wifiPassword.c_str()); int wifiRetry = 0; @@ -686,6 +696,7 @@ void setup() { Serial.println(apPassword); Serial.print("Adresse IP: "); Serial.println(WiFi.softAPIP()); + wifiAPMode = true; } else { Serial.println("Erreur lors du démarrage du mode AP"); } @@ -1632,7 +1643,50 @@ void loop() { // Gérer les requêtes ArduinoOTA ArduinoOTA.handle(); - + + // Reconnexion WiFi automatique (non-bloquant) + { + unsigned long wifiMillis = millis(); + if (wifiReconnecting) { + if (WiFi.status() == WL_CONNECTED) { + Serial.printf("[WIFI] Connexion rétablie! IP: %s\n", WiFi.localIP().toString().c_str()); + wifiReconnecting = false; + if (wifiAPMode) { + // Redémarrer pour passer proprement en mode STA + Serial.println("[WIFI] Redémarrage pour basculer en mode STA..."); + delay(500); + ESP.restart(); + } + } else if (wifiMillis - wifiReconnectStartTime >= WIFI_CONNECT_TIMEOUT) { + Serial.println("[WIFI] Timeout reconnexion"); + wifiReconnecting = false; + if (wifiAPMode) { + // Rétablir le mode AP seul + WiFi.mode(WIFI_AP); + WiFi.softAP(systemHostname.c_str(), apPassword.c_str()); + Serial.println("[WIFI] Retour mode AP"); + } + } + } else if (wifiSSID.length() > 0) { + if (!wifiAPMode && WiFi.status() != WL_CONNECTED && + wifiMillis - lastWifiReconnectAttempt >= WIFI_RECONNECT_INTERVAL) { + lastWifiReconnectAttempt = wifiMillis; + wifiReconnectStartTime = wifiMillis; + wifiReconnecting = true; + Serial.println("[WIFI] Connexion perdue, tentative de reconnexion..."); + WiFi.reconnect(); + } else if (wifiAPMode && + wifiMillis - lastWifiReconnectAttempt >= WIFI_AP_RETRY_INTERVAL) { + lastWifiReconnectAttempt = wifiMillis; + wifiReconnectStartTime = wifiMillis; + wifiReconnecting = true; + Serial.println("[WIFI] Mode AP: tentative de connexion au réseau configuré..."); + WiFi.mode(WIFI_AP_STA); + WiFi.begin(wifiSSID.c_str(), wifiPassword.c_str()); + } + } + } + // Calculer la puissance du chauffe-eau au début de chaque cycle PWM calculateHeaterPower();