[SOLVED] Reconnectez l’ESP8266 NodeMCU au réseau Wi-Fi après une perte de connexion

[SOLVED] Reconnectez l'ESP8266 NodeMCU au réseau Wi-Fi après une perte de connexion

Ce guide rapide montre différentes manières de reconnecter la carte ESP8266 NodeMCU à un réseau Wi-Fi après une connexion perdue. Cela peut être utile si l’ESP8266 perd temporairement le signal Wi-Fi ; l’ESP8266 est temporairement hors de portée Wi-Fi du routeur ; le routeur redémarre ; le routeur perd la connexion Internet ou d’autres situations.

Résolu ESP8266 NodeMCU se reconnecter au Wi-Fi après la perte de la connexion

Nous avons un guide similaire pour la carte ESP32 :

Se reconnecter au réseau Wi-Fi après une connexion perdue

L’ESP8266 a la capacité de se reconnecter automatiquement à votre routeur en cas de panne Wi-Fi. Par exemple, si l’ESP8266 est connecté à votre routeur et que vous l’éteignez subitement, lorsqu’il se rallume, l’ESP8266 peut se reconnecter automatiquement. Cependant, beaucoup de nos lecteurs signalent des situations dans lesquelles l’ESP8266 ne se reconnecte pas. Dans ces cas, vous pouvez essayer l’une des autres suggestions suivantes (poursuivez la lecture).

Pour vous reconnecter au Wi-Fi après une perte de connexion, vous pouvez utiliser WiFi.setAutoReconnect(true); suivie par WiFi.persistent(vrai); pour se reconnecter automatiquement au point d’accès précédemment connecté :

WiFi.setAutoReconnect(true);
WiFi.persistent(true);

Ajoutez ces lignes précédentes juste après vous être connecté à votre réseau Wi-Fi. Par example:

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
  WiFi.setAutoReconnect(true);
  WiFi.persistent(true);
}

Voici un exemple complet utilisant cette méthode. Toutes les 30 secondes, il imprime l’état de la connexion Wi-Fi. Vous pouvez éteindre temporairement votre routeur et voir l’état du Wi-Fi changer. Lorsque le routeur est rallumé, il devrait se connecter automatiquement.

/*
  Rui Santos
  Complete project details at https://Raspberryme.com/solved-reconnect-esp8266-nodemcu-to-wifi/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

unsigned long previousMillis = 0;
unsigned long interval = 30000;

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
  //The ESP8266 tries to reconnect automatically when the connection is lost
  WiFi.setAutoReconnect(true);
  WiFi.persistent(true);
}

void setup() {
  Serial.begin(115200);
  initWiFi();
  Serial.print("RSSI: ");
  Serial.println(WiFi.RSSI());
}

void loop() {
  //print the Wi-Fi status every 30 seconds
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >=interval){
    switch (WiFi.status()){
      case WL_NO_SSID_AVAIL:
        Serial.println("Configured SSID cannot be reached");
        break;
      case WL_CONNECTED:
        Serial.println("Connection successfully established");
        break;
      case WL_CONNECT_FAILED:
        Serial.println("Connection failed");
        break;
    }
    Serial.printf("Connection status: %dn", WiFi.status());
    Serial.print("RRSI: ");
    Serial.println(WiFi.RSSI());
    previousMillis = currentMillis;
  }
}

Afficher le code brut

Une autre alternative est d’appeler WiFi.déconnecter() suivie par WiFi.begin (ssid, mot de passe) quand vous remarquez que la connexion a été perdue (WiFi.status() != WL_CONNECTED)

WiFi.disconnect();
WiFi.begin(ssid, password);

Alternativement, vous pouvez également essayer de redémarrer l’ESP8266 avec ESP.restart() lorsque la connexion est perdue.

Vous pouvez ajouter quelque chose comme l’extrait ci-dessous au boucler() qui vérifie de temps en temps si la carte est connectée et essaie de se reconnecter si elle a perdu la connexion.

unsigned long currentMillis = millis();
// if WiFi is down, try reconnecting
if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {
  Serial.print(millis());
  Serial.println("Reconnecting to WiFi...");
  WiFi.disconnect();
  WiFi.begin(YOUR_SSID, YOUR_PASSWORD);
  previousMillis = currentMillis;
}

N’oubliez pas de déclarer le précédentMillis et intervalle variables. le intervalle correspond à la période de temps entre chaque contrôle en millisecondes (par exemple 30 secondes) :

unsigned long previousMillis = 0;
unsigned long interval = 30000;

Voici un exemple complet.

/*
  Rui Santos
  Complete project details at https://Raspberryme.com/solved-reconnect-esp8266-nodemcu-to-wifi/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

unsigned long previousMillis = 0;
unsigned long interval = 30000;

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

void setup() {
  Serial.begin(115200);
  initWiFi();
  Serial.print("RRSI: ");
  Serial.println(WiFi.RSSI());
}

void loop() {
  unsigned long currentMillis = millis();
  // if WiFi is down, try reconnecting every CHECK_WIFI_TIME seconds
  if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {
    Serial.print(millis());
    Serial.println("Reconnecting to WiFi...");
    WiFi.disconnect();
    WiFi.begin(ssid, password);
    Serial.println(WiFi.localIP());
    //Alternatively, you can restart your board
    //ESP.restart();
    Serial.println(WiFi.RSSI());
    previousMillis = currentMillis;
  }
}

Afficher le code brut

Cet exemple montre comment se connecter à un réseau et vérifie toutes les 30 secondes s’il est toujours connecté. Si ce n’est pas le cas, il se déconnecte et essaie de se reconnecter.

Il y a aussi le WiFi.reconnect() une fonction. Cependant, après plusieurs essais, nous n’avons pas pu le faire fonctionner. Si quelqu’un sait s’il existe une astuce pour le faire fonctionner, merci de partager.

Vous pouvez également utiliser les événements Wi-Fi pour détecter que la connexion a été perdue et appeler une fonction pour gérer ce qu’il faut faire lorsque cela se produit (voir la section suivante).

Événements Wi-Fi NodeMCU ESP8266

L’ESP8266 est capable de gérer différents événements Wi-Fi. Avec les événements Wi-Fi, vous n’avez pas besoin de vérifier constamment l’état du Wi-Fi. Lorsqu’un certain événement se produit, il appelle automatiquement la fonction de gestion correspondante.

Les événements suivants sont très utiles pour détecter si la connexion a été perdue ou rétablie :

  • onStationModeGotIP: lorsque l’ESP8266 arrive à sa dernière étape de la connexion : obtenir son adresse IP réseau ;
  • onStationModeDéconnecté: lorsque l’ESP8266 n’est plus connecté à un point d’accès.

Passez à la section suivante pour voir un exemple d’application.

Se reconnecter au réseau Wi-Fi après une connexion perdue (événements Wi-Fi)

Les événements Wi-Fi peuvent être utiles pour détecter qu’une connexion a été perdue et essayer de se reconnecter juste après (utilisez le onStationModeDéconnecté un événement). Voici un exemple de code :

/*
  Rui Santos
  Complete project details at https://Raspberryme.com/solved-reconnect-esp8266-nodemcu-to-wifi/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

void onWifiConnect(const WiFiEventStationModeGotIP& event) {
  Serial.println("Connected to Wi-Fi sucessfully.");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
  Serial.println("Disconnected from Wi-Fi, trying to connect...");
  WiFi.disconnect();
  WiFi.begin(ssid, password);
}

void setup() {
  Serial.begin(115200);

  //Register event handlers
  wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
  wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
   
  initWiFi();
  Serial.print("RRSI: ");
  Serial.println(WiFi.RSSI());
}

void loop() {
  //delay(1000);
}

Afficher le code brut

Comment ça fonctionne?

Dans cet exemple, nous avons ajouté deux événements Wi-Fi : lorsque l’ESP8266 se connecte et obtient une adresse IP, et lorsqu’il se déconnecte.

Lorsque la station ESP8266 se connecte au point d’accès et obtient son adresse IP (onStationModeGotIP événement), le onWifiConnect() la fonction sera appelée :

wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);

le onWifiConnect() La fonction imprime simplement que l’ESP8266 s’est connecté avec succès au Wi-Fi et imprime son adresse IP locale. Cependant, vous pouvez modifier la fonction pour effectuer toute autre tâche (comme allumer une LED pour indiquer qu’elle est correctement connectée au réseau).

void onWifiConnect(const WiFiEventStationModeGotIP& event) {
  Serial.println("Connected to Wi-Fi sucessfully.");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

Lorsque l’ESP8266 perd la connexion avec le point d’accès (onStationModeDéconnecté événement), le onWifiDisconnect() la fonction est appelée.

wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);

Cette fonction imprime un message indiquant que la connexion a été perdue et essaie de se reconnecter :

void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
  Serial.println("Disconnected from Wi-Fi, trying to connect...");
  WiFi.disconnect();
  WiFi.begin(ssid, password);
}

Conclusion

Ce didacticiel rapide montre différentes manières de reconnecter votre carte ESP8266 NodeMCU à un réseau Wi-Fi après la perte de la connexion (si elle ne le fait pas automatiquement).

Pour plus d’informations sur les fonctions Wi-Fi de l’ESP8266, nous vous recommandons de consulter la documentation :

L’une des meilleures applications des capacités Wi-Fi de l’ESP8266 est la création de serveurs Web. Si vous souhaitez utiliser les cartes ESP8266 NodeMCU ou ESP32 pour créer des projets de serveur Web, vous aimerez peut-être notre eBook :

Nous espérons que vous avez trouvé ce tutoriel utile.

Merci d’avoir lu.