Soft WDT reset

Bonjour,

Voilà plusieurs jours que je n'arrive pas à venir à bout d'une erreur.
Le moniteur série affiche le déroulement de mon programme puis ce dernier bloque et les lignes ci-dessous en rouge sont affichées à la suite.
[b]
Le véhicule garé est bien en son droit
Voiture toujours garée -> Distance: 2089.81

[color=red]Soft WDT reset

ctx: cont 
sp: 3fff0e30 end: 3fff1110 offset: 01b0

>>>stack>>>
3fff0fe0:  3ffefddc 00000200 3fff100b 31207ff4  
3fff0ff0:  3fff12e4 00000218 00000218 3fff12e4  
3fff1000:  00009480 3ffef37c 00000000 4010053d  
3fff1010:  00009474 000010c0 00000218 00000218  
3fff1020:  3fff0024 00000001 3fff0024 3fff1080  
3fff1030:  00009480 3ffef37c 3ffef37c 4020843b  
3fff1040:  00009470 00000001 3ffef37c 40208487  
3fff1050:  3fff0024 00000007 3ffef37c 4020874b  
3fff1060:  3fff0024 3ffef388 45029cf6 3ffef37c  
3fff1070:  3fff0024 3ffef388 45029cf6 402087c8  
3fff1080:  3ffe00ff 7f6dc00f 45029cf6 40203235  
3fff1090:  41e73333 3ffef388 45029cf6 40202629  
3fff10a0:  3ffe8b88 00000000 000003e8 40207f58  
3fff10b0:  2e646462 00747874 00000000 40202200  
3fff10c0:  3fff2b4c feefeffe 40208e9c 40208e88  
3fff10d0:  3ffef3bc 00000019 00000000 feefeffe  
3fff10e0:  00000000 00000000 00000001 3fff00e4  
3fff10f0:  3fffdad0 00000000 3fff00dc 40208c54  
3fff1100:  feefeffe feefeffe 3fff00f0 4010070c  
<<<stack<<<
?)⸮(⸮⸮⸮[/color][/b]

En pièce jointe le code complet si besoin

 
      //Lecture du fichier
      Serial.println("Ouverture du fichier en mode lecture");
      if (!(BDD = SD.open("bdd.txt", FILE_READ))) { //test d'ouverture du fichier ??????????
        Serial.println("Erreur de fichier");
        return; //Arrête le programme ????????tester ca en changeant le nom du fichier
      }
      Serial.println("Fichier ouvert");
      while (c != -1) {//Tant qu'il ya des
        c = BDD.read(); //on lit un caractère
       //yield();//remet à zero le WDT
        if (c == ':') { //si : on affiche la valeur de test
          Serial.println(test); //affichage sur le moniteur ENLEVEEEEEER
          Serial.println(identifiant);// ENLEVEEEEEEEEEEEEER

          //IDENTIFIANT VALIDE :
          if (test == identifiant) {
            IdentifiantValide = true; //Le booléen est mis à jour pour signifier que l'identifiant est valide
            Serial.println("Le véhicule garé est bien en son droit");//ENLEVEEEEEEEEEEEER
            digitalWrite(LV, HIGH); //On allume la LED verte pour signifier à l'automobiliste qu'il est en son droit
            while (distance_mm  < 700) {//Tant que la voiture est garée
              delay (1000);//Le capteur à ultrason vérifiera la présence de voitures toutes les secondes
              /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
              digitalWrite(TRIG, HIGH);
              delayMicroseconds(10);
              digitalWrite(TRIG, LOW);
              /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
              measure = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT);
              distance_mm = measure / 2.0 * SOUND_SPEED; // ???????????? Calcul la distance à partir du temps mesuré
              /* 3. Calcul la distance à partir du temps mesuré */
              Serial.print("Voiture toujours garée -> Distance: ");//ENLEVEEEEEEEEEEER
              Serial.println(distance_mm);//ENLEVEEEEEEEEEEEEEEEER
            }
            digitalWrite(LV, LOW); //On éteint la LED quand la voiture sort de la place
            test = ""; //On vide la variable de stockage de l'identifiant lu sur la carte SD
          }
          else {
            Serial.println("pas de correspondance ID");//ENLEVEEEEEEEEER
            test = ""; //On vide la variable de stockage de l'identifiant lu sur la carte SD
          }
        }
        else { // sinon
          test += c; //on ajoute le caractère à la chaîne
        }
      }
      //IDENTIFIANT INVALIDE;
      if (IdentifiantValide == false) //Si l'identifiant lu sur la carte RFID n'est pas valide
      {
        Serial.println("Le véhicule est en infraction");//ENLEVEEEEEEEEEEEER
        digitalWrite(LR, HIGH); //On allume la LED rouge pour signifier à l'automobiliste qu'il n'est pas en son droit
        while (distance_mm  < 700) {//Tant que la voiture est garée
          delay (1000);//Le capteur à ultrason vérifiera la présence de voitures toutes les secondes
          /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
          digitalWrite(TRIG, HIGH);
          delayMicroseconds(10);
          digitalWrite(TRIG, LOW);
          /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
          long measure = measure = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT);
          float distance_mm = measure / 2.0 * SOUND_SPEED; // ???????????? Calcul la distance à partir du temps mesuré
          /* 3. Calcul la distance à partir du temps mesuré */
          Serial.print("Voiture toujours garée -> Distance: ");//ENLEVEEEEEEEEEEER
          Serial.println(distance_mm);//ENLEVEEEEEEEEEEEEEEEER
        }
        digitalWrite(LR, LOW); //On éteint la LED quand la voiture sort de la place
      }

      BDD.close(); //Fermeture du fichier
      Serial.println("Fichier fermé");
      identifiant = ""; //On vide la variable de stockage de l'identifiant lu sur la carte RDIF
      c = 0; //On réinitialise la variable de lecture
      IdentifiantValide = false; //On réinitialise le booléen (on le remet par défaut en mode :"identifiant invalide")
    }
    else {
      Serial.println("Le véhicule est en infraction");//ENLEVEEEEEEEEEEEER
      digitalWrite(LR, HIGH); //On allume la LED rouge pour signifier à l'automobiliste qu'il n'est pas en son droit
      while (distance_mm  < 700) {//Tant que la voiture est garée
        delay (1000);//Le capteur à ultrason vérifiera la présence de voitures toutes les secondes
        /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
        digitalWrite(TRIG, HIGH);
        delayMicroseconds(10);
        digitalWrite(TRIG, LOW);
        /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
        measure = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT);
        distance_mm = measure / 2.0 * SOUND_SPEED; // ???????????? Calcul la distance à partir du temps mesuré
        /* 3. Calcul la distance à partir du temps mesuré */
        Serial.print("Voiture toujours garée -> Distance: ");//ENLEVEEEEEEEEEEER
        Serial.println(distance_mm);//ENLEVEEEEEEEEEEEEEEEER
      }
      digitalWrite(LR, LOW); //On éteint la LED quand la voiture sort de la place
    }
  }
  else
  {
    Serial.println("Voiture non présente");
  }
  delay(1000);//Le capteur à ultrason vérifiera la présence de voitures toutes les secondes
}

J’ai déjà essayé d’insérer yield(); à plusieurs endroit notamment après la lecture dans la carte SD comme laissé en commentaire dans la boucle while (c != -1) mais cela a seulement pour effet de ne plus afficher les lignes en rouge ci-dessus, toutefois bien que l’erreur ne soit plus affichée dans le moniteur série le programme bloque toujours au même endroit.

Merci d’avance pour votre aide

VersionFinale06.01.ino (11.8 KB)

Bonjour et Bienvenue

Pour augmenter les chances d'aide il faut documenter davantage sa demande (voir la Règle du Forum pour les éléments à fournir)

On ne voit pas les élements en rouge dans une partie entre balises "code" !!

Pour ce qui est du déclenchement du chien de garde par la 'pile WiFi', du rôle bénéfique de delay() ou yield() dans le cas particullier de l'ESP8266 voici la référence que tu connais peut être déjà :
https://arduino-esp8266.readthedocs.io/en/2.6.3/reference.html#timing-and-delays

Remember that there is a lot of code that needs to run on the chip besides the sketch when WiFi is connected.

WiFi and TCP/IP libraries get a chance to handle any pending events each time the loop() function completes, OR when delay is called.

If you have a loop somewhere in your sketch that takes a lot of time (>50ms) without calling delay, you might consider adding a call to delay function to keep the WiFi stack running smoothly.

On peut utiliser içi delay(0) ou son synonyme yield()

-avec un time out de 25mS Pulsin parait hors de cause, on est en dessous des 50ms fatidiques
-se pourrait-il que la gestion de la carte SD monopolise parfois l'ESP8266 pendant plus de 50ms et provoque ainsi le réveil du chien de garde ?
-SD.begin a mettre dans setup() plutôt que dans loop()
-pas certain que D10 soit un bon choix pour le CS de la carte SD....

Bonjour Strs94,

Strs94:

Soft WDT reset

ctx: cont
sp: 3fff0e30 end: 3fff1110 offset: 01b0

stack>>>

Ce n'est pas une erreur mais le watchdog software qui se déclenche.
Vous devez avoir un traitement bloquant trop long quelque part.

Il FAUT indiquer le type de carte que vous utilisez ( entre autres détails).

Cordialement,
bidouilleelec

Je pense qu’il y a des erreurs dans ton code, mais que ce ne sont pas elles qui provoquent l’erreur :

Il faut initialiser ‘identifiant’ à chaque fois que le lecteur RFID est activé, sinon, tu ne pourras pas reconnaître l’identifiant. Donc ajouter

identifiant="";

après la ligne 81

if (distance_mm  < 700)//On teste la présence d'un véhicule à moins de 7cm (portée de la carte RFID)????????????

700 mm vaut 70 cm, pas 7 cm.

Lignes 121 et 151 :

delay (1000);

C’est peut-être ce qui provoque l’erreur WDT. Changer par

unsigned long chrono = millis();
while (millis()-chrono < 1000ul) yield();

EDIT : Al1 me fait remarquer que le delay de l’ESP8266 fait déjà ça, pour éviter justement le problème du WDT… Donc pas la peine de changer le delay.

Enfin ligne 49 : éviter de mettre un password en clair dans un listing sur internet…

la fonction delay(ms) pour ESP8266 sous IDE Arduino est içi (lignes 46 à 57)

Rien à voir avec le while(ms--) bloquant, du delay() pour AVR/Arduino, qui a forgé nos habitudes ! !