[ résolu] Apathie d'un ESP-01 après 48 heures de wifi

Bonjour,

j’ai branché sur la commande d’ouverture par contact sec l’ouverture de mon portail électrique via un relais piloté par ESP-01. Cela me permet de l’ouvrir à distance, via une appli Android faite sous AIP2. Cela fonctionne parfaitement à une exception près : après environ 48 heures de fonctionnement, et en dépit de la connexion sur le réseau wifi de l’ESP (vérifiée via l’éditeur de ma Freebox), mon ESP ne commande plus le relais. Pensant réinitialiser la connexion, j’ai rajouté une commande ESP.restart(), doublée à une LED qui me permet de vérifier que ce redémarrage est effectif. en dépit de cela, il n’y a pas d’amélioration. Ce problème viendrait-il de l’ESP (mémoire saturée?) ou du paramétrage de la box? Devrais-je plutôt utiliser la fonction ESP.reset()?
Je place ici le programme :

#define pinLed 1
#include <ESP8266WiFi.h>

unsigned long timex=0;
const char* ssid = "Freebox";//type your ssid
const char* password = "password";//type your password

int relayPin = 2; // GPIO2 of ESP8266
WiFiServer ESPserver(80);//Service Port
 
void setup() 
{
timex = millis();

Serial.begin(115200);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW);
pinMode(pinLed,OUTPUT);
digitalWrite(pinLed,LOW); 
Serial.println();
Serial.println();
Serial.print("Connecting to: ");
Serial.println(ssid);
 
WiFi.begin(ssid, password);
delay(5000);
 

while (WiFi.status() != WL_CONNECTED) 
{
delay(100);
Serial.print("*");
}
Serial.println("");
Serial.println("WiFi connected");
 
// Start the server
ESPserver.begin();
Serial.println("Server started");
 
// Print the IP address
Serial.print("The URL to control ESP8266: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
}
 
void loop() 
{
timex = millis();  
if (timex>=18000000) digitalWrite(pinLed,HIGH);
if (timex>=36000000) ESP.restart();

// Check if a client has connected
WiFiClient client = ESPserver.available();
if (!client) 
{
return;
}
 
// Wait until the client sends some data
Serial.println("New Client");
while(!client.available())
{
delay(1);
}
 
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
 
// Match the request
 
int value = LOW;
if (request.indexOf("/RELAYON") != -1) 
{
digitalWrite(relayPin, HIGH);
value = HIGH;
delay (400);
digitalWrite(relayPin, LOW);
value = LOW;

} 
/*if (request.indexOf("/RELAYOFF") != -1)
{
digitalWrite(relayPin, LOW);
value = LOW;
}
 */
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); //  IMPORTANT
client.println("<!DOCTYPE HTML>");
client.println("<html>");
 
client.print("relais: ");
 
if(value == LOW) 
{
client.print("fermé");  
} 
else
{
client.print("ouvert");
}
 
delay(1);
//client.stop();
Serial.println("Client disconnected");
Serial.println("");
}

Bonne journée,
Lio

Bonjour
Comment est alimenté l'ESP-01 ?

bonjour,
il est alimenté via l'adaptateur USB-série dont j'ignore le nom.

je place une photo en PJ

Cet adaptateur pissède un régulateur de tension 3,3V qui fait sans doute l'affaire si en amont la source 5V délivre le courant appelé par l'ESP. La piste du défaut d'alimentation sembke pouvoir être écartée.

D'autant que cela fonctionne parfaitement pendant deux jours. Je viens de recharger l'ESP avec la fonction ESP.reset à la place de ESP.restart, je verrais d'ici deux jours!

Il semble que esp.restart fasse un redémarrage plus propre que esp.reset.

Il est possible que le problème vienne de la mémoire, à cause de l’emploi d’une String. Tu devrais envisager la lecture du client avec une c-string (voir l’exemple WiFiClient.ino

  while (client.available()) {
    char ch = static_cast<char>(client.read());
    Serial.print(ch);
  }

Tu peux simplifier ton code : ceci

if(value == LOW)
{
client.print("fermé");  
}
else
{
client.print("ouvert");
}

est équivalent à cela :

client.print((value == LOW) ? "ferme" : "ouvert");

OK. J'ai lu concernant le défaut du reset sur le restart, mais en français : Récupérer automatiquement des redémarrages en boucle du ESP8266
C'est en désespoir de cause que j'essaie restart.

S'agissant des string et simplifications, là, je suis comme une poule devant un oeuf... ça fait 3 mois que je programme, 30 ans que j'ai passé le bac, et tout cela reste du mandarin. Je rêverais de comprendre et d'adapter mes programmes mais je ne trouve rien de suffisamment progressif et pédagogique pour progresser. Alors tout cela reste de l'adaptation de copie.
Mais je prends note. Ce "if...else" va me resservir d'autant qu'il est facile à comprendre.
Pour la partie serveur/client, TCP, UCP, passerelle, et compagnie, j'y arrive plus par hasard qu'autre chose.

Encore merci beaucoup pour la simplification, c'est facile et classe!

J-M-L a fait un très bon tuto sur comment écouter un port asynchrone : lis-le, comprends-le ou pose des questions. Tu devrais pouvoir l'appliquer à ton problème qui stocker le message reçu dans un tableau de char, et ensuite chercher si ce tableau contient tes commandes "RELAYON" ou "RELAYOFF".

C'est vrai que ce n'est pas évident mais tu peux faire un petit code plus simple pour apprendre à t'en servir. Ce code peut lire ce qui vient de la console série (Serial.read), stocker dans un tableau et chercher la correspondance avec tes commandes.

bonjour, je ré-édite le post pour le noté résolu
Encore merci à tous,

après 5 jours de fonctionnement, avec un ESP.reset() programmé toutes les 10 heures, je ne constate plus de perte de connexion wifi. J'en conclue donc que, même si la commande ESP.reset() est moins plébiscitée que la commande ESP.restart() , elle semble faire plus efficacement le travail.
Cette perte de veille, sans perte de connexion, je l'avais déjà observée sur un ESP01 monté avec un DHT22. Il ne me reste plus qu'à intégrer cette commande dans ce petit montage.
Pour informations, le programme est bien celui du premier post, avec ce changement :
à la place de ESP.restart(), lire ESP.reset()
Cette affaire semble donc résolue, même si je ne sais pas comment on l'affiche [résolu]
Bien à vous tous,

Et que donnerait ceci :

if (WiFi.status() != WL_CONNECTION_LOST) ESP. restart();

Restart ou reset, je ne sais pas ce qui est mieux...

Voici la liste des codes WL

typedef enum {
WL_NO_SHIELD = 255, // for compatibility with WiFi Shield library
WL_IDLE_STATUS = 0,
WL_NO_SSID_AVAIL = 1,
WL_SCAN_COMPLETED = 2,
WL_CONNECTED = 3,
WL_CONNECT_FAILED = 4,
WL_CONNECTION_LOST = 5,
WL_DISCONNECTED = 6
} wl_status_t;

Merci pour ce retour

Editer le titre du message initial et ajouter [RESOLU] au début du titre