Gestion connexion WiFi - Esp8266 sous IDE arduino 1.6.5

Bonjour à tous,

Voila maintenant un petit bout de temps que je joue avec l'esp8266 (notamment avec une nodeMCU v1.0 sous IDE Arduino 1.6.5), et j'ai réussi à pondre, pour mon paternel, une supervision de sa serre pendant ses périodes de congés.

Bref, le produit est finalisé, fonctionne comme attendu, SAUF que:

Je me heurte à un soucis de déconnexion du réseau Wifi, j'ai vite identifié le problème puisque je me connecte dans la fonction setup(), puis place a la boucle loop() qui elle ne vérifie jamais l'état de la connexion.

Je sais que le programme continu de tourner, puisque le système comporte un LCD avec un clignotement du curseur à chaque tour de loop(), justement mis en place pour vérifier l'intégrité du système.

J'ai donc épluché le code source de la grosse bibliothèque ESP8266:

lien: Depot Git ESP8266

et je trouve plusieurs fonctions (issue de ESP8266WiFiSTA.cpp) qui pourrait convenir:

/**
 * will force a disconnect an then start reconnecting to AP
 * @return ok
 */
bool ESP8266WiFiSTAClass::reconnect() {
    if((WiFi.getMode() & WIFI_STA) != 0) {
        if(wifi_station_disconnect()) {
            return wifi_station_connect();
        }
    }
    return false;
}
/**
 * Setting the ESP8266 station to connect to the AP (which is recorded)
 * automatically or not when powered on. Enable auto-connect by default.
 * @param autoConnect bool
 * @return if saved
 */
bool ESP8266WiFiSTAClass::setAutoConnect(bool autoConnect) {
    bool ret;
    ETS_UART_INTR_DISABLE();
    ret = wifi_station_set_auto_connect(autoConnect);
    ETS_UART_INTR_ENABLE();
    return ret;
}
/**
 * Set whether reconnect or not when the ESP8266 station is disconnected from AP.
 * @param autoReconnect
 * @return
 */
bool ESP8266WiFiSTAClass::setAutoReconnect(bool autoReconnect) {
    return wifi_station_set_reconnect_policy(autoReconnect);
}

Et c'est la que je bloque, qu'elle est la meilleure solution à retenir, si toutefois il y en a une, ou peut être que toute se valent?

Mon code ressemble fortement à ça, une connexion via WiFi.begin() dans le setup() avec contrôle si c'est bien connecté avant de passer à la loop()

#include <ESP8266WiFi.h>

const char* ssid = "your-ssid";
const char* password = "your-password";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  

 
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  
}

void loop() {
 //fait plein de chose ici, mais pas de test de l'état du reseau
 
}

setAutoConnect et setAutoReconnect ne font pas la même chose - le premier va automatiquement se connecter quand votre ESP démarre le second est fait pour rétablir la connexion si d'aventure elle venait tomber. De mémoire La classe ESP8266WiFiClass est dérivée de la classe ESP8266WiFiSTAClass et par défaut la reconnexion doit se faire toute seule mais Il faut que dans votre code vous testiez les conditions d'erreur quand vous envoyez des choses et faire aussi une vérification de WiFi.status() en début de loop() par exemple. La reconnection peut prendre du temps donc faut gérer cela et pas essayer d'envoyer des commandes inutiles

Merci JML

J-M-L:
[...]le second est fait pour rétablir la connexion si d'aventure elle venait tomber. De mémoire La classe ESP8266WiFiClass est dérivée de la classe ESP8266WiFiSTAClass et par défaut la reconnexion doit se faire toute seule[...]

C'est précisement ce qui arrive, la connexion tombe et l'ESP ne se reconnecte pas.

J-M-L:
[...]mais Il faut que dans votre code vous testiez les conditions d'erreur quand vous envoyez des choses et faire aussi une vérification de WiFi.status() en début de loop() par exemple.[...]

Je comptais bien partir en ce sens , un test en début de loop() sur le WiFi.status() et lancer une reconnexion et au moyen d'un drapeau, attendre que la reconnexion soit effective.

Par contre, je me demande si c'est pas alourdir le code "inutilement" alors que la fonction setAutoReconnect(bool autoReconnect); pourrai se coller dans la setup() et faire ça de façon "masqué"