🛠 Wi-Fi résilient, broche OFF et veille profonde
Objectifs
Rendre un projet WiFi autonome et robuste sur la GIGA R1 WiFi : machine à états de reconnexion avec backoff exponentiel, sauvegarde du contexte de réveil, et usage des deux broches d'alimentation documentées par Arduino — OFF (extinction matérielle, hard shutdown) et VRTC (RTC sauvegardé par pile). Vous verrez aussi les limites honnêtes de la consommation sur cette carte, pensée comme une station de performance et non comme un objet sur pile.
Matériel
- Carte Arduino GIGA R1 WiFi + antenne u.FL, alimentée par USB-C ou VIN 6–24 V (les prédécesseurs s'arrêtaient à 12 V)
- Optionnel : pile bouton 3 V sur VRTC pour conserver l'heure RTC coupure de courant comprise
- Connaître la broche OFF sur le connecteur de bord (voir le schéma officiel de la carte)
Code complet
// GIGA R1 WiFi — reconnexion robuste + arrêt matériel via la broche OFF
#include <WiFi.h>
const char SSID[] = "your-ssid";
const char PASS[] = "your-pass";
const int PIN_OFF = 7; // broche utilisee pour commander le circuit d'arrêt
// (comportement exact a valider avec le schéma officiel)
enum État { HORS_LIGNE, CONNECTE };
État état = HORS_LIGNE;
unsigned long dernierEssai = 0;
unsigned long backoff = 1000; // 1 s, double a chaque échec, plafonne
const unsigned long BACKOFF_MAX = 60000; // 60 s
int echecsConsecutifs = 0;
const int SEUIL_ARRET = 10; // 10 échecs de suite -> extinction
void setup {
Serial.begin(115200);
pinMode(PIN_OFF, OUTPUT);
digitalWrite(PIN_OFF, LOW); // reste sous tension
WiFi.begin(SSID, PASS);
}
void loop {
switch (état) {
case CONNECTE:
if (WiFi.status != WL_CONNECTED) {
état = HORS_LIGNE; backoff = 1000; echecsConsecutifs = 0;
Serial.println("Liaison perdue, reconnexion...");
WiFi.disconnect; WiFi.begin(SSID, PASS);
}
// ... tache applicative ici (lecture capteur, publication MQTT...) ...
delay(1000);
break;
case HORS_LIGNE:
if (millis - dernierEssai < backoff) { delay(100); break; }
dernierEssai = millis;
WiFi.disconnect; WiFi.begin(SSID, PASS);
unsigned long t0 = millis;
while (WiFi.status != WL_CONNECTED && millis - t0 < 10000) delay(100);
if (WiFi.status == WL_CONNECTED) {
état = CONNECTE; backoff = 1000; echecsConsecutifs = 0;
Serial.print("Retabli — IP "); Serial.println(WiFi.localIP);
} else {
echecsConsecutifs++;
backoff = min(backoff * 2, BACKOFF_MAX); // backoff exponentiel
Serial.print("Echec "); Serial.print(echecsConsecutifs);
Serial.print(", prochain essai dans "); Serial.print(backoff / 1000); Serial.println(" s");
if (echecsConsecutifs >= SEUIL_ARRET) {
Serial.println("Trop d'échecs : arrêt matériel (broche OFF).");
delay(50); // laisse partir les octets série
digitalWrite(PIN_OFF, HIGH); // hard shutdown : coupe l'alim
while (true); // ne doit plus jamais revenir ici
}
}
break;
}
}
Vérification attendue
Coupez le WiFi de la box : la carte détecte la perte, repart en backoff (1 s, 2 s, 4 s... plafonné à 60 s) et se reconnecte proprement quand le réseau revient, IP affichée. Après 10 échecs consécutifs sans réseau, la broche OFF est commandée et la carte s'éteint (plus de LED d'alimentation) — seule une pression sur reset ou une re-alimentation la rallume. Avec une pile sur VRTC, l'heure est conservée malgré la coupure.
Erreurs fréquentes
- Confondre extinction et deep-sleep : la broche OFF est un hard shutdown (coupure), pas une veille avec reprise ; le programme repart de zéro. `>
- Backoff sans plafond : sans
BACKOFF_MAX, un capricieux réseau peut générer une tempête de reconnexions qui sature le point d'accès. WiFi.reconnecten boucle sans état : coller un reconnect toutes les 100 ms dansloopest le meilleur moyen de faire tomber le routeur ; la machine à états ci-dessus est le minimum vital.- Oublier la consommation : la fiche officielle ne publie ni consommation type ni plage de température ; pour un objet sur batterie, d'autres cartes (Portenta avec gestion d'alim, ou MCU ultra-basse-consommation) sont plus adaptées.
- VRTC sans pile : sans pile bouton, le RTC repart à une date par défaut à chaque mise sous tension — gênant pour TLS (voir le tuto HTTPS) et l'horodatage des données.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton.inoArduinorespiration.inoArduinoanalogique.inoArduinodac-onde.inoArduinooled-i2c.inoArduino