Problème d'affichage lié au "temps"

Bonsoir tout le monde !
Je suis en train de développer depuis maintenant plusieurs mois un thermostat.
Il fonctionne bien j'ai juste un petit soucis d'affichage.
Je m'explique, Il y a plusieurs fonctions, une pour l'affichage du "double 7 segments" et une pour la gestion de l'appui d'un bouton.
Pour le bouton je gère déjà une variable avec millis() pour le temps. (appuie de trois secondes).
Le problème est pour l'affichage, le capteur prend la température à chaque retour de boucles, ce qui rend l'affichage illisible vu que si la température est entre deux degrès on n'arrive plus à lire...
J'ai créé une variable temps2 pour cette partie mais après plusieurs essaie il y a souvent un probème avec l'autre gestion du temps, elle n'est plus prise en compte. Je sais pas si je me suis bien exprimé, je vous donne mon code en entier.

//Programme pour l'afficheur LFU-4421-2001A
//Le principe est simple : afficher un par un les afficheurs sans oublier de réinitialiser avant chaque changement
const int seg10 = 10;
const int seg9 = 9;
const int seg8 = 8;
const int seg7 = 7;
const int seg6 = 6;
const int seg5 = 5;
const int seg4 = 4;
const int voyant = 2;
const int RELAIS = 13;

const int aff_1 = 11;
const int aff_2 = 12;

const int btn_1 = 3;

int etatBtn1;
int etatBtn1Prec;
int etatRelais = LOW;

unsigned long temps;
unsigned long temps2;

char chiffreUnit;
char chiffreDiz;

const int captTemp = 0;//variale prenant comme valeur la du capteur
int valeur;
float tension;
int temperature;
int tempEntree = 14;//variable stockant la température voulue par l'utilisateur

void setup() {
 pinMode(btn_1, INPUT_PULLUP);
 pinMode(seg10, OUTPUT);
 pinMode(seg9, OUTPUT);
 pinMode(seg8, OUTPUT);
 pinMode(seg7, OUTPUT);
 pinMode(seg6, OUTPUT);
 pinMode(seg5, OUTPUT);
 pinMode(seg4, OUTPUT);
 pinMode(voyant, OUTPUT);
 pinMode(aff_1, OUTPUT);
 pinMode(aff_2, OUTPUT);  
 pinMode(RELAIS, OUTPUT);
 digitalWrite(RELAIS, etatRelais); //On écrit l'état du relais
 etatBtn1 == HIGH; 
}

void loop() 
{
   valeur = analogRead(captTemp);  
   tension = map(valeur, 0, 1023, 0, 5000);
   temperature = (tension / 10)-3;
   chiffreDiz = temperature / 10;//variable pour récupérer le premier chiffre pour pouvoir l'envoyer à l'afficheur
   chiffreUnit = temperature % 10;
 

 
         
         digitalWrite(aff_2, HIGH);
         aff7seg(chiffreUnit); 
         digitalWrite(aff_2, LOW);
         digitalWrite(aff_1, HIGH);
         aff7seg(chiffreDiz); 
         digitalWrite(aff_1, LOW);
          appuiBtn1();
        

   
   if(temperature < tempEntree )
   {
     etatRelais = LOW;
   }
   else if(temperature >=tempEntree)
   {
     etatRelais = HIGH;
   }
   digitalWrite(RELAIS, etatRelais);
   
}
 
 
 void aff7seg(char chiffre) //decodage du chiffre en 7seg

 {
   if(chiffre == 0)//5-6-7-8-9-10
   {
     digitalWrite(seg10, HIGH);
     digitalWrite(seg9, HIGH);
     digitalWrite(seg8, HIGH);
     digitalWrite(seg7, HIGH);
     digitalWrite(seg6, HIGH);
     digitalWrite(seg5, HIGH);
     digitalWrite(seg10, LOW);
     digitalWrite(seg9, LOW);
     digitalWrite(seg8, LOW);
     digitalWrite(seg7, LOW);
     digitalWrite(seg6, LOW);
     digitalWrite(seg5, LOW);
   }
   else if(chiffre == 1)//9-8
   {
     digitalWrite(seg9, HIGH);
     digitalWrite(seg8, HIGH);
     digitalWrite(seg9, LOW);
     digitalWrite(seg8, LOW);
   }
   else if(chiffre == 2)
   {
   digitalWrite(seg10, HIGH);
   digitalWrite(seg9, HIGH);
   digitalWrite(seg4, HIGH);
   digitalWrite(seg6, HIGH);
   digitalWrite(seg7, HIGH);
   digitalWrite(seg10, LOW);
   digitalWrite(seg9, LOW);
   digitalWrite(seg4, LOW);
   digitalWrite(seg6, LOW);
   digitalWrite(seg7, LOW); 
   }
   else if(chiffre == 3)//10-9-4-8-7
   {
   digitalWrite(seg10, HIGH);
   digitalWrite(seg9, HIGH);
   digitalWrite(seg4, HIGH);
   digitalWrite(seg8, HIGH);
   digitalWrite(seg7, HIGH); 
   digitalWrite(seg10, LOW);
   digitalWrite(seg9, LOW);
   digitalWrite(seg4, LOW);
   digitalWrite(seg8, LOW);
   digitalWrite(seg7, LOW); 
   }
   else if(chiffre == 4)//5-4-9-8
   {
   digitalWrite(seg5, HIGH);
   digitalWrite(seg4, HIGH);
   digitalWrite(seg9, HIGH);
   digitalWrite(seg8, HIGH);
   digitalWrite(seg5, LOW);
   digitalWrite(seg4, LOW);
   digitalWrite(seg9, LOW);
   digitalWrite(seg8, LOW);
   }
   else if(chiffre == 5)//10-5-4-8-7
   {
   digitalWrite(seg10, HIGH);
   digitalWrite(seg5, HIGH);
   digitalWrite(seg4, HIGH);
   digitalWrite(seg8, HIGH);
   digitalWrite(seg7, HIGH);
   digitalWrite(seg10, LOW);
   digitalWrite(seg5, LOW);
   digitalWrite(seg4, LOW);
   digitalWrite(seg8, LOW);
   digitalWrite(seg7, LOW);
   }
   else if(chiffre == 6)//10-5-4-8-6-7
   {
   digitalWrite(seg10, HIGH);
   digitalWrite(seg5, HIGH);
   digitalWrite(seg4, HIGH);
   digitalWrite(seg8, HIGH);
   digitalWrite(seg7, HIGH);
   digitalWrite(seg6, HIGH);
   digitalWrite(seg6, LOW);
   digitalWrite(seg10, LOW);
   digitalWrite(seg5, LOW);
   digitalWrite(seg4, LOW);
   digitalWrite(seg8, LOW);
   digitalWrite(seg7, LOW);
   }
   else if(chiffre == 7)//10-9-8
   {
   digitalWrite(seg10, HIGH);
   digitalWrite(seg9, HIGH);
   digitalWrite(seg8, HIGH);
   digitalWrite(seg10, LOW);
   digitalWrite(seg9, LOW);
   digitalWrite(seg8, LOW);
   }
   else if(chiffre == 8)//tout : 10-9-8-7-6-5-4
   {
   digitalWrite(seg10, HIGH);
   digitalWrite(seg9, HIGH);
   digitalWrite(seg8, HIGH);
   digitalWrite(seg7, HIGH);
   digitalWrite(seg6, HIGH);
   digitalWrite(seg5, HIGH);
   digitalWrite(seg4, HIGH);
   digitalWrite(seg10, LOW);
   digitalWrite(seg9, LOW);
   digitalWrite(seg8, LOW);
   digitalWrite(seg7, LOW);
   digitalWrite(seg6, LOW);
   digitalWrite(seg5, LOW);
   digitalWrite(seg4, LOW);
   }
   else if(chiffre == 9)
   {
   digitalWrite(seg10, HIGH);
   digitalWrite(seg9, HIGH);
   digitalWrite(seg8, HIGH);
   digitalWrite(seg7, HIGH);
   digitalWrite(seg5, HIGH);
   digitalWrite(seg4, HIGH);
   digitalWrite(seg10, LOW);
   digitalWrite(seg9, LOW);
   digitalWrite(seg8, LOW);
   digitalWrite(seg7, LOW);
   digitalWrite(seg5, LOW);
   digitalWrite(seg4, LOW);
   }
 }
     
void appuiBtn1()//gestion de l'appui du bouton 1
{
  char continuer = 1;
  char indice;
  etatBtn1 = digitalRead(btn_1);
  
  if (etatBtn1 == LOW)
  {
    if(etatBtn1Prec != etatBtn1)
    {
    temps = millis(); //on stocke la nouvelle heure
    etatBtn1Prec = etatBtn1;
    }
        if((millis() - temps) > 3000)
        {
          temps = millis();
            while(continuer == 1)
            { 
                
                chiffreDiz = tempEntree / 10;
                chiffreUnit = tempEntree % 10;
                
               digitalWrite(aff_2, HIGH);
               aff7seg(chiffreUnit); 
               digitalWrite(aff_2, LOW);
               digitalWrite(aff_1, HIGH);
               digitalWrite(voyant, HIGH);
               aff7seg(chiffreDiz);
               digitalWrite(voyant, LOW);
               digitalWrite(aff_1, LOW);
               

          
               
               etatBtn1 = digitalRead(btn_1);
               if(etatBtn1 == LOW)//Une autre gestion du bouton : si il y a appui on incrémente la température entrée
               {
                 if(etatBtn1Prec != etatBtn1)
                 {
                     etatBtn1Prec = etatBtn1;
 
                     tempEntree ++;
                     if(tempEntree > 30)//si ça dépasse 23 degrès on repasse à 14 degrès
                     tempEntree = 14;
                     
                 }
               }
               else if( (millis() - temps) > 10000)//problème, on veut faire en sorte que lorsqu'un certain temps est passé on sort de la fonction
               {
                 continuer = 0;
                 
                 
               }
              else
               {
                 etatBtn1Prec=etatBtn1;
                 
               }
             
             
            }
            
        }
  }
  else
  {
        etatBtn1Prec=etatBtn1;   //Memorisation de l'etat precedant
  }
  
  
}

Merci d'avance à vous pour votre aide, en espérant que vous ayez réussi à me suivre. :slight_smile:

J ai déjà eu des soucis avec les timmers et la librairie Time et TimeAlarm.
Une fois que j ai réussi a pondre mon code comme il fallait ( distributeur de croquette auto pour chat avec un lcd et horloge affiches + compteur de nourriture), je me suis rendu compte qu en fin de stock , la machine devait rallonger ses cycle de rotation pour avoir la bonne quantité de nourriture et donc je me décalait d au temps de temps qu il lui a fallut pour compenser.

En gros des que la machine dépassait un cycle de rotation, elle prenait 5 seconde de retard au niveau de l horloge. Le seul moyen que j ai trouvé pour remédier a ça a ete d investir dans une horloge rtc :wink:

Edit: ou alors investir dans un mega 2560 qui lui gère plusieurs timmers.

C'est normal la boucle est parcourue très rapidement et le bruit de conversion peut toujours entrainer une variation de +/-1 digit.
Plusieurs solution:

  • Echantillonner moins souvent la température. La température est un paramètre qui varie assez lentement, il n'est nullement besoin de l'échantillonner 500 fois par secondes.
  • Faire une moyenne glissante sur un certain nombre d'échantillons pour réduire le bruit
  • Une combinaison des deux

Le problème vient plus dans la gestion de la fonction millis() avec ses variables. Je voulais justement relever la température toutes les 2 secondes mais même en utilisant une autre variable (temps2) un autre problème se crée, j'ai l'impression que l'autre gestion du temps avec la variable temps n'est plus prise en compte. Il doit y avoir une façon de gérer la fonction millis() que je n'ai pas compris...

Temps1 et temps2 tournent sur le même timmer pour moi. Et donc des que tu fait un appel sur l un ou l autre, le deuxième est soit arrêté ou retardé.

Ce qui voudrait dire que je peux utiliser qu'une seule variable pour gérer le temps ?

Je n'arrive pas à savoir comment je pourrais gérer deux temps en même temps...

:slight_smile: toutes les valeurs sont traitées comme ça.

:o tu ne dois pas avoir le temps de voir grand chose >:(

digitalWrite(seg10, HIGH);
digitalWrite(seg9, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg7, HIGH);
digitalWrite(seg5, HIGH);
digitalWrite(seg4, HIGH);
digitalWrite(seg10, LOW);
digitalWrite(seg9, LOW);
digitalWrite(seg8, LOW);
digitalWrite(seg7, LOW);
digitalWrite(seg5, LOW);
digitalWrite(seg4, LOW);

Dans ton setup, tu as ça:

etatBtn1 == HIGH;

Le double égale sert à comparer, je suppose qu' il s' agit plutôt d' une affectation:

etatBtn1 = HIGH;

ça ne résoudra peut-être pas ton problème, mais déjà on ne sait pas quelle valeur est affecté à etatBtn1.

dfgh a tout à fait raison sur l' affichage, tu peux par exemple créer une fonction affichage qui sera appelée seulement si la valeur de la température est différente.

testes ce code

//Programme pour l'afficheur LFU-4421-2001A
//Le principe est simple : afficher un par un les afficheurs sans oublier de réinitialiser avant chaque changement
const int seg10 = 10;
const int seg9 = 9;
const int seg8 = 8;
const int seg7 = 7;
const int seg6 = 6;
const int seg5 = 5;
const int seg4 = 4;
const int voyant = 2;
const int RELAIS = 13;

const int aff_1 = 11;
const int aff_2 = 12;

const int btn_1 = 3;

int etatBtn1;
int etatBtn1Prec;
int etatRelais = LOW;

unsigned long temps;
unsigned long temps2;

char chiffreUnit;
char chiffreDiz;

const int captTemp = 0;//variale prenant comme valeur la du capteur
int valeur;
float tension;
int temperature;
int tempEntree = 14;//variable stockant la température voulue par l'utilisateur

void setup() {
  pinMode(btn_1, INPUT_PULLUP);
  pinMode(seg10, OUTPUT);
  pinMode(seg9, OUTPUT);
  pinMode(seg8, OUTPUT);
  pinMode(seg7, OUTPUT);
  pinMode(seg6, OUTPUT);
  pinMode(seg5, OUTPUT);
  pinMode(seg4, OUTPUT);
  pinMode(voyant, OUTPUT);
  pinMode(aff_1, OUTPUT);
  pinMode(aff_2, OUTPUT);
  pinMode(RELAIS, OUTPUT);
  digitalWrite(RELAIS, etatRelais); //On écrit l'état du relais
  etatBtn1 = HIGH;
}

void loop()
{
  valeur = analogRead(captTemp);
  tension = map(valeur, 0, 1023, 0, 5000);
  temperature = (tension / 10) - 3;
  chiffreDiz = temperature / 10;//variable pour récupérer le premier chiffre pour pouvoir l'envoyer à l'afficheur
  chiffreUnit = temperature % 10;




  digitalWrite(aff_2, HIGH);
  aff7seg(chiffreUnit);
  digitalWrite(aff_2, LOW);
  digitalWrite(aff_1, HIGH);
  aff7seg(chiffreDiz);
  digitalWrite(aff_1, LOW);
  appuiBtn1();



  if (temperature < tempEntree )
  {
    etatRelais = LOW;
  }
  else if (temperature >= tempEntree)
  {
    etatRelais = HIGH;
  }
  digitalWrite(RELAIS, etatRelais);

}


void aff7seg(char chiffre) //decodage du chiffre en 7seg

{
  if (chiffre == 0) //5-6-7-8-9-10
  {
    digitalWrite(seg10, HIGH);
    digitalWrite(seg9, HIGH);
    digitalWrite(seg8, HIGH);
    digitalWrite(seg7, HIGH);
    digitalWrite(seg6, HIGH);
    digitalWrite(seg5, HIGH);
    digitalWrite(seg4, LOW);
    
  }
  else if (chiffre == 1) //9-8
  {
    digitalWrite(seg10, LOW);
    digitalWrite(seg9, HIGH);
    digitalWrite(seg8, HIGH);
    digitalWrite(seg7, LOW);
    digitalWrite(seg6, LOW);
    digitalWrite(seg5, LOW);
    digitalWrite(seg4, LOW);
  }
  else if (chiffre == 2)
  {
    digitalWrite(seg10, HIGH);
    digitalWrite(seg9, HIGH);
    digitalWrite(seg8, LOW);
    digitalWrite(seg7, HIGH);
    digitalWrite(seg6, HIGH);
    digitalWrite(seg5, LOW);
    digitalWrite(seg4, LOW);
    
  }
  else if (chiffre == 3) //10-9-4-8-7
  {
    digitalWrite(seg10, HIGH);
    digitalWrite(seg9, HIGH);
    digitalWrite(seg8, HIGH);
    digitalWrite(seg7, HIGH);
    digitalWrite(seg6, LOW);
    digitalWrite(seg5, LOW);
    digitalWrite(seg4, HIGH);
  }
  else if (chiffre == 4) //5-4-9-8
  {
    digitalWrite(seg10, LOW);
    digitalWrite(seg9, HIGH);
    digitalWrite(seg8, HIGH);
    digitalWrite(seg7, LOW);
    digitalWrite(seg6, LOW);
    digitalWrite(seg5, HIGH);
    digitalWrite(seg4, HIGH);
  }
  else if (chiffre == 5) //10-5-4-8-7
  {
    digitalWrite(seg10, HIGH);
    digitalWrite(seg9, LOW);
    digitalWrite(seg8, HIGH);
    digitalWrite(seg7, HIGH);
    digitalWrite(seg6, LOW);
    digitalWrite(seg5, HIGH);
    digitalWrite(seg4, HIGH);
  }
  else if (chiffre == 6) //10-5-4-8-6-7
  {
    digitalWrite(seg10, HIGH);
    digitalWrite(seg9, LOW);
    digitalWrite(seg8, HIGH);
    digitalWrite(seg7, HIGH);
    digitalWrite(seg6, HIGH);
    digitalWrite(seg5, HIGH);
    digitalWrite(seg4, HIGH);
  }
  else if (chiffre == 7) //10-9-8
  {
    digitalWrite(seg10, HIGH);
    digitalWrite(seg9, HIGH);
    digitalWrite(seg8, HIGH);
    digitalWrite(seg7, LOW);
    digitalWrite(seg6, LOW);
    digitalWrite(seg5, LOW);
    digitalWrite(seg4, LOW);
  }
  else if (chiffre == 8) //tout : 10-9-8-7-6-5-4
  {
    digitalWrite(seg10, HIGH);
    digitalWrite(seg9, HIGH);
    digitalWrite(seg8, HIGH);
    digitalWrite(seg7, HIGH);
    digitalWrite(seg6, HIGH);
    digitalWrite(seg5, HIGH);
    digitalWrite(seg4, HIGH);
  }
  else if (chiffre == 9)
  {
    digitalWrite(seg10, HIGH);
    digitalWrite(seg9, HIGH);
    digitalWrite(seg8, HIGH);
    digitalWrite(seg7, LOW);
    digitalWrite(seg6, LOW);
    digitalWrite(seg5, HIGH);
    digitalWrite(seg4, HIGH);
  }
}

void appuiBtn1()//gestion de l'appui du bouton 1
{
  char continuer = 1;
  char indice;
  etatBtn1 = digitalRead(btn_1);

  if (etatBtn1 == LOW)
  {
    if (etatBtn1Prec != etatBtn1)
    {
      temps = millis(); //on stocke la nouvelle heure
      etatBtn1Prec = etatBtn1;
    }
    if ((millis() - temps) > 3000)
    {
      temps = millis();
      while (continuer == 1)
      {

        chiffreDiz = tempEntree / 10;
        chiffreUnit = tempEntree % 10;

        digitalWrite(aff_2, HIGH);
        aff7seg(chiffreUnit);
        digitalWrite(aff_2, LOW);
        digitalWrite(aff_1, HIGH);
        digitalWrite(voyant, HIGH);
        aff7seg(chiffreDiz);
        digitalWrite(voyant, LOW);
        digitalWrite(aff_1, LOW);




        etatBtn1 = digitalRead(btn_1);
        if (etatBtn1 == LOW) //Une autre gestion du bouton : si il y a appui on incrémente la température entrée
        {
          if (etatBtn1Prec != etatBtn1)
          {
            etatBtn1Prec = etatBtn1;

            tempEntree ++;
            if (tempEntree > 30) //si ça dépasse 23 degrès on repasse à 14 degrès
              tempEntree = 14;

          }
        }
        else if ( (millis() - temps) > 10000) //problème, on veut faire en sorte que lorsqu'un certain temps est passé on sort de la fonction
        {
          continuer = 0;


        }
        else
        {
          etatBtn1Prec = etatBtn1;

        }


      }

    }
  }
  else
  {
    etatBtn1Prec = etatBtn1; //Memorisation de l'etat precedant
  }


}