reconnexion-auto.ino
Un objeto conectado debe sobrevivir al reinicio del router: este vigilante WiFi de la MKR WiFi 1010 detecta la pérdida de enlace, reintenta la conexión y tras un minuto de fallo reinicia el módulo WINC1500. El patrón de robustez para instalaciones sin intervención.
Hardware
Una Arduino MKR WiFi 1010 (microcontrolador SAMD21, módulo Wi-Fi WINC1500, sin Bluetooth, alimentación USB o LiPo en J6). MKR WiFi 1010, punto de acceso real; comprobable apagando simplemente el router.
Cableado
Sin cableado; WiFi.end() y luego begin() basta para recargar el firmware del WINC1500.
Funcionamiento
El bucle compara el estado WiFi en cada vuelta; el sello desdeKO temporiza los intentos. El ciclo end/begin recarga el firmware del módulo, único remedio para los bloqueos SPI del WINC1500.
Ejecución
Instala Arduino SAMD Boards y la librería WiFi101, selecciona la placa y carga. El Wi-Fi funciona solo en 2,4 GHz: comprueba que tu punto de acceso no sea solo de 5 GHz.
Variantes
Añade un contador de reinicios en EEPROM para avisar tras N fallos, o un punto de acceso de reserva si el principal desaparece.
reconnexion-auto.ino
// Tuteur WiFi MKR WiFi 1010 : detecte la coupure, retente, reinit.
#include <SPI.h>
#include <WiFi101.h>
const char SSID[] = "MonReseau";
const char PASS[] = "motdepassewifi";
unsigned long depuisKO = 0;
void connexion() {
WiFi.disconnect();
WiFi.begin(WPA_PASS_PHRASE, SSID, PASS);
unsigned long t = millis();
while (WiFi.status() != WL_CONNECTED && millis() - t < 20000) delay(100);
Serial.println(WiFi.status() == WL_CONNECTED ?
WiFi.localIP() : F("connexion KO"));
}
void setup() {
Serial.begin(9600);
connexion();
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
depuisKO = 0;
activite(); // tache reseau normale ici
return;
}
if (depuisKO == 0) {
depuisKO = millis();
Serial.println(F("WiFi perdu, reprise..."));
}
if (millis() - depuisKO > 60000) { // reinit materielle du module
WiFi.end();
delay(1000);
depuisKO = 0;
}
connexion();
}
void activite() {
static unsigned long dernier = 0;
if (millis() - dernier < 300000) return;
dernier = millis();
Serial.println(F("tache periodique OK"));
}