void loop()
{
// affiche l'heure toute les 5 sec
time=millis();
if (time-lastTime>DISPLAY_INTERVAL) // if at least DISPLAY_INTERVAL ms have passed
{
printTime();
lastTime=time; // reset timer
}
enregistrement_temps();
changement_buse();
}
Le bouton est lu tout le temps. On ne passe dans la boucle d'affichage qu'une fois toutes les DISPLAY_INTERVAL secondes.
Rien ne bloque la lecture. La seule chose qui pourrait bloquer la lecture serait si la fonction printTime() durait 1 seconde ou plus auquel cas on passerait à chaque itération de loop dans la fonction d'affichage de l'heure. C'est facile à mettre en évidence en augmentant significativement DISPLAY_INTERVAL.
Par contre, si on tient le bouton trop longtemps on passe 2 fois de suite dans enregistrement_temps. Mais ça normalement tu devrais le voir sur ta console puisque tu affiches des messages. Cependant je préconise les modifications suivantes qui à mon sens rendront le programme plus efficace et plus sûr.
- Réduction du delai au strict minimum pour faire un anti-rebond
- Attente du relâché du bouton ce qui empêche de passer 2 fois dans la boucle quelque soit le temps de maintien
void enregistrement_temps()
{
// DEBUT ENREGISTREMENT
// détecte appui sur bouton d'enregistrement et commence le décompte
if (digitalRead(BOUTON_ENREGISTREMENT)==HIGH)
// ATTENTION: on ne peut pas rentrer dans cette partie si la buse n'a pas ete changee
// c'est à dire si la variable buse_changee est à l'état 'FALSE' !!
{
delay(50); // délai anti rebond pour éviter de rentrer plusieur fois dans la boucle 50ms sont largement suffisantes
current_sec=((clock.hour)*36E2)+((clock.minute)*60)+ (clock.second);
Serial.print("temps courant:");
Serial.println(current_sec);
comptage++; // 1st give starting, 2nd give final
if (comptage==1) // 1st give starting
{
starting_sec = current_sec;
Serial.print("debut de l'enregistrement a t1=");
Serial.println(starting_sec);
}
if (comptage==2) // 2nd give final status and storage
{
// 1/3
// calcul de la fin du comptage
final_sec = current_sec;
Serial.print("fin de l'enregistrement a t2=");
Serial.println(final_sec);
current_delta_sec=(final_sec-starting_sec)+3599990;
Serial.print("delta temps t2-t1=");
Serial.println(current_delta_sec);
// 2/3
// stockage de la fin dans l'eeprom
backup_eeprom();
// 3/3
// réinitialisation du bouton
comptage=0; // reset comptage
Serial.print("temps total d'utilisation du stylo:");
Serial.println(final_delta_sec);
}
while (digitalRead(BOUTON_ENREGISTREMENT)==HIGH) ; // Attente du relâché du bouton
}// FIN ENREGISTREMENT
}
Ah oui et puis il y a une erreur ici:
if (time-lastTime>DISPLAY_INTERVAL) // if at least DISPLAY_INTERVAL ms have passed
qu'il faudrait écrire comme ça:
if (time >(lastTime + DISPLAY_INTERVAL)) // if at least DISPLAY_INTERVAL ms have passed
C'est la même chose d'un point de vue purement logique. Mais cela prend en compte le fait que millis() repasse périodiquement à 0. Cela dit, dans ton cas, je ne pense pas que tu le verras mais c'est une bonne habitude à prendre que de le coder comme ça.