reconnexion-auto.ino

Arduino MKR WiFi 1010 · Archivo : reconnexion-auto.ino · Lenguaje : Arduino · Uso : Survivre aux coupures WiFi avec une machine de reprise

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"));
}

← Volver a la ficha