Stylo 3D

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.