Freeze ESP32

Bonjour
J'ai un code pour mon ESP32 qui lui fait gérer 1400 LEDs (sur des LED strip adressables), chaque LED est repérée par sa distance au centre et j'affiche donc dessus des cercles concentriques suivant les couleurs de l'arc en ciel, ça tourne nickel. En surimpression de ces cercles, j'affiche un message qui tourne en rond (nom de l'artiste et du morceau joué, c'est pour mon jukebox DIY). L'ESP32 communique via USB avec le PC qui gère le son et qui lui dit donc quels messages afficher. Enfin, la librairie arduinoFFT tourne à chaque frame pour me permettre de ne pas afficher certaines LEDs pour produire un spectre du son joué qui est capturé en sortie du PC puis transmis sur une entrée de l'ESP via un AOP et quelques résistances afin d'être sûr que le son capturé reste entre 0 et 3,3V (avec une marge pour éviter de prendre des risques).
Bref, l'ESP a de quoi s'occuper, seulement des fois, après avoir tourné pendant un long moment, il freeze, les LEDs ne changent plus. Cela ne se passe pas à un moment précis. Quand je mets une radio, ça affiche juste le nom de cette radio en boucle, et ça peut freezer au bout d'une demi heure.
Il n'y a pas d'allocation de mémoire dynamique, donc je ne vois pas une fuite de mémoire, est-ce que l'ESP peut simplement chauffer et se mettre en berne? Je peux vous filer tout le code, mais c'est juste un gros bordel, vues toutes les fonctions que l'ESP gère et le fait que je rajoute au fur et à mesure sans trop ranger.
Merci
David

Bonsoir

surchauffe de la puce ? 125°C est la température maximale de fonctionnement de la puce

-la tension d'Alimentation ne descend-elle pas trop bas par moment ?

-tu as tenté de laisser un terminal sur le port série pour voir si l'ESP32 y écrit quelquechose qaund le bug se produit ?

-autre solution : en phase de mise au point au lieu d'afficher un nom d'artiste et un nom de morceau afficher .... une info de débug !!

  • La tension d'alimentation de l'ESP32? Je l'alimente par USB, je ne devrais pas?
  • Les transferts série se font avec le PC, du coup je ne peux pas utiliser le moniteur série en même temps. Mais oui, je peux envoyer des messages sur l' "écran de LEDs" sans souci. Simplement je ne sais pas quoi y afficher, vu que je ne sais pas d'où vient le souci et que ça peut marcher parfaitement pendant des heures.

Juste pour vous faire une petite idée. Malheureusement, impossible de filmer ce que ça donne sans que les couleurs soient hyper saturées et que les LEDs donnent l'impression d'être presque blanches. Pourtant le résultat est vraiment superbe:

Alimentation par USB , Ok

affiches par exemple le nom de la fonction dans laquelle tu entres... tu verras où en était le code lors du 'freeze' !

l'ESP32 possède un second UART , il y a donc une sortie série disponible pour des infos de mise au point

al1fch:
Alimentation par USB , O

Je n'ai pas compris, désolé... le "O" est un début de phrase?
OK je peux faire ça oui, je vais tenter ça.
Merci

fais tu beaucoup appel à la librairie String ?
L'ESP32 a beau disposer d'une RAM conséquente la fragmentation peut finir par poser problème

Non “arduinofft.h”, “FastLED.h” et “SPIFFS.h” (ce dernier juste pour charger un seul fichier dans le setup() contenant l’image basse résolution de la font d’affichage du texte, environ 4Ko).
Je regarde aujourd’hui pour le debuggage.

Je pense qu'il est intéressant d'utiliser la ligne série 2 pour communiquer avec le pc en mode "transmission de données", et garder la ligne 1 pour le debug. Lorsqu'un ESP32 se plante, il reboote et envoie un message sur cette ligne pour donner quelques indications sur le plantage qui a provoqué le reboot. Bien sur, on peut envoyer des messages de debug et, en les déplaçant petit à petit on met le doigt sur le problème. J'ai eu ce genre de plantage après 1/4h et j'ai fini par comprendre ce qui se passait : une fuite de mémoire !

Merci également de ton aide, je ne sais pas ce qu'est la ligne série 2, je vais regarder ça. Pour le coup, il ne reboote pas, il freeze indéfiniment.
Est-ce qu'une fuite de mémoire peut venir d'ailleurs que de l'allocation mémoire dynamique?

Ca venait bien de l'allocation dynamique. Un "delete" oublié.

OK, grâce à ta technique d’afficher un nombre pour déterminer où ça freeze, j’ai trouvé pourquoi. Merci infiniment!
Pour remplir le buffer pour ArduinoFFT, j’utilise une fonction que j’ai trouvée:

  for (int i = 0; i < SAMPLES; i++) {
    newTime = micros()-oldTime;
    oldTime = newTime;
    int value= analogRead(SOUND_IN_PIN)-2048; // A conversion takes about 1mS on an ESP8266
    if (abs(value)<120) value=0;
    vReal[i] =(float)value/32.0f;
    vImag[i] = 0;
    while (micros() < (newTime + sampling_period_us)) {   }
  }    // -- Sampling*/

Or micros() overflows après 70 minutes.
Peut-on reset manuellement micros() de façon à ce qu’on lui donne la valeur 0 à chaque début de prise de sample?

OK désolé, j'ai trouvé ma réponse ici http:https://arduino.stackexchange.com/questions/56219/getting-fft-arduino-code-to-run-over-9-hours-utilizing-micros//

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