Browse Source

Ajout gestion reconnexion en cas de coupure wifi

master
scayac 3 weeks ago
parent
commit
ffbcde7229
  1. 9
      README.md
  2. 56
      src/main.cpp

9
README.md

@ -11,6 +11,11 @@ Application ESP32 pour contrôler intelligemment un chauffe-eau avec l'excédent @@ -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`. @@ -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) @@ -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

56
src/main.cpp

@ -17,6 +17,15 @@ String wifiSSID; @@ -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() { @@ -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() { @@ -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() { @@ -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();

Loading…
Cancel
Save