🛠 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

Objetivos

Hacer que un proyecto WiFi sea autónomo y robusto en la GIGA R1 WiFi: máquina de estados de reconexión con backoff exponencial, guardado del contexto de despertar y uso de los dos pines de alimentación documentados por Arduino — OFF (apagado por hardware, hard shutdown) y VRTC (RTC respaldado por pila). También verá los límites honestos del consumo en esta placa, pensada como una estación de rendimiento y no como un dispositivo alimentado por pila.

Material

Código completo

// GIGA R1 WiFi — reconnexion robuste + arret materiel 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'arret
                         // (comportement exact a valider avec le schema officiel)

enum Etat { HORS_LIGNE, CONNECTE };
Etat etat = HORS_LIGNE;
unsigned long dernierEssai = 0;
unsigned long backoff = 1000;            // 1 s, double a chaque echec, plafonne
const unsigned long BACKOFF_MAX = 60000; // 60 s
int echecsConsecutifs = 0;
const int SEUIL_ARRET = 10;              // 10 echecs 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 (etat) {
    case CONNECTE:
      if (WiFi.status != WL_CONNECTED) {
        etat = 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) {
        etat = 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'echecs : arret materiel (broche OFF).");
          delay(50);                       // laisse partir les octets serie
          digitalWrite(PIN_OFF, HIGH);     // hard shutdown : coupe l'alim
          while (true);                    // ne doit plus jamais revenir ici
        }
      }
      break;
  }
}

Verificación esperada

Corte el WiFi del router: la placa detecta la pérdida, entra en backoff (1 s, 2 s, 4 s... limitado a 60 s) y se reconecta correctamente cuando la red vuelve, mostrando la IP. Tras 10 fallos consecutivos sin red, se comanda el pin OFF y la placa se apaga (deja de iluminarse el LED de alimentación) — solo una pulsación en reset o una nueva alimentación la vuelve a encender. Con una pila en VRTC, la hora se conserva a pesar del corte.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales