Classe temporisation avec millis. Erreur si plus de 32s

Bonjour,

Je code une classe temporisation de type retard à la montée . Le bug est que quand je met 32 secondes ou plus dans Duree la sortie reste indéfiniement à 0 meme si l'entrée est à 1. Pouvez vous m'aider ? Voici le code:

#include "Arduino.h"
#include "Tempo.h"

Tempo::Tempo(unsigned long Duree)
{
}

boolean Tempo::Eval(boolean In, unsigned long Duree)
{  
 
  
if (!LastIn && In  ) //Initialisation sur front montant de l'entrée
     {  
      TempsDepartRef = millis(); 
     }
  
if (In == true) //Test de la valeur d'entrée de la temporisation
      {
      if (   (millis() - TempsDepartRef ) < Duree )//Comparaison entre temps écoulé et valeur de la temporisation
           {
               Out = false; //Temps non écoulé
           }
      else
           {
               Out = true ; //Temps écoulé
           }    
      }  
else
      {
        Out = false;
      }  
LastIn = In; // Préparation du prochain cycle
return Out; //Sortie de la temporisation
}
#ifndef Tempo_h
#define Tempo_h

#include "Arduino.h"

class Tempo
{
  private:
     boolean  Out ;
     boolean LastIn ;
     unsigned long TempsDepartRef; 
     
  public:
    Tempo(unsigned long Duree);
    boolean Eval(boolean In, unsigned long Duree);
 };

#endif

Bonsoir...

32s ... 32000 ms ... Ça sent le dépassement de capacité d'un int ... Sauf que je ne vois pas d'int dans ce morceau du programme ...

Salut,

Mêmes conclusions. Un exemple de code appliqué ?

voilà un extrait du code qui utilise la classe

Pompe Pompe1, Pompe2, Pompe3,Pompe4, Pompe5;

 TempoOut= TempoPompe1.Eval(Step == 1,TEMPS_POMPE_1*1000); 
  TempoOut2= TempoPompe2.Eval(Step == 2,TEMPS_POMPE_2*1000); 
  TempoOut3= TempoPompe3.Eval(Step == 3,TEMPS_POMPE_3*1000); 

 //Transitions 
  if ( (LastStep == 0) && (CurrentHour==22) && (CurrentMinute==0) && (CurrentSecond==0) )
  {
    Step = 1;
    Serial.print("Démarrage arrosage pompe 1\r\n");
    Serial.print("heure:  "+ String(CurrentHour) + "     Minutes:   " + String(CurrentMinute) + "    Secondes:  " +  String(CurrentSecond) + "\r\n"   );
  }
  else if (TempoOut && (LastStep == 1))
  {
    Step = 2 ;
    Serial.print("Démarrage arrosage pompe 2\r\n");
   
  }
  else if (TempoOut2 && (LastStep == 2))
  {
    Step = 3;
    Serial.print("Démarrage arrosage pompe 3\r\n");
    CurrentSecond = second();
    Serial.print("heure:  "+ String(CurrentHour) + "    Minutes:   " + String(CurrentMinute) + "      Secondes:  " +  String(CurrentSecond)  +"\r\n"    );
    //digitalWrite(BROCHE_POMPE_1, LOW);
   }

Ce qui serait pas mal au vu des éventuelles sources de problèmes évoquées, ce serait de mettre la partie déclaration des variables....

J'dis ça, j'dis rien :grin:

Les constantes long doivent être suffixées d'un L

TempoOut= TempoPompe1.Eval(Step == 1,TEMPS_POMPE_1*1000);

Pour peu que TEMPS_POMPE_1 soit définie pareillement que 1000 tu récupères un int à la sortie.

TempoOut= TempoPompe1.Eval(Step == 1,TEMPS_POMPE_1*1000L);

Oui c'était bien ca le suffixe L a résolu. Je connaissais pas ce mot clé.

Sinon niveau pratique vous pensez quoi de ma classe? C'est quand meme plus pratique que de se gérer des millis un peu partout dans un code. En plus je prévois de la dériver pour faire des retards impulsionels et retards a la retombée