Leonardo qui freeze après un certain temps

Bonjour à tous!

D’abord le projet: j’essaie de mettre au point un vivarium pour insectes qui gérera automatiquement la ventilation et l’apport d’eau. Le dispositif est constitué d’une Leonardo, d’un écran Oled I2C, d’un capteur humidité ambiante, un capteur de température, un capteur humidité substrat (capacitif), une Real Time Clock I2C, une carte 4 relai relié à un ventilo et une pompe à eau et un bouton pour naviguer dans le menu. Je joins le code en .txt

Mon soucis: tout fonctionne nickel pendant quelques heures mais finit par planter au bout d’un moment. La carte est toujours sous tension et l’écran affiche encore mais plus rien ne réagit et la LED du capteur de température ne s’allume plus toute les 3 secondes, montrant que la loop ne s’exécute plus. Une pression sur le reset relance le tout.

J’ai cru comprendre que cela pouvais venir de l’utilisation excessive de mémoire, notamment à cause de variables String. Mais les seuls endroit où des Strings interviennent sont les fonctions de dessin sur l’écran.

Est ce que quelqu’un serait en mesure de m’aider?

Merci à tous

code_boite_plateaux.txt (8.91 KB)

Heu ... c'est la fin de journée.
Je ne vois pas de String dans le code, ni d'opérateurs new.

As-tu remarqué des coïncidences entre certains événements et le plantage ?
Par exemple cela plante t-il sur une mise route ou coupure de la pompe ou du ventilo ?

Serait-il possible de débrancher tout ce qui est inductif ?

Bonjour Hbachetti,

La fonction u8g.drawStr() fait intervir une String je crois, du coup je me demandais si ça pouvait être ça.
Je me demandais aussi si ça ne pouvait pas être mes variables de stockage du temps (last_pulse et last_water) qui deviendraient trop grosses au bout d'un certain temps.

Je ne suis pas sure à 100% mais il me semble que ça freeze presque toujours avec le ventilo en marche. J'ai essayé de trouver une faille dans mon code rapport à ça mais je n'ai rien vu...

Inductif donc tout ce qui contient des bobinages? Le ventilo, la pompe. La carte relai aussi? Mais oui je peux débrancher un peu ce que je veux.

Merci à toi

Ventilo et pompe suffiront. Juste pour voir si cela change qq chose.

J'ai débranché pour faire le test, on va voir mais sa m'étonnerai que se soit ça parce qu'il avait encore freezé ce matin alors que l'alim ventilo/pompe qui passe par la carte relai n'est pas branchée (du coup seul la leonardo, ses capteurs, la RTC et la carte relai sont alimenté).

En plus la carte relai est de ce type là:Carte relais 5 V 4 canaux SMTRELAY04 | Conrad.fr
avec un premier étage d'opto-coupleurs. Je ne suis pas un expert mais je pense que ça protège d'éventuels parasitages qui pourraient remonter la ligne.

Reste à explorer la piste du logiciel.
La librairie u8g est un monstre. Si elle utilise des Strings, cela peut poser des problèmes.

Personnellement pour un OLED SSD1306 j'utilise GitHub - adafruit/Adafruit_SSD1306: Arduino library for SSD1306 monochrome 128x64 and 128x32 OLEDs

Si ton OLED est un SSD1306 bien entendu ...

C'est bien un SSD1306. Je vais regarder ta librairie. Si elle permet de faire ce dont j'ai besoin, à savoir afficher les valeurs des paramètres mesurées et leurs "intitulés" alors autant prendre celle là si elle est plus petite.

Sinon ça a bien planté de nouveau malgré que j'ai débranché pompe et ventilo.

En attendant, j'ai fait le test de remplacer ma Leonardo par une Mega et pour l'instant ça tourne depuis hier fin d'après midi sans problème. J'attends encore un peu mais je pense que ça confirme le soucis de mémoire.

Je crois que j'ai eu une idée ce matin. Je pense que la seule chose qui évolue dans le programme se sont mes variables compteur de temps et la valeur renvoyé par la RTC. Je ne peux pas faire grand chose sur cette dernière mais je peux peut être mettre un IF qui vérifie si mes compteurs dépassent une certaine valeur et qui les redescend. Mais je reste un peu sceptique que se soit juste deux variables LONG qui fassent planter le truc.

En attendant, j'ai fait le test de remplacer ma Leonardo par une Mega et pour l'instant ça tourne depuis hier fin d'après midi sans problème. J'attends encore un peu mais je pense que ça confirme le soucis de mémoire./quote]

En effet.

Mais je reste un peu sceptique que se soit juste deux variables LONG qui fassent planter le truc.

Moi aussi.

Finalement il a planté sur la MEGA aussi... Je m'arrache un peu les cheveux :sob:

J'essaie d'utiliser la librairie adafruit pour mon SSD1308 mais le mien est un VMA438, sans reset pin donc c'est un la misère de ce côté là aussi...

VMA438 est une référence Velleman pour un 0.96" SSD1306 I2C, rien de plus.

Un projet où j'utilise ce genre d'écran : banc-de-mesure-de-consommation

Tu verras que je n'ai pas non plus de pin RESET.
VCC, GND, SDA et SCL. C'est tout.

VMA438 est une référence Velleman pour un 0.96" SSD1306 I2C, rien de plus.

Je sais bien, c'est juste pour montrer quel SSD 1306 j'utilise et qu'il n'a pas de reset pin.

Finalement, j'ai réussi à faire tourner la librairie Adafruit après quelques adaptations (notamment l'adresse de l'écran). Le test est en cours, il va tourner ce week end j'espère qu'il ne va pas planter!

Par contre, je suis surpris, lors de la compilation du code, il m'annonce qu'il prend encore plus de place qu'avec U8Glib.

Je vous tiens au courant!