Plantage arduino lors d'une boucle ?

Bonjour à tous !

je reviens une nouvelle fois vers la communauté pour partager un souci et bénéficier de votre expérience.

Je conçois actuellement un système de contrôle qui doit être installé dans un bateau hors bord, à base d'arduino NANO et d'un écran HMI Nextion.

Une des fonctions de ce système consiste à mesurer le voltage de la batterie. Lorsqu'on clique sur l'écran sur cette fonction, une fonction arduino est lancée, en boucle, afin de réaliser la mesure, les calculs et l'affichage à l'écran de la valeur.

La sortie de cette fonction se fait en cliquant sur le bouton EXIT, une information série est envoyée par l'écran vers l'Arduino.

j'ai testé le calcul, tout fonctionne, la fonction "d'écoute" du NEXTION par l'arduino fct également, mais lorsqu'on met tout ensemble, après une quinzaine de mesure, l'arduino plante !

quelqu'un a -t-il déja été confronté à ce problème ? ou a une idée pour le solutionner ?

Merci d'avance

CI joint le code de la fonction problématique

void volt2(){

//Lecture de la valeur Analog 1
Value=analogRead(AnalogInput);
Vout=(Value*5.0)/1024.0;
Vin=Vout/(R2/(R1+R2));

//Affichage sur moniteur série de l'information
//Serial.print ("V Input = ");
//Serial.println(Vin,2);

Vin=12;
//conversion du float en string
Conversion = String(Vin, 1);
//affichage sur le texte
myNextion.setComponentText("t0", Conversion + " V.");

//Affichage de la gauge
//1° - Calcul de la valeur angulaire
gauge=((Vin*15)-90);
//2° - protection angulaire - s'assurer que les valeurs soient tj entre 45 et 135°
//protection basse tension
if(gauge < 45){ //Si en dessous de 9 V.
//alors
gauge =45; //on se limite à 9V.
}// fin de condition
//protection haute tension
if(gauge > 135){ //
//alors
gauge =135; //on se limite à 15 V.
} //fin de condition

//3° - affichage de la gauge
myNextion.setComponentValue("z0", gauge);

//4° - modification des couleurs
if(gauge < 82){ //si en dessous de 11.5 V
// alors ligne en orange
myNextion.sendCommand("z0.pco=64512");
myNextion.sendCommand("t0.pco=64512");
}
if(gauge < 68){ //si en dessous de 10.5 V
// alors ligne en rouge
myNextion.sendCommand("z0.pco=63488");
myNextion.sendCommand("t0.pco=63488");
}
if(gauge > 82){ //si au dessous de 11.5 V
// alors ligne en vert
myNextion.sendCommand("z0.pco=1024");
myNextion.sendCommand("t0.pco=1024");
}

Serial.println("mesure en cours");

delay(1000);

String message = myNextion.listen(); //check for message
if(message == "65 3 4 1 ffff ffff ffff"){ //EXIT de la fonction de mesure
Serial.println("break fct voltmetre");
return;
}

volt2(); //relance la fonction en boucle

}

Salut

Ce qui est fait là ne s'appelle pas une boucle. Cela s'appelle récursivité.
La fonction volt2() s'appelle elle-même à l'infini, à chaque appel, une adresse de retour est stockée sur la pile et au bout d'un certain nombre d'appels, BOOM, la pile déborde.

Tu dois mémoriser le contexte dans lequel tu es (mesure_de_batterie) et si le contexte vaut mesure_de_batterie la loop() appelle volt2 régulièrement.

@+

Salut !

merci pour ton aide, je compris maintenant la cause du plantage !

entreremps j'ai solutionné le problème en utilisant une boucle do... while et ça fonctionne nickel.

Encore merci !