reconnexion-auto.ino

Arduino MKR WiFi 1010 · Fichier : reconnexion-auto.ino · Langage : Arduino · Usage : Survivre aux coupures WiFi avec une machine de reprise

Un objet connecté doit survivre au redémarrage de la box : ce tuteur WiFi de la MKR WiFi 1010 détecte la perte de liaison, retente la connexion, et après une minute d'échec réinitialise matériellement le module WINC1500. Le patron de robustesse des installations sans intervention humaine.

Matériel requis

Une Arduino MKR WiFi 1010 (microcontrôleur SAMD21, module Wi-Fi WINC1500, pas de Bluetooth, alimentation USB ou LiPo sur J6). MKR WiFi 1010, point d'accès réel ; testable en éteignant simplement le routeur.

Câblage

Aucun câblage ; WiFi.end() puis begin() suffisent à recharger le firmware du WINC1500.

Fonctionnement

La boucle compare l'état WiFi à chaque tour ; l'horodatage depuisKO temporise les tentatives. Le cycle end/begin recharge le firmware du module, seul remède aux blocages SPI du WINC1500.

Exécution

Installez Arduino SAMD Boards et la bibliothèque WiFi101, sélectionnez la carte, téléversez. Le Wi-Fi fonctionne en 2,4 GHz uniquement : vérifiez que votre point d'accès n'est pas en 5 GHz seul.

Variantes

Ajoutez un compteur de redémarrages en EEPROM pour alerter après N échecs, ou un retour en point d'accès de secours si le principal disparaît.

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

← Retour à la fiche