🛠 Wi-Fi résilient, broche OFF et veille profonde

Arduino GIGA R1 WiFi · avance · Schéma : IMG-giga-r1-wifi-avance-8-connexion-robuste-off-pin.svg — Machine à états de reconnexion WiFi de la GIGA R1 WiFi, broches OFF (extinction matérielle) et VRTC (RTC sauvegardé) zoomées sur le bord de carte

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels