Go Down

Topic: Connexion ip ESP8266 qui marche quelques minutes (Read 713 times) previous topic - next topic

Topher02

Bonjour les forumeurs et les forumeuses  :D

La question idiote du jour, au sujet de l'ESP8266 (format shield avec usb intégré type Wemos R1 D1 made in chinois), j'ai pas mal galéré mais j'ai réussi à me servir de mon ESP8266 pour piloter une LED (ou récupérer une température) avec le code suivant (pour piloter  une led)

Code: [Select]
#include <ESP8266WiFi.h>
 
const char* ssid = "NOM DU RESEAU";
const char* password = "MP";
 
int ledPin = 16;
WiFiServer server(80);
 
void setup()
{
  // initialisation de la communication série
  Serial.begin(115200);
 
  delay(100);

  // initialisation de la sortie pour la led
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
 
  // Connexion wifi
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);

  // connection  en cours ...
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  // Wifi connecter
  Serial.println("WiFi connecter");
 
  // Démmarrage du serveur.
  server.begin();
  Serial.println("Serveur demarrer !");
 
  // Affichage de l'adresse IP
  Serial.print("Utiliser cette adresse URL pour la connexion :");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
 
}
 
void loop()
{
WiFiClient client;

 
  // Vérification si le client est connecter.
  client = server.available();
  if (!client)
  {
    return;
  }
 
  // Attendre si le client envoie des données ...
  Serial.println("nouveau client");
  while(!client.available()){
    delay(1);
  }
 
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  int value = LOW;
  if (request.indexOf("/LED=ON") != -1)  {
    digitalWrite(ledPin, HIGH); // allumer la led
    value = HIGH;
  }
  if (request.indexOf("/LED=OFF") != -1)  {
    digitalWrite(ledPin, LOW); // éteindre la led
    value = LOW;
  }
 
  // Réponse
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
 
  client.print("Etat de la led : ");
 
  if(value == HIGH) {
    client.print("On");
  } else {
    client.print("Off");
  }
  client.println("<br><br>");
  client.println("<a href=\"/LED=ON\"\"><button>Allumer </button></a>");
  client.println("<a href=\"/LED=OFF\"\"><button>Eteindre </button></a><br />"); 
  client.println("</html>");
 
  delay(1);
  Serial.println("Client deconnecter");
  Serial.println("");
 
}


Une fois le code téléverser, j'appuie sur le bouton reset de l'ESP (sinon ça ne marche pas).

Le code fonctionne bien, j'affiche la page avec l'adresse ip 192.168...... je pilote la led MAIS...

Au bout de quelques minutes, si je tente d'accéder de nouveau à l'adresse ip 192.168....., j'ai la page, échec de la connexion blablablabla.

Je fais un reset et là miracle, ça fonctionne pour x temps puis crash de nouveau.

Je précise que je teste avec la box sur mon bureau (moins d'un mètre donc pas de problème de wifi).

Si quelqu'un à une idée du pourquoi du comment...


Zlika


Topher02

Bonsoir,

Il manque 'client.stop()'
Bonjour Zlika,

Désolé du retard  :smiley-confuse: mais les vacances approchant  :) je suis bien pris par le boulo  :smiley-sad: .

J'ai volontairement supprimer le code client.stop(); car sinon je ne parviens pas à acceder à la page via ip 192.165.....

Code: [Select]
  // fermeture connexion client
  delay(10000);
  client.stop();
  Serial.println("Client deconnecter");
  Serial.println("");


J'ai également essayé avec un delay à 1 mais pas mieux....

Une autre piste ?

lesept

Il y a peut-être un problème ici :
Code: [Select]
  if (!client)
  {
    return;
  }
Si tu passes par ces lignes, c'est fini. Ajoutes un Serial.println avant le return et regarde ce que dit la console. Au besoin ajoute d'autres Serial.println pour tracer l'exécution, tu verras bien à un moment pourquoi ton serveur ne répond plus.

Tu peux copier le contenu de la console dans un futur message pour qu'on l'analyse avec toi.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Topher02

Il y a peut-être un problème ici :
Code: [Select]
 if (!client)
  {
    return;
  }

Si tu passes par ces lignes, c'est fini. Ajoutes un Serial.println avant le return et regarde ce que dit la console. Au besoin ajoute d'autres Serial.println pour tracer l'exécution, tu verras bien à un moment pourquoi ton serveur ne répond plus.

Tu peux copier le contenu de la console dans un futur message pour qu'on l'analyse avec toi.
Bonjour lesept et merci d'essayé de me porter secours  ;) ,

Que dois je mettre dans Serial.println(); car avec cette ligne j'ai des retour chariot et rien ne fonctionne.

Le code que j'ai voulu adapté n'est peut être pas le bon...
Quand je fais un ping 192.165.... j'ai bien un retour de connexion.

Je précise qu'avec client.stop(); j'obtiens ça dans la ligne de commande

Connecting to xxxxx (nom du SSID)
.....WiFi connecter
Serveur demarrer !
Utiliser cette adresse URL pour la connexion:http://192.168.xxxx/ (adresse ip de connection)
nouveau client
GET / HTTP/1.1
Client deconnecter

nouveau client
GET / HTTP/1.1
Client deconnecter

En gros il se connecte et se déconnecte instantanément quand je tente une connexion via mon navigateur firefox...

Si je ne mets pas client.stop(); , parfois j'obtiens
Connecting to xxxxx (nom du SSID)
.....WiFi connecter
Serveur demarrer !
Utiliser cette adresse URL pour la connexion:http://192.168.xxxx/ (adresse ip de connection)
nouveau client
GET / HTTP/1.1

Et j'arrive à piloter ma led puis au bout d'un certains temps, plus d'accès à l'ESP.

Quand ma maison sera totalement rénové le problème ne se posera plus, se sera carte uno ou mega + shield ethernet mais pour le moment j'aurais besoin de 2 ESP...

Pour info j'ai fais l'essai avec un deuxième ESP et j'ai le même problème.

Help me

Zlika

Bonjour,

je me demande si le fait de ne pas faire de client.stop() ne pose pas un problème de libération des ressources à chaque nouvelle connexion.

lesept

Quote
Que dois je mettre dans Serial.println(); car avec cette ligne j'ai des retour chariot et rien ne fonctionne.
Oui, bien sûr : je proposais de mettre des messages qui te disent par où le programme passe. Pour ce cas précis tu peux mettre par exemple :
Code: [Select]
if (!client)
  {
    Serial.println("Passage par !client");
    return;
  }


Essaye de déplacer cette ligne avant le setup (voir l'exemple ici) :
Code: [Select]
WiFiClient client;
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

al1fch

#7
Dec 17, 2018, 09:50 am Last Edit: Dec 17, 2018, 09:50 am by al1fch
Bonjour

Essayer d'obtenir plus d'informations en utilisant dans le menu OUTILS une des options de DEBUG_LEVEL, comme par exemple HTTP_SERVER

Topher02

Oui, bien sûr : je proposais de mettre des messages qui te disent par où le programme passe. Pour ce cas précis tu peux mettre par exemple :
Code: [Select]
if (!client)
  {
    Serial.println("Passage par !client");
    return;
  }


Essaye de déplacer cette ligne avant le setup (voir l'exemple ici) :
Code: [Select]
WiFiClient client;
Oui, bien sûr : je proposais de mettre des messages qui te disent par où le programme passe. Pour ce cas précis tu peux mettre par exemple :
Code: [Select]
if (!client)
  {
    Serial.println("Passage par !client");
    return;
  }


Essaye de déplacer cette ligne avant le setup (voir l'exemple ici) :
Code: [Select]
WiFiClient client;
Bonjour lesept et al1fch,

J'ai déplacé WiFiClient client; c'est plus stable au démarrage mais ça ne résout pas le problème.

avec Serial.println("Passage par !client"); j'obtiens 0 tant que je ne tape pas 192.165... et j'obtiens 1 si je suis connecté.

Je me demande si il ne faut pas câbler "physiquement". Pour rappel (ou info) il n'y a rien de brancher sur mon ESP8266 (j'effectue seulement des test à blanc pour le moment).


J'ai comme l'impression que mon programme se fige.
Si je fais un reset physique (via le bouton) mon programme repart et je peux de nouveaux piloter l'ESP8266 via l'ip 192.165...

N'y a t-il pas un paramètre dans l'ESP qui le mettrais en "veille" si on ne le sollicite pas au bout de x secondes ou minutes ?

Pour al1fch, j'ai essayé d'utiliser dans le menu OUTILS une des options de DEBUG_LEVEL, comme par exemple HTTP_SERVER mais je n'ai aucune info supplémentaire (ou je ne l'ai pas vu).

Merci de votre aide

al1fch

#9
Dec 18, 2018, 01:18 pm Last Edit: Dec 18, 2018, 02:12 pm by al1fch
pas de mise en veille automatique de l'ESP8266 non sollicité

l'information de débugagge revient en principe (en activant Debug Port : Serial) dans le terminal de l'IDE Arduino pendant l'exécution du programme, il faut donc la connection série avec le PC via USB

Le_Joebar

Salut je me heurte a un problème légèrement similaire.

Je n'ai pas encore eu le temps de vérifier ma solution mais elle serais la suivante.

Dans mon cas je vérifie l'état de mon système en envoyant une demande wifi vers l'esp toutes les 5 sec.
si l'état a changer je fais faire a l'esp un envois de mail et un message push.

Pendant ce temps ma requête d'état continue a ce faire. c'est a ce moment que l'ESP se plante et message d'erreur via le port serial  seul après une 40 de sec.

J'en déduit que si l'esp envoie un message vers gmail ou autre et qu'il reçoit une requête en même temps cela bloque dans le programme quelque part.

Pour ce faire je vais tente d'empêche l esp de recevoir une requête mais je ne sais pas encore comment je vais m'y prendre.

Topher02

pas de mise en veille automatique de l'ESP8266 non sollicité

l'information de débugagge revient en principe (en activant Debug Port : Serial) dans le terminal de l'IDE Arduino pendant l'exécution du programme, il faut donc la connection série avec le PC via USB
Bonjour al1fch

Avec le debug j'obtiens

Connecting to NOM SSID
scandone
scandone
state: 0 -> 2 (b0)
state: 2 -> 0 (2)
reconnect
scandone
state: 0 -> 2 (b0)
.state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 1
cnt
.
connected with NOM SSID, channel 6
dhcp client start...
.....ip:WEMOS,mask:RESEAU,gw:IP DE MA BOX
.WiFi connecter
Serveur demarrer !
Utiliser cette adresse URL pour la connexion :http://192.xxxxxx
nouveau client
GET /LED=Off HTTP/1.1
Client deconnecter

nouveau client
GET /favicon.ico HTTP/1.1
Client deconnecter

pm open,type:2 0
nouveau client
GET /LED=ON HTTP/1.1
Client deconnecter

nouveau client
GET /favicon.ico HTTP/1.1
Client deconnecter

nouveau client
GET /LED=OFF HTTP/1.1
Client deconnecter

nouveau client
GET /favicon.ico HTTP/1.1
Client deconnecter

nouveau client
GET /LED=ON HTTP/1.1
Client deconnecter

nouveau client
GET /LED=OFF HTTP/1.1
Client deconnecter

nouveau client
GET /favicon.ico HTTP/1.1
Client deconnecter

nouveau client
GET /LED=ON HTTP/1.1
Client deconnecter

Après plusieurs appui sur ON / OFF de la page Web cela fonctionne et si j'attends une dizaine de secondes avant de faire un ON ou OFF, la page web deviens inaccessible et le port série ne fait plus rien (pas de message).

Si je fais un reset physique ça fonctionne de nouveau... Je déprime :( ...

Comment insérer un ESP.restart(); si et seulement si la page deviens inaccessible ? (je sais c'est moche comme méthode mais je n'en vois pas d'autre)

al1fch

#12
Dec 18, 2018, 07:24 pm Last Edit: Dec 18, 2018, 07:52 pm by al1fch
quel est le dernier code testé ? Peux-tu le copier içi ?

Curieux : le code du message 1 testé chez moi sans amélioration ou correction  et avec pour seule modification le passage de la led en sortie 2,  fonctionne sans décrocher après une  attente de plusieurs minutes  entre appuis sur les boutons Allumer ou Eteindre

carte : Wemos D1 Mini, navigateur Firefox sous Linux Ubuntu


Topher02

quel est le dernier code testé ? Peux-tu le copier içi ?

Curieux : le code du message 1 testé chez moi sans amélioration ou correction  et avec pour seule modification le passage de la led en sortie 2,  fonctionne sans décrocher après une  attente de plusieurs minutes  entre appuis sur les boutons Allumer ou Eteindre

carte : Wemos D1 Mini, navigateur Firefox sous Linux Ubuntu


Bonjour al1fch,

Je sais plus exactement quel code j'ai utilisé à force de le modifier.
J'ai repris le 1er et changer la sortie.

Quand j'appuie sur allumer cela éteint la LED et quand j'appuie sur éteindre ça s'allume...
Au bout de quelques secondes ça bloque et plus d'accès à l'ip sauf si reset physique.

Par contre j'ai avancé de mon coté et cela à l'air de venir du SKD (je ne sais pas se que c'est)

Il existe également un "mode veille" pour le wifi (et non de l'ESP par lui même), j'ai fais des test mais toujours le même problème.

Voici le lien (en anglais traduit avec google).

Je ne comprends toujours pas comment régler mon problème donc si quelqu'un arrive à comprendre, je suis preneur...

A priori on peut mètre le SDK à jours mais comment... Mon anglais est (très) limité.

https://translate.googleusercontent.com/translate_c?depth=1&hl=fr&rurl=translate.google.fr&sl=en&sp=nmt4&tl=fr&u=https://github.com/esp8266/Arduino/issues/4485&xid=17259,15700021,15700124,15700149,15700186,15700190,15700201,15700237,15700242&usg=ALkJrhiAIekO__3uJxdW9M4SmKFfg79BAg

Je suis peut être passé à coté de quelque chose, ça fait 3 jour que je me couche à minuit et bébé nous réveil à 5h00 donc je suis un peu fatigué ;)

al1fch

#14
Dec 19, 2018, 04:10 pm Last Edit: Dec 19, 2018, 04:13 pm by al1fch
Bonjour

je n'arrive pas à reproduire le défaut, ça liite les possibilités d'aide...
hier après une heure sans action sur les boutons de la page web j'ai pu continuer à agir sur la led, l'ESP8266 étit toujours prèt à répondre aux requètes.

Quand et comment as-tu installé 'Arduino pour ESP8266' ?

Pour information :

j'utilise maintenant exclusivement le Board Manager de l'IDE ARduino pour instalaller puis mettre à jour les outils pour ESP8266. ci dessous la version actuellement  active et les versions antérieures vers lesquelles ont peut rétrograder :


La compilation  du code testé (code du message 1 à part la sortie LED) a été effectuée avec les paramètres suivants :

Le SDK est une collection de fonctions fournies par Espressif pour accéder aux ressources de la puce.
Ce SDK, appelé IDF,  évolue assez rapidement : il est corrigé , enrichi....
Les outils pour IDE Arduino apportent une couche supplémentaire de fonctions pour que l'on retrouve nos habitudes.   Ces outils sont révisés pour s'adapter aux révisons du SDK.


Go Up