IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Erreur "Soft WDT" reset sur Arduino


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Erreur "Soft WDT" reset sur Arduino
    Bonjour,

    J'ai réalisé un code sur Arduino qui marchait parfaitement sur une carte UNO et qui provoque cette erreur sur une carte D1 après avoir fonctionné parfaitement (au passage de la main devant le capteur ultrason et de la carte rfid avec le bon identifiant devant le lecteur rfid)

    Distance: 1877.82Voiture non présente
    Distance: 41.31Voiture présente
    Distance: 34.34Voiture garée
    Pas de données détectées
    Distance: 36.89Voiture présente
    Distance: 1849.77Voiture partie
    Distance: 1853.85Voiture non présente
    Distance: 1057.06Voiture non présente
    Distance: 34.34Voiture présente
    Distance: 68.17Voiture garée
    Initialisation.....
    Communication réussie
    Le fichier bdd.txt existe
    Ouverture du fichier en mode lecture
    Fichier ouvert
    12658459865897851256845987
    24950484853486951685255533
    pas de correspondance
    35452354568745232458654568
    24950484853486951685255533
    pas de correspondance
    10941521687465135756789878
    24950484853486951685255533
    pas de correspondance
    78945123565165594651657886
    24950484853486951685255533
    pas de correspondance
    56487984521365600465415146
    24950484853486951685255533
    pas de correspondance
    12357684156579878654165468
    24950484853486951685255533
    pas de correspondance
    10241320484516879846512321
    24950484853486951685255533
    pas de correspondance
    10210123245646515789416546
    24950484853486951685255533
    pas de correspondance
    12565106511561516516515153
    24950484853486951685255533
    pas de correspondance
    45615643213553165746515876
    24950484853486951685255533
    pas de correspondance
    15634563215843216874321003
    24950484853486951685255533
    pas de correspondance
    20461357632157845414567655
    24950484853486951685255533
    pas de correspondance
    24950484853486951685255533
    24950484853486951685255533
    Le véhicule garé est bien en son droit

    Soft WDT reset

    ctx: cont
    sp: 3ffefbf0 end: 3ffefeb0 offset: 01b0

    >>>stack>>>
    3ffefda0: 0000ad90 3ffeea5c 00000000 4010053d
    3ffefdb0: 0000ad84 00000a20 00000144 00000144
    3ffefdc0: 00000000 3ffe84cc 00002120 3ffefe20
    3ffefdd0: 0000ad90 3ffeea5c 3ffeea5c 40204d57
    3ffefde0: 0000ad80 00000001 3ffeea5c 40204da3
    3ffefdf0: 40104b30 008b50f5 3ffeea5c 40204e87
    3ffefe00: 3ffeea68 3ffeea5c 3ffeedc8 3ffeea74
    3ffefe10: 3ffeea68 3ffeea5c 3ffeedc8 40204ec0
    3ffefe20: 3ffe00ff 00001388 00001388 40202ebd
    3ffefe30: 3ffeea68 3ffeea5c 3ffeedc8 4020233f
    3ffefe40: 3ffe8a20 00000000 000003e8 3fff1154
    3ffefe50: 2e646462 00747874 00000000 3ffeee00
    3ffefe60: 3fff0de4 00000001 3ffeedc8 40204864
    3ffefe70: 3ffeea9c 0000001c 00000000 40201404
    3ffefe80: 00000000 00000000 00000001 3ffeee80
    3ffefe90: 3fffdad0 00000000 3ffeee78 4020505c
    3ffefea0: feefeffe feefeffe 3ffeee90 4010070c
    <<<stack<<<
    H!⸮⸮⸮⸮⸮`⸮
    Soft WDT reset

    ctx: cont
    sp: 3ffefbf0 end: 3ffefeb0 offset: 01b0

    >>>stack>>>
    3ffefda0: 0000ad90 3ffeea5c 00000000 4010053d
    3ffefdb0: 0000ad84 00000a20 00000144 00000144
    3ffefdc0: 00000000 3ffe84cc 00002120 3ffefe20
    3ffefdd0: 0000ad90 3ffeea5c 3ffeea5c 40204d57
    3ffefde0: 0000ad80 00000001 3ffeea5c 40204da3
    3ffefdf0: 40104b30 008b50f5 3ffeea5c 40204e87
    3ffefe00: 3ffeea68 3ffeea5c 3ffeedc8 3ffeea74
    3ffefe10: 3ffeea68 3ffeea5c 3ffeedc8 40204ec0
    3ffefe20: 3ffe00ff 00001388 00001388 40202ebd
    3ffefe30: 3ffeea68 3ffeea5c 3ffeedc8 4020233f
    3ffefe40: 3ffe8a20 00000000 000003e8 3fff1154
    3ffefe50: 2e646462 00747874 00000000 3ffeee00
    3ffefe60: 3fff0de4 00000001 3ffeedc8 40204864
    3ffefe70: 3ffeea9c 0000001c 00000000 40201404
    3ffefe80: 00000000 00000000 00000001 3ffeee80
    3ffefe90: 3fffdad0 00000000 3ffeee78 4020505c
    3ffefea0: feefeffe feefeffe 3ffeee90 4010070c
    <<<stack<<<
    H!⸮⸮⸮⸮⸮`⸮


    [/B]


    Voici le code en question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    #include <SoftwareSerial.h>
    #include <SPI.h> //Librairie pour la communication SPI ??????????????????????????
    #include <SD.h>  //Librairie pour la communication avec la carte SD
     
    //Déclaration
     
    SoftwareSerial lecteurRFID(D5, D6); //Définition du port du lecteur RFID
     
    bool IdentifiantValide = false;
     
    //Variables pour les LED
    const int LV = D2;
    const int LR = D8;
     
    //Variables pour le capteur ultrason
    const byte TRIG = D4; // Broche TRIGGER
    const byte ECHO = D3;    // Broche ECHO
    const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s //COMPRENDRE BIEEEEEEEEEEEN
    const float SOUND_SPEED = 340.0 / 1000;
     
    //Variables de stockage
    File BDD; //Fichier contenant la base de donnée
    String identifiant = ""; //variable de stockage de l'identifiant lu sur la carte RFID
    String test = ""; //variable de stockage des identifiants sur la carte BDD de la carte SD
    char c = 0; //variable de lecture
     
    void setup()
    {
      lecteurRFID.begin(9600);//initialisation de la communication avec le port SoftSerial?????????
      Serial.begin(9600);//initialisation de la communication avec le moniteur série
      pinMode(LV, OUTPUT); //initialisation de la broche LV=4 comme sortie
      pinMode(LR, OUTPUT); //initialisation de la broche LR=8 comme sortie
      pinMode(TRIG, OUTPUT);//initialisation de la broche TRIG=3 comme sortie
      digitalWrite(TRIG, LOW); //La broche TRIGGER doit être à LOW au repos
      pinMode(ECHO, INPUT);//initialisation de la broche ECHO=2 comme sortie
    }
    void loop()
    {
      //////////////1. DETECTION PRESENCE DU VEHICULE
      //1ère détection
      /* 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("Distance: ");//ENLEVEEEEEEEEEEER
      Serial.print(distance_mm);//ENLEVEEEEEEEEEEEEEEEER
     
      if (distance_mm  < 700)//On teste la présence d'un véhicule à moins de 7cm (portée de la carte RFID)????????????
      {
        Serial.println("Voiture présente");
     
        //2ème détection : on vérifie que la voiture soit toujours là après 5 secondes pour être sûrs que l'automobiliste s'est bien garé
        delay(5000);
     
        digitalWrite(TRIG, HIGH);
        delayMicroseconds(10);
        digitalWrite(TRIG, LOW);
     
        long measure2 = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT);
        float distance2_mm = measure2 / 2.0 * SOUND_SPEED; //
        Serial.print("Distance: ");//ENLEVEEEEEEEEEEER
        Serial.print(distance2_mm);//ENLEVEEEEEEEEEEEEEEEER
     
     
     ////////////// PRESENCE D'UN VEHICULE
        if (distance2_mm  < 700)
        {
          Serial.println("Voiture garée");
            //////////////2. LECTURE DE L'IDENTIFIANT SUR LA CARTE RFID
     
      if (lecteurRFID.available())// if date is coming from software serial port ==> data is coming from SoftSerial shield
      {
        while (identifiant.length() < 26) //tant que notre variable n'a pas la taille d'un identifiant RFID (26 caractères)
        {
          identifiant += lecteurRFID.read();     //On écrit l'identifiant dans notre variable de stockage
        }
        /////////////2. VERIFICATION DE L'IDENTIFIANT : on cherche à savoir si l'identifiant lu sur la carte RFID est bien celui d'un handicapé
     
        Serial.println("Initialisation.....");
        if (!SD.begin(D10)) {//test de la communication avec la carte sur le pin 10 (CS) ////DECLARER AUTRE PART????????????????????????????????,
          Serial.println("Communication impossible");
          return; //Arrête le programme
        }
        Serial.println("Communication réussie");
     
        if (SD.exists("bdd.txt")) {
          Serial.println("Le fichier bdd.txt existe");
        } else {
          Serial.println("Le fichier bdd.txt n'existe pas");
          return; //Arrête le programme ???????????????????????????????????????
        }
        //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
          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
              delay(5000);//On laisse la LED allumée 1 seconde ???????????????
              digitalWrite(LV, LOW); //On éteint la LED
              test = ""; //On vide la variable de stockage de l'identifiant lu sur la carte SD
            }
            else {
              Serial.println("pas de correspondance");//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 rouge58 pour signifier à l'automobiliste qu'il est en son droit
          delay(5000);//On laisse la LED allumée 1 seconde ???????????????
          digitalWrite(LR, LOW); //On éteint la LED
        }
        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("Pas de données détectées");//ENLEVEEEEEER
      }
        }
        else
          Serial.println("Voiture partie");
      }
      else
      {
        Serial.println("Voiture non présente");
      }
      delay(1000);//Le capteur à ultrason vérifiera la présence de voitures toutes les secondes
    }
    Merci d'avance pour votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Un D1 ne se comporte pas comme un UNO, le watchdog est activé par défaut et remis à zéro lors d’appel à delay() et à chaque tour de loop()
    Si vous restez bloqué trop longtemps sans faire appel à delay() mais sans boucler, votre watchdog va se déclencher, c’est sans doute ce qui vous arrive.

    Pour corriger cela il faut trouver les zones où le code risque de rester coincé «*longtemps*» et rajouter un appel à yield() qui va remettre à zéro le WDT

    Ici votre recherche dans la BDD est lente, je vous suggère de rajouter un appel à yield()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        while (c != -1) {//Tant qu'il ya des
          c = BDD.read(); //on lit un caractère
          if (c == ':') { //si : on affiche la valeur de test
            Serial.println(test); //affichage sur le moniteur ENLEVEEEEEER
            Serial.println(identifiant);// ENLEVEEEEEEEEEEEEER
            yield(); // caresser le chien (WDT) dans le sens du poil
    ...
    dans cette boucle par exemple après lecture d’un N° complet (voire si ça ne fonctionne pas, éventuellement après chaque lecture de caractère - mais vu que vos codes ne sont pas très long ça devrait aller)

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci pour votre réponse cela m'a éclairé sur la nature du problème.
    Malheureusement, en appelant yield() après lecture d'un numéro entier, l'erreur est toujours présente et affichée dans le moniteur série. Je vous insère ici la nouvelle version du code que j'avais modifié entre temps (avec en plus l'appel de yield() rajouté ligne 109 après la lecture cette fois de chaque caractère)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    #include <SoftwareSerial.h>
    #include <SPI.h> //Librairie pour la communication SPI 
    #include <SD.h>  //Librairie pour la communication avec la carte SD
    #include <ESP8266WebServer.h>
    #include <ESP8266HTTPClient.h>
    #include <ESP8266WiFi.h>
     
    //Variables pour la transmission de donnée par WIFI
    String MY_IP;
    String MY_SSID;
    String MY_PWD;
    String cheminphoto = "";
     
    ESP8266WebServer server (80); // Serveur web
     
    SoftwareSerial lecteurRFID(D5, D6); //Définition du port du lecteur RFID
     
    bool IdentifiantValide = false;
     
    //Constantes pour les LED
    const int LV = D2;
    const int LR = D6;
     
    //Constantes pour le capteur ultrason
    const byte TRIG = D9; // Broche TRIGGER
    const byte ECHO = D8;    // Broche ECHO
    const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s //COMPRENDRE BIEEEEEEEEEEEN
    const float SOUND_SPEED = 340.0 / 1000;
     
    //Variables de stockage
    File BDD; //Fichier contenant la base de donnée
    String identifiant = ""; //variable de stockage de l'identifiant lu sur la carte RFID
    String test = ""; //variable de stockage des identifiants sur la carte BDD de la carte SD
    char c = 0; //variable de lecture
     
    void setup()
    {
      lecteurRFID.begin(9600);//initialisation de la communication avec le port SoftSerial?????????
      Serial.begin(9600);//initialisation de la communication avec le moniteur série
      pinMode(LV, OUTPUT); //initialisation de la broche LV=4 comme sortie
      pinMode(LR, OUTPUT); //initialisation de la broche LR=8 comme sortie
      pinMode(TRIG, OUTPUT);//initialisation de la broche TRIG=3 comme sortie
      digitalWrite(TRIG, LOW); //La broche TRIGGER doit être à LOW au repos
      pinMode(ECHO, INPUT);//initialisation de la broche ECHO=2 comme sortie
     
      //TRANSMISSION DONNES PAR WIFI
      //////// GESTION CONNEXION
      connect_STA("iPhone de Sophia", "groupei1"); //On connecte la carte D1 à un réseau WiFi (SSID,mdp)
      //////// GESTION SERVEUR
      server.on ( "/", handleRoot);
      server.on ( "/page1", handlePage1); ///////////2ème page
      server.begin();
      Serial.println ( "Serveur http démarré" );
    }
     
    void loop()
    {
      server.handleClient();//traitement des demandes reçues??????????
     
      //////////////1. DETECTION PRESENCE DU VEHICULE
      /* 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 = 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("Distance: ");//ENLEVEEEEEEEEEEER
      Serial.print(distance_mm);//ENLEVEEEEEEEEEEEEEEEER
     
      if (distance_mm  < 700)//On teste la présence d'un véhicule à moins de 7cm (portée de la carte RFID)????????????
      {
        Serial.println("Voiture présente");
     
        //////////////2. LECTURE DE L'IDENTIFIANT SUR LA CARTE RFID
     
        if (lecteurRFID.available())// if date is coming from software serial port ==> data is coming from SoftSerial shield
        {
          while (identifiant.length() < 26) //tant que notre variable n'a pas la taille d'un identifiant RFID (26 caractères)
          {
            identifiant += lecteurRFID.read();//On écrit l'identifiant dans notre variable de stockage
          }
          /////////////2. VERIFICATION DE L'IDENTIFIANT : on cherche à savoir si l'identifiant lu sur la carte RFID est bien celui d'un handicapé
     
          Serial.println("Initialisation.....");
          if (!SD.begin(D10)) {//test de la communication avec la carte sur le pin 10 (CS) ////DECLARER AUTRE PART????????????????????????????????,
            Serial.println("Communication avec la carte SD impossible");
            return; //Arrête le programme
          }
          Serial.println("Communication avec la carte SD réussie");
     
          if (SD.exists("bdd.txt")) {
            Serial.println("Le fichier bdd.txt existe");
          } else {
            Serial.println("Le fichier bdd.txt n'existe pas");
            return; //Arrête le programme ???????????????????????????????????????
          }
          //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
          }
          cheminphoto = cheminphoto + "<li> <img src='https://tse3.mm.bing.net/th?id=OIP.CPr6bSGNMJxP8bbCt79XwwHaEK&pid=Api'> </li>"; //On écrit (en indiquant qu'il s'agit d'une puce de la liste) le code html permettant d'afficher la photo de l'infraction dont on renseigne le chemin d'accès
          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
    }
     
     
     
    ////////// GESTION ENTETE HTTP
     
    void handleRoot() {
     
      server.send ( 200, "text/html", getPage() );//
     
      delay(10);
     
    }
     
    void handlePage1() {
      server.send(200, "text/html", getPage()); // ..mise en place de la page html?????
      delay(10);
    }
     
    //TRANSMISSION DE DONNES PAR WIFI
     
    ////////// PAGE WEB
     
    String getPage() { //Ecriture de la page web
      String  page = "";
     
      page += "<!DOCTYPE html>";
     
      page += "<html>"; //balise principale du code
     
      page += "<head> <title> Liste des fraudes </title> </head>";//la balise title définit le titre de la page web
     
      page += "<body>";
     
      page += "<h1> Liste des infractions: </h1>";//balise utilisée pour mettre en valeur un titre important
     
      page += "<ol>"; //balise qui indique le début d'une liste à puce automatiquement numérotée
     
      page += cheminphoto; //variable qui contiendra la balise html permettant l'affichage de la photo de l'infraction contenue dans la carte SD
      //Remplacer le chemin par SD.open(image, FILE_READ);
     
      page += "</ol>"; //indique la fin de la liste
     
      page += "</body>";
     
      page += "</html>";
     
      return page;
     
    }
     
     
    ////////// GESTION DU MODE STATION (si utilisé)
     
    void connect_STA(const char *ssid, const char *password ) {
     
      Serial.begin(9600);
     
      WiFi.mode(WIFI_STA);
     
      WiFi.begin ( ssid, password ); // ssid & password private
     
      while ( WiFi.status() != WL_CONNECTED ) {
     
        delay ( 500 );
     
        Serial.print ( "." );
     
      }
     
      Serial.println ( "" );
     
      Serial.print ( "Connected to station : " );
     
      Serial.println ( MY_SSID );
     
      Serial.print ( "Password : " );
     
      Serial.println ( MY_PWD );
     
      Serial.print ( "IP address: " );
     
      MY_IP = WiFi.localIP().toString();
     
      MY_SSID = ssid;
     
      MY_PWD = password;
     
      Serial.println ( WiFi.localIP() );
     
      delay (500);
     
    }
    Lorsque le capteur ultrason continue à détecter une présence après la bonne vérification de l'identifiant RFID, l'erreur apparait à l'instant où le capteur ne détecte plus rien, voici ce qui est affiché avant que le programme bloque dans le moniteur série :

    Le véhicule garé est bien en son droit
    Voiture toujours garée -> Distance: 37.23
    Voiture toujours garée -> Distance: 33.15
    Voiture toujours garée -> Distance: 2097.80


    Le programme bloque malheureusement toujours au même endroit : au sortir de la boucle while (distance_mm < 700) pour le cas de l'identifiant valide en revanche les lignes d'erreur ci-dessous ne sont plus affichées dans le moniteur série lorsque le programme bloque après ajout du yield() après chaque lecture de caractère.

    Soft WDT reset

    ctx: cont
    sp: 3fff0f40 end: 3fff1170 offset: 01b0

    >>>stack>>>
    3fff10f0: 4204999a 3ffef3e8 45031ccd 40202538
    3fff1100: 3ffe8be8 00000000 000003e8 40207f80
    3fff1110: 2e646462 00747874 00000000 40202200
    3fff1120: 3fff2bac feefeffe 40208ec4 40208eb0
    3fff1130: 3ffef41c 00000019 00000000 feefeffe
    3fff1140: 00000000 00000000 00000001 3fff0144
    3fff1150: 3fffdad0 00000000 3fff013c 40208c7c
    3fff1160: feefeffe feefeffe 3fff0150 4010070c
    <<<stack<<<
    ⸮⸮⸮⸮V)⸮⸮[/B]


  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    C’est quoi ce cheminPhoto qui va grandir sans jamais être effacé?


    Votre code est un peu trop spaghetti... il devrait être récrit sous forme de machine à état

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Jay M Voir le message
    C’est quoi ce cheminPhoto qui va grandir sans jamais être effacé?


    Votre code est un peu trop spaghetti... il devrait être récrit sous forme de machine à état

    Sous forme de machine à état?

    Une caméra qui stockera des photos sur une carte SD va être rajoutée, ceci n'est pas la version final du code mais le chemin photo sera destiné à stocker la chaine de caractère avec la balise html permettant d'accéder à une photo en cas d'infraction (photo qui sera transmise sur une page internet, je n'ai, d'ailleurs pas trouvé la syntaxe du chemin d'accès vers une photo stockée dans la carte SD branchée sur ma carte D1).

    Savez-vous d'où peut provenir l'erreur Soft WDT ? car je ne vois pas où le programme est susceptible d'être "suspendu" longtemps mis à part lors de la lecture sur la SD, à part lors des delay().

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Citation Envoyé par strs94 Voir le message
    Sous forme de machine à état?
    faut lire des trucs sur ce thème. chercher "Arduino Programmation Machine à état". c'est une approche qui permet de bien structurer son code en fonction d'évènements qui déclenchent des changements d'état.

    Citation Envoyé par strs94 Voir le message
    Une caméra qui stockera des photos sur une carte SD va être rajoutée, ceci n'est pas la version final du code mais le chemin photo sera destiné à stocker la chaine de caractère avec la balise html permettant d'accéder à une photo en cas d'infraction (photo qui sera transmise sur une page internet, je n'ai, d'ailleurs pas trouvé la syntaxe du chemin d'accès vers une photo stockée dans la carte SD branchée sur ma carte D1).
    Pourquoi rajouter cela maintenant.. ça ne va pas vous aider à débugger... principe N°1 quand on a un bug, c'est de virer tout ce qui ne sert pas pour essayer d'identifier la source du problème.

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Pourquoi rajouter cela maintenant.. ça ne va pas vous aider à débugger... principe N°1 quand on a un bug, c'est de virer tout ce qui ne sert pas pour essayer d'identifier la source du problème.
    Le yield() inséré après lecture de chaque caractère sur le code que je vous ai initialement envoyé (sans tous les ajouts faits entre temps) ne résoud pas non plus l'erreur.
    Même sur l'ancienne version, avec l'ajout du yield() les lignes d'erreur en rouge sur les messages ci-dessus (à savoir Soft WDT Reset….Etc) n'apparaissent plus mais le code bloque toujours au même endroit, je ne comprends pas à quoi cela est dû, si le "Soft WDT Reset" n'est plus affiché dans le moniteur série cela voudrait dire que l'erreur concernant le WatchDog est réglée mais qu'une autre erreur persiste ou simplement que le yield() a bloqué l'affichage de ce dernier sans régler le problème? Ignorons si vous préférez la nouvelle version du code que j'étais contrainte d'avancer mais que je n'aurai pas dû, en effet, vous présenter dans le cadre de la résolution de cette erreur)

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Citation Envoyé par strs94 Voir le message
    Le yield() inséré après lecture de chaque caractère sur le code que je vous ai initialement envoyé (sans tous les ajouts faits entre temps) ne résoud pas non plus l'erreur.
    Même sur l'ancienne version, avec l'ajout du yield() les lignes d'erreur en rouge sur les messages ci-dessus (à savoir Soft WDT Reset….Etc) n'apparaissent plus mais le code bloque toujours au même endroit
    ben le WDT ne se déclenche plus, on a donc résolu cette erreur. vous en avez une autre sans doute et c'est ce qu'il faut explorer.

    vous dites le code bloque toujours au même endroit - comment le savez vous ?

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Jay M Voir le message
    vous dites le code bloque toujours au même endroit - comment le savez vous ?
    L'erreur "Soft WDT Reset" n'est plus affichée dans le moniteur série mais après avoir print ("Le véhicule est bien en son droit"), le programme cesse de s'executer au sortir de la boucle while après avoir affiché ce message (vérifié avec des Serialprint). Il cesse donc exactement au même endroit qu'avant la seule différence est que l'erreur Soft WDT Reset n'est pas affichée dans le moniteur série.

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Citation Envoyé par strs94 Voir le message
    L'erreur "Soft WDT Reset" n'est plus affichée dans le moniteur série mais après avoir print ("Le véhicule est bien en son droit"), le programme cesse de s'executer au sortir de la boucle while après avoir affiché ce message (vérifié avec des Serialprint).
    montrez le code que vous avez utilisé pour vous convaincre que c'est là qu'il s'arrête et pas ailleurs, genre 3 lignes plus loin, ou dans l'accès SD etc...

    par exemple le serait mieux exécuté qu'une seule fois dans le setup

    sur un D1 mini, le bus SPI utilise les pins suivantes:
    - D5 = CLK
    - D6 = MISO
    - D7 = MOSI
    - D8 = CS
    --> pourquoi prendre D10 comme CS ?

    assurez vous que dans tous les cas vous faites un close() sur le fichier, et faites le le plus tôt possible quand vous n''en avez plus besoin etc...

    je creuserais plutôt de ce côté là, mais en restructurant le code en machine a état comme dit précédemment, là c'est un peu trop spaghetti pour que je puisse lire cela sur mon smartphone

Discussions similaires

  1. Export requete texte -> Excel : erreur quote
    Par Sam 069 dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/07/2007, 15h27
  2. Modification d'un texte dans une fenetre "d'erreur"
    Par PAUL87 dans le forum Access
    Réponses: 8
    Dernier message: 21/10/2005, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo