Problème avec la commande millis()

Bonsoir

Je réalise un petit programme d'horloge qui affiche aussi la température et l'humidité .. j'aimerais utiliser la commande millis() pour afficher le temps durant 30 secondes, ensuite la température durant 10 secondes et enfin l'humidité durant 10 secondes.

j'ai réaliser ce code :

unsigned long currentTime = millis();

while( currentTime - previousTime_1 >= eventTime_1_clock ){
    DS3231_display();                             // Diaplay time 
    previousTime_1 = currentTime ;    
}
delay(500);
while( currentTime - previousTime_2 >= eventTime_2_temp ){
    temp_display();                             // Diaplay temp
    previousTime_2 = currentTime ;    
}
delay(500);
while( currentTime - previousTime_3 >= eventTime_3_hum ){
    hum_display();                             // Diaplay hum 
    previousTime_3 = currentTime ;    
}
delay(500);

mais ca ne marche pas .. j'ai juste un affichage rapide de l'heure (par exemple) une fois toutes les 30 secondes .. mais je veux qui m'affiche l'heure (par exemple) durant toute les 30 seconde

si vous pouvez m'aider à résoudre ce problème

Merci

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

d'un point de vue structure ça pourrait ressembler à cela:

enum : byte {TEMPS, TEMPERATURE, HUMIDITE} affichage = TEMPS;
unsigned long chrono;
...

void gestionAffichage() {
  switch (affichage) {
    case TEMPS:
      if (millis() - chrono >= 30000ul) {
        chrono = millis();
        affichage = TEMPERATURE;
      } else {
        // AFFICHER LE TEMPS
      }
      break;

    case TEMPERATURE:
      if (millis() - chrono >= 10000ul) {
        chrono = millis();
        affichage = HUMIDITE;
      } else {
        // AFFICHER LA TEMPERATURE
      }
      break;

    case HUMIDITE:
      if (millis() - chrono >= 10000ul) {
        chrono = millis();
        affichage = TEMPS;
      } else {
        // AFFICHER L'HUMIDITE
      }
      break;
  }
}

void setup() {...}

void loop() {
  gestionAffichage();
  ... // autre chose 
}

Merci .. j'ai déjà une erreur de signe (<= et non >=) dans mon code ..

merci beaucoup en tout cas .. j'essai de résoudre le problème maintenant

un souci potentiel de votre approche c'est que vous êtes coincé statiquement dans un mode (à cause du while) le mieux c'est de laisser la boucle tourner pour superviser tout ce que vous avez à faire et de gérer l'affichage à chaque tour de loop. (et ne faire un rafraîchissement de l'affichage que quand c'est nécessaire)

et les delay(500) ne servent bien sûr à rien...

Oui .. j'approuve a fond votre idée .. il faut que tout le programme fonctionne en permanence .. temps - température - humidité .. et juste une gestion de l'affichage a chaque tour de loop ..

a noter que j'ai une commande qui permet de régler l'horloge .. et que j'aimerais qu'elle est toujours la possibilité de fonctionner a n'importe quel état de l'affichage ..

enfin j'essai de voir ca plus tard .. une fois la gestion de l'affichage faite avec la boucle switch

c'est magique ..
marche impec ..
merci beaucoup J-M-L
8) 8) 8)

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