bug materiel, ou bug logiciel ?

suite du code :

void ArretProg(){
  
        digitalWrite(LEDS, HIGH); // on allume le carré
        lcd.clear(); // Efface LCD
        delay(10); // pour laisser temps d'effacer l'écran
        milliref = millis(); // mémorisation de la valeur de millis() courante
        
            
        while(time>0) { // tant que la tempo n'est pas fini

            
           
            if (millis() > (milliref + 1000)) { // si une seconde s'est écoulée
                seconde = seconde - 1; // Décrémente le comptage des secondes
                time = time - 1; // Décrémente Temps total d'une seconde
                milliref = milliref + 1000;  // incrémente la valeur de référence milliseconde
            }
            if (minute > 0) {
                if (seconde < 0) {
                    minute--; // Décrémente une minute si le comptage des secondes arrivent à 0 et si les minutes sont sup?rieurs à 0
                    seconde = 59; // reset seconde à 60
                }
            }
            if (heure > 0) {
                if (minute <= 0) {
                    if (time == 3600 * heure - 1) {
                        heure--; // Décrémente une heure si le comptage des minutes arrivent à 0 et si les heures sont supérieurs à 0 et si le temps total est un multiple de 3600 seconde (1 heure)
                        minute = 59; // reset minutes à 60
                        seconde = 59;
                    }
                }    
            }

              
            
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("Extinction dans:");
              lcd.setCursor(4, 1);                                 
              lcd.print("00:00:00");  // Affiche le format du Compte à rebours
    
    // Imprime les heures sur la collone 4 si ils sont supérieur à 10, et sur la colonne 5 si inférieur à 10:
              if (heure >= 10) {
              lcd.setCursor(4, 1);
    }
              else{
              lcd.setCursor(5, 1);
    }
              lcd.print(heure);
    
    // Imprime les minutes sur la collone 7 si ils sont supérieur à 10, et sur la colonne 8 si inférieur à 10:
              if (minute >= 10){
              lcd.setCursor(7, 1);
    }
              else {
              lcd.setCursor(8, 1);
    }
              lcd.print(minute);
    
    // Imprime les seconde sur la collone 10 si ils sont supérieur à 10, et sur la colonne 11 si inférieur à 10:
              if (seconde >= 10){
              lcd.setCursor(10, 1);
    }
              else {
             lcd.setCursor(11, 1);
    }
             lcd.print(seconde); 

             
              
             delay(100); // Délais de rafraichisement LCD
             lcd.clear();
             
      // en cas d'appuis sur le bouton rotatif
      // rien
   
       //  si on appuis sur BP arret pendant le décompte  
          
             if (digitalRead (BPARRET) == LOW){ 
                ARRET(); //on lance le sous programe d'arret
             }

        // lorsque le compte à rebours est fini
        
           if(time <= 0){
            val = LOW; //on initialise val à 0
            lcd.clear(); // efface l'écran
            lcd.setCursor(2, 0);
            lcd.print("Carre eteint"); // Affiche carré éteint
            digitalWrite(LEDS, LOW); // on éteint le carré
            delay(3000);
            lcd.clear();
            lcd.setCursor(0, 0); //on met le curseur en haut à gauche
            lcd.print("Carre en attente"); //on affiche carré en attente sur la première ligne
            lcd.setCursor(2, 1); //on met le curseur sur la seconde ligne de l'afficheur
            lcd.print("d'activation"); //et on affiche d'activation
            


           }
           
               
        }
   
       
        }
        
  
void ARRET(){
       heure = 0;
       minute = 0;
       seconde = 0;
       time = (seconde + (60 * minute) + (3600 * heure));
       //val = LOW; //on initialise val à 0
       ArretProg();
       

}

void GelProg (){
   // - - - initialisation de l'écran en mode programme - - -
   
   lcd.clear();
   lcd.setCursor(1, 0);     // positionne le curseur à la première ligne
   lcd.print("Programmez"); // Affiche programmez
   lcd.setCursor(4, 1);
   lcd.print("00:00:00");  // Affiche le format du Compte à rebours
   Serial.print("valeure de val dans GelProg avant While :  "); 
   Serial.println(val);
 
     if (!(digitalRead(PinSW))) {
        encoderPos = 0; // Reset la position si on appui sur l'encodeur
        val = LOW; //on initialise val à 0
        ArretProg();    // On lance le sous programme ArretProg
       }
     
   
   // - - - lecture de l'encodeur rotatif - - -
while ((digitalRead(PinSW))&& (val == HIGH)) {
      Serial.print(" valeure de val après while dans GelProg :  "); Serial.println(val);
      n = digitalRead(PinCLK);
   
   if ((PinCLKLast == LOW) && (n == HIGH)) {
     
     if (digitalRead(PinDT) == LOW) {
      //Sens antihoraire
       encoderPos--;
       minute = minute - 15;
       if ( encoderPos < 0 ) {
         encoderPos = nbPas;
         minute = 0;
         heure --;
       }
     } else {
       //Sens horaire
       encoderPos++;
       minute = minute + 15;
       if ( encoderPos > ( nbPas - 1 ) ) {
         encoderPos = 0;
                                         }
            }
 
     Imprime (); // on lance le sous programme d'impression sur le LCD
     
       

                                          }

   PinCLKLast = n;
  }   
}

  void Imprime (){

              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("Appuyez pour Go");
              lcd.setCursor(4, 1);                                 
              lcd.print("00:00:00");  // Affiche le format du Compte à rebours

     // Limite des minutes et des heures
     if (minute > 59){
      minute = 0;
      heure ++;
     }
     if (minute < 0){
      minute = 0;
      heure --;
     }
     if (heure < 0){
      heure = 0;
     }
     
  
     // Imprime les heures sur la collone 4 si ils sont supérieur à 10, et sur la colonne 5 si inférieur à 10:
              if (heure >= 10) {
              lcd.setCursor(4, 1);
    }
              else{
              lcd.setCursor(5, 1);
    }
              lcd.print(heure);
    
    // Imprime les minutes sur la collone 7 si ils sont supérieur à 10, et sur la colonne 8 si inférieur à 10:
              if (minute >= 10){
              lcd.setCursor(7, 1);
    }
              else {
              lcd.setCursor(8, 1);
    }
              lcd.print(minute);
    
    // Imprime les seconde sur la collone 10 si ils sont supérieur à 10, et sur la colonne 11 si inférieur à 10:
              if (seconde >= 10){
              lcd.setCursor(10, 1);
    }
              else {
             lcd.setCursor(11, 1);
    }
             lcd.print(seconde); 

             time = (seconde + (60 * minute) + (3600 * heure)); // on met à jour le temps programé
             
       //           if (!(digitalRead(PinSW))) {
        //encoderPos = 0; // Reset la position si on appui sur l'encodeur
        //val = LOW; //on initialise val à 0
       // ArretProg();    // On lance le sous programme ArretProg
      // } 
             //delay(10); // Délais de rafraichisement LCD
             
             
}

et la vidéo arrive juste après