Plantage aléatoire avec perte de connexion Wifi

Bonjour,

A 57 ans je débute en programmation donc soyez indulgent et excusez moi par avance si mes questions ou bêtes ou si je ne présente pas bien les choses.

Voila plusieurs mois que je travail sur mon projet et j'ai surmonté toutes les difficultés en trouvant les réponses sur les forums et autres tuto YouTube.

Malheureusement je rencontre un problème que je n'arrive pas à résoudre.

Mon projet consiste à lire des capteurs branchés sur un ESP32 WROOM 32 et à afficher les valeurs sur une page Web hébergée sur ce même ESP32.
Les pages sont statiques et programmées directement dans le fichier main.cpp
La lecture des capteur fonctionne, l'affichage des pages aussi.

Mon soucis est que quand je laisse l'ESP32 branché, tout fonctionne parfaitement bien un certain temps (aléatoire entre 1h et 48h) puis il perd la connexion Wifi et affiche dans le terminal des suite de caractères illisibles qui défile en continue jusqu'à saturer le terminal.

Je précise que dans mon code tous les Serial.print s'affiche correctement.

Par hasard, je me suis rendu compte que si je ferme la page web sur mon smartphone après avoir consulté les valeurs des capteurs, le système ne plante pas (du moins il a tourné 3 jours complet sans problème contre 2 jours maxi si je laisse la page ouverte).

J'ai donc pensé à un problème de "client" dont il faut forcer la déconnection au bout d'un certain temps. J'ai donc inséré dans mon code

int numClients = server.client().available(); // indique le nombre de client connecté
  if (numClients > 0)
  {
  Serial.print("Nombre de clients connectés : ");
  Serial.println(numClients);
  }
  else
  {
  Serial.println("Aucun clients connecté");
  }
  delay(2000);

Mauvaise pioche, même en changeant de page sur mon smartphone le terminal m'affiche toujours Aucun client connecté.

Lors de la compilation je n'ai pas d'erreur:

  • Executing task: C:\Users\miche.platformio\penv\Scripts\platformio.exe run --target upload

Processing upesy_wroom (platform: espressif32; board: upesy_wroom; framework: arduino)
----------------------------------------------------------------------------------------------------------------------------------------Verbose mode can be enabled via -v, --verbose option
CONFIGURATION: Redirecting...
PLATFORM: Espressif 32 (6.3.0) > uPesy ESP32 Wroom DevKit
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:

  • framework-arduinoespressif32 @ 3.20009.0 (2.0.9)
  • tool-esptoolpy @ 1.40501.0 (4.5.1)
  • tool-mkfatfs @ 2.0.1
  • tool-mklittlefs @ 1.203.210628 (2.3)
  • tool-mkspiffs @ 2.230.0 (2.30)
  • toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
    LDF: Library Dependency Finder -> Library Dependency Finder (LDF) — PlatformIO latest documentation
    LDF Modes: Finder ~ chain, Compatibility ~ soft
    Found 37 compatible libraries
    Scanning dependencies...
    Dependency Graph
    |-- OneWire @ 2.3.7
    |-- DallasTemperature @ 3.11.0
    |-- UrlEncode @ 1.0.1
    |-- ESPmDNS @ 2.0.0
    |-- HTTPClient @ 2.0.0
    |-- Preferences @ 2.0.0
    |-- WebServer @ 2.0.0
    |-- WiFi @ 2.0.0
    |-- WiFiManager @ 2.0.16-rc.2
    Building in release mode
    Compiling .pio\build\upesy_wroom\src\main.cpp.o
    Linking .pio\build\upesy_wroom\firmware.elf
    Retrieving maximum program size .pio\build\upesy_wroom\firmware.elf
    Checking size .pio\build\upesy_wroom\firmware.elf
    Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
    RAM: [== ] 17.3% (used 56700 bytes from 327680 bytes)
    Flash: [====== ] 64.7% (used 1356121 bytes from 2097152 bytes)
    Building .pio\build\upesy_wroom\firmware.bin
    esptool.py v4.5.1
    Creating esp32 image...
    Merged 25 ELF sections
    Successfully created esp32 image.
    Configuring upload protocol...
    AVAILABLE: cmsis-dap, esp-bridge, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h,
    olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
    CURRENT: upload_protocol = esptool
    Looking for upload port...
    Auto-detected: COM3
    Uploading .pio\build\upesy_wroom\firmware.bin
    esptool.py v4.5.1
    Serial port COM3
    Connecting....
    Chip is ESP32-D0WD-V3 (revision v3.0)
    Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
    Crystal is 40MHz
    MAC: a8:42:e3:90:64:80
    Uploading stub...
    Running stub...
    Stub running...
    Changing baud rate to 460800
    Changed.
    Configuring flash size...
    Flash will be erased from 0x00001000 to 0x00005fff...
    Flash will be erased from 0x00008000 to 0x00008fff...
    Flash will be erased from 0x0000e000 to 0x0000ffff...
    Flash will be erased from 0x00010000 to 0x0015cfff...
    Compressed 18960 bytes to 13073...
    Writing at 0x00001000... (100 %)
    Wrote 18960 bytes (13073 compressed) at 0x00001000 in 0.7 seconds (effective 227.4 kbit/s)...
    Hash of data verified.
    Compressed 3072 bytes to 134...
    Writing at 0x00008000... (100 %)
    Wrote 3072 bytes (134 compressed) at 0x00008000 in 0.1 seconds (effective 285.8 kbit/s)...
    Hash of data verified.
    Compressed 8192 bytes to 47...
    Writing at 0x0000e000... (100 %)
    Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.2 seconds (effective 412.2 kbit/s)...
    Hash of data verified.
    Compressed 1361872 bytes to 799442...
    Writing at 0x00010000... (2 %)
    .....
    Writing at 0x00157f58... (100 %)
    Wrote 1361872 bytes (799442 compressed) at 0x00010000 in 19.6 seconds (effective 556.0 kbit/s)...
    Hash of data verified.

Leaving...
Hard resetting via RTS pin...
===================================================== [SUCCESS] Took 54.11 seconds =====================================================

A noter que comme je n'avais pas assez de place en mémoire Flash pour mon programme, j'ai modifié la réservation mémoire en supprimant l'espace réservé pour l'OTA pour disposer de plus de mémoire pour mon programme.

Mes pages web sont envoyées avec les commandes

  server.setContentLength(page.length());
  server.send(200, "text/html", page);

ou

  server.sendHeader("Location","/"); 
  server.send(303); 

Dans mon code j'ai ajouté une partie qui surveille l'état du Wifi et qui tente de se reconnecté si l'ESP n'est plus connecté. Cela fonctionne quand je coupe le Wifi de ma box manuellement et que je le remets mais pas quand le système bug. A croire qu'il tourne en boucle dans un sous programme???

Si vous avez des pistes pour m'aider à trouver l'origine du bug et/ou comment le résoudre je suis preneur.

D'avance merci pour votre aide.

Tu as récupéré ce qui s'affiche en bouche dans ce cas en testant d'autres valeurs de débit en baud pour tenter de faire apparaître du texte donnant une information exploitable ?

Par hasard, je me suis rendu compte que si je ferme la page web sur mon smartphone après avoir consulté les valeurs des capteurs, le système ne plante pas (du moins il a tourné 3 jours complet sans problème contre 2 jours maxi si je laisse la page ouverte).

Si ça se confirme ça pourrait être un bon indice

Merci [al1fch] pour cette piste je vais essayer de réduire les valeurs de débit en baud pour tenter de faire apparaître du texte donnant une information exploitable. Je fait la modification et vais laisser tourner jusqu'au bug ...

Bonjour,
Suite à la modification du débit (conseillé par al1fch que j'ai passé à 9600 mon système tourne depuis hier 16h30 et n'a pas encore planté.
Ce matin j'ai tout de même vu un message dans le terminal qui est apparu vers 3h40 ce matin.

[39619079][E][Parsing.cpp:90] _parseRequest(): Invalid request: ␃

Toujours ce matin, voulant consulter la page Web hébergé sur l'ESP32 avec mon smartphone, j'ai été dans l'obligation de rafraichir la page à plusieurs reprise car Safari m'indiquait que la page était inaccessible alors que l'ESP était bien connecté au Wifi. Sur le terminal j'ai eu

[58288204][E][WebServer.cpp:648] _handleRequest(): request handler not found
[58288311][E][WebServer.cpp:648] _handleRequest(): request handler not found
[58290170][E][WebServer.cpp:648] _handleRequest(): request handler not found
[58290278][E][WebServer.cpp:648] _handleRequest(): request handler not found

et la page c'est affichée normalement.

Bonjour,
Ce matin (le 5/1/24) mon ESP est a nouveau déconnecté du Wifi :worried:.

Etrangement aucun message particulier sur le terminal, le programme semble tourner normalement puisqu'il m'affiche bien dans le terminal l'heure toute les 10 minutes (j'ai un bout de code pour cela en fin de programme pour m'assurer que le système n'est pas planté).

Ce que je ne comprends pas c'est:

  • Élément Pourquoi il ne m'affiche rien de particulier dans le terminal quand réglé sur 9600 alors que quand il était réglé à 115200 il m'affichait normalement l'heure toute les 10 minutes puis, je suppose au moment de la perte du réseau, des caractères illisibles en continue jusqu'à saturer le terminal?

  • Élément Pourquoi il perd le Wifi au bout de 1.5 jours environ alors que le reste du temps il ne se déconnecte pas?

  • Élément Pourquoi il ne se reconnecte pas au Wifi alors que le programme surveille la connexion et tente de se reconnecter si besoin ?
    Le code pour cela est le suivant:

#include <Arduino.h> 
#include <OneWire.h>
#include <DallasTemperature.h> 
#include <iostream> 
#include <WiFi.h> 
#include <WebServer.h> 
#include <string>
#include <ESPmDNS.h>
#include "PubSubClient.h"
#include <Preferences.h>
#include <HTTPClient.h>
#include <UrlEncode.h>
#include <ctime>
#include <config.h>
WebServer server(80);
#include <WiFiManager.h>
WiFiManager wm;
#define WEBSERVER_H

// Fonction appelée automatiquement qui permet de vérifier si le boitier c'est connecté ou déconnecté du réseau Wifi
void etatconnexion(WiFiEvent_t event)  
{
  int wifiMode = WiFi.getMode();
  if (wifiMode == WIFI_STA && WiFi.status() == WL_CONNECTED && event == 7)  // event = 7 correspond au fait que l'ESP à récupéré une adresse IP communiquée par le routeur
  {
    if (testreseau == 0)
    {
      testreseau = 1;
      digitalWrite(LED_wifi, HIGH);
    }    
    Tempodeco = 0;
  }
  else
  {
    if (testreseau == 1)
    {
      perteco = perteco + 1;
      testreseau = 0;
      digitalWrite(LED_wifi, LOW);
    }
  }
}

void setup() 
{
  WiFi.setSleep(false);
  wm.setWiFiAutoReconnect(false); // pour ne pas se reconnecter automatiquement en cas de perte du réseau wifi
  wm.setConnectTimeout(20); // tentera de se connecter pendant 20s
  delay(500);
  if(!wm.autoConnect(ssid, password))
  {
    // Serial.println("Réseau Wifi non trouvé démarrage en mode point d'accès.");
    //delay(2000);
  }
	else
  {
    if (MDNS.begin("ModuleESP32")) 
    {
      Serial.println("mDNS started");
    }
    else
    {
      Serial.println("Error setting up mDNS");
    }
    testreseau = 1;
    digitalWrite(LED_wifi, HIGH);
  }

  WiFi.onEvent(etatconnexion); // on initialise une fonction qui surveille les changement d'état de la connexion wifi (connecté ou non connecté)
  delay(500);
}


void loop()
{
  // ***********  Gestion automatique de la page web
  server.handleClient();

  // *********** Reconnexion automatique si perte du réseau Wifi
  if (testreseau == 0) 
  {
    // On scann les réseau disponibles pour voir si celui enregistré est disponible.
    int nbreseauwifi = WiFi.scanNetworks();
    if (nbreseauwifi > 0)
    {
      for (int j = 0; j < nbreseauwifi; ++j) 
      {
        if (WiFi.SSID(j) == wm.getWiFiSSID()) // Si le réseau Wifi enregistré est visible on tente de s'y reconnecter
        { 
          if (WiFi.RSSI(j) < -1 && WiFi.RSSI(j) >-85) // Si le signal est assez puissant on tente de se connecter
          {
            if (Tempodeco == 0)
            {
              Tempodeco = tempsenseconde;
            }
            if (tempsenseconde > (Tempodeco+(3*60))) // on tente de se reconnecter pendant 3 minutes avant de forcer une deconnection/reconnection
            {
              WiFi.disconnect(true);
              WiFi.mode(WIFI_STA);
              String ssid1 = wm.getWiFiSSID(); // correspond au nom du réseau Wifi enregistrée par l'utilisateur
              String password1 = wm.getWiFiPass(); // correspond au mot de passe du réseau Wifi enregistrée par l'utilisateur
              WiFi.begin(ssid1, password1);
              if (WiFi.status() == WL_CONNECTED)
              {
                Serial.print("Reconnextion au wifi réussi suite a déconnection/reconnection fait à ");
                Serial.print(heureactuelle);
                Serial.print("h ");
                Serial.print(minuteactuelle);
                Serial.print("min ");
                Serial.println(secondeactuelle);
                Tempodeco = 0;
              }
              else
              {
                Serial.println("Echeque de la reconnection on redemarre le module");
                ESP.restart();
              }
            }
            else
            {
              WiFi.reconnect();
              if (WiFi.status() == WL_CONNECTED)
              {
                Serial.print("Reconnection au Wifi réussi avec WiFi.reconnect() à ");
                Serial.print(heureactuelle);
                Serial.print("h ");
                Serial.print(minuteactuelle);
                Serial.print("min ");
                Serial.println(secondeactuelle);
                Tempodeco = 0;
              }
              getLocalTime(&timeinfo);
              valtimestamp(); // declanchement de la fonction qui recupère les données de temps
            }
          }
          else
          {
            Tempodeco = 0;
          }
          j = nbreseauwifi; // pas la peine de vérifier les autres réseaux visibles 
        }
      }
    }
  }
}

Si vous avez des idées je suis preneur car je ne sais vraiment plus quoi faire pour résoudre ce mystère.

D'avance merci.

Bonjour,

Hier soir alors que l'ESP était déconnecté du wifi depuis le matin, j'ai constaté que le programme fonctionnait toujours bien car à l'heure prévu mon relai c'est bien enclenché et toujours aucun caractère illisible sur le terminal, juste l'affichage de l'heure toute les 10 minutes comme prévu dans mon programme.
Par contre ce main, j'avais à nouveau des caractères illisible sur le terminal malgré le réglage à 9600.
De plus l'ESP ne semblait plus actif dans la mesure ou, malgré l'effacement du terminal PlatformIO, il ne m'affiche plus l'heure tout les 10 minutes.

Je viens de modifier mon code de reconnexion pour tenter une approche différente à savoir.

Si perte de connexion Wifi, je tente un simple WiFi.reconnect()
Sa la connexion n'est pas OK je fait un
WiFi.disconnect(true);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid1, password1);

Si la connexion n'est toujours pas OK je fait un ESP.restart();

Espérant que cette nouvelle façon fonctionnera mais cela ne me plait pas beaucoup car elle devrait résoudre le problème de reconnexion mais pas l'origine de la déconnexion ni les messages illisibles.

Pour sauvegarder de manière permanente des variables j'utilise la bibliothèque <Preferences.h>.
Pour cela je déclare en début de programme

#include <Preferences.h>
Preferences preferences;

Dans le void setup()

preferences.begin("reglages", false);
variablestring = preferences.getString("nomdelavariable", "à compléter");
// plus d'autres variables (il y en a plus de 20)

puis dans mes fonctions ou dans le void loop j'utilise des 'preferences.putString("nomdelavariable", valeur); '
et
'preferences.getString("nomdelavariable");'.

Faut il "arréter" et "redémarrer" preférences à chaque boucle pour réinitialiser la memoire ???

Dans l'espoir de votre aide.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.