🛠 Wi-Fi résilient, broche OFF et veille profonde
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
- Placa Arduino GIGA R1 WiFi + antena u.FL, alimentada por USB-C o VIN 6–24 V (los predecesores llegaban hasta 12 V)
- Opcional: pila de botón de 3 V en VRTC para conservar la hora RTC incluso durante cortes de corriente
- Conocer el pin OFF en el conector de borde (consulte el esquema oficial de la placa)
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
- Confundir apagado y deep-sleep: el pin OFF es un hard shutdown (corte), no una espera con reanudación; el programa comienza desde cero. `>
- Backoff sin límite superior: sin
BACKOFF_MAX, una red inestable puede generar una tormenta de reconexiones que sature el punto de acceso. WiFi.reconnecten bucle sin estado: colocar un reconnect cada 100 ms enloopes la mejor manera de tumbar el router; la máquina de estados anterior es el mínimo vital.- Olvidar el consumo: la ficha oficial no publica ni consumo típico ni rango de temperatura; para un dispositivo a batería, otras placas (Portenta con gestión de alimentación, o MCU de ultra bajo consumo) son más adecuadas.
- VRTC sin pila: sin pila de botón, el RTC vuelve a una fecha por defecto en cada encendido — molesto para TLS (ver el tutorial HTTPS) y el sellado de tiempo de los datos.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton.inoArduinorespiration.inoArduinoanalogique.inoArduinodac-onde.inoArduinooled-i2c.inoArduino