bug materiel, ou bug logiciel ?

un test ?

#include <LiquidCrystal.h> 

int val = LOW;
int PinCLK = 8;//2; 
int PinDT = 9;//3; //voie B
int PinSW = A0;//14; 
static long encoderPos = -1;    // Au 1er démarrage, il passera à 0
int PinCLKLast = LOW;
int nbPas = 200;                 // Résolution de l'encodeur
int lecture_PinCLK = LOW;
int BPARRETPROG = 10; int etatBPARRETPROG;
int LEDS = 11; 
int BPMARCHE = 12;    int etatBPMARCHE; 
int BPARRET = 13;     int etatBPARRET; 
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
long time, heure, minute, seconde;
unsigned long milliref; 

void setup() 
{
  Serial.begin (115200);
  pinMode (BPMARCHE, INPUT_PULLUP); 
  pinMode (BPARRET, INPUT_PULLUP);  
  pinMode (BPARRETPROG, INPUT_PULLUP); 
  pinMode (LEDS, OUTPUT); 
  pinMode (PinCLK, INPUT_PULLUP); 
  pinMode (PinDT, INPUT_PULLUP);  
  pinMode (PinSW, INPUT_PULLUP);  

  // essai - - - initialisation de val à 0 pour le switch de l'encodeur rotatif- - -
  //val = 0;
  
  lcd.begin(16, 2);lcd.print("***Innovation***");lcd.setCursor(0, 1);lcd.print(" Olivier CAPOEN ");delay(2000);lcd.clear();delay(10); 
  lcd.setCursor(2, 0);lcd.print("Carre eteint");digitalWrite(LEDS, LOW);
}

void loop()
{
  etatBPMARCHE = digitalRead(BPMARCHE); 
  etatBPARRET = digitalRead(BPARRET); 
  etatBPARRETPROG = digitalRead(BPARRETPROG);

  if (digitalRead(BPMARCHE) == LOW) 
  {
    lcd.clear(); lcd.print("  Carre ALLUME  "); 
    digitalWrite(LEDS, HIGH); 
    if (digitalRead(BPARRETPROG) == LOW){ArretProgFix();}
  }

  if (etatBPARRET == LOW)
  {
    digitalWrite(LEDS, LOW);
    lcd.clear(); lcd.print("Carre en attente");
    lcd.setCursor(2, 1); lcd.print("d'activation");
  }

  if (digitalRead(BPARRETPROG) == LOW){ ArretProgFix();}

  if (!(digitalRead(PinSW)))
  {
    val = HIGH;
    encoderPos = 0;
    GelProg ();
  }
}

void ArretProgFix() // - - - initialisation d'une tempo minimum - - -
{
  heure = 0;minute = 0;seconde = 10;time = (seconde + (60 * minute) + (3600 * heure));
  ArretProg(); // on lance le sous programme ArretProg
}

void ArretProg()
{
  digitalWrite(LEDS, HIGH);
  lcd.clear();delay(10);
  milliref = millis(); // mémorisation de la valeur de millis() courante

  while (time > 0) // tant que la tempo n'est pas finie si une seconde s'est écoulée
  {
    if (millis() > (milliref + 1000)) {seconde = seconde - 1;time = time - 1;milliref = milliref + 1000;}
    if (minute > 0) {if (seconde < 0) {minute--;seconde = 59;}}
    if (heure > 0) {if (minute <= 0) {if (time == 3600 * heure - 1) { heure--; minute = 59;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
    affich_tempo(heure,minute,seconde);
  
    delay(100); // Délai de rafraichisement LCD
 //lcd.clear();

    // en cas d'appui sur le bouton rotatif
    // rien

    //  si appui sur BP arret pendant le décompte on lance le sous programe d'arret
    if (digitalRead (BPARRET) == LOW) {ARRET();}

    if (time <= 0)                       // lorsque le compte à rebours est fini
    {
      val = LOW;                                                        //on initialise val à 0
      lcd.clear();lcd.setCursor(2, 0);lcd.print("Carre eteint");        // Affiche carré éteint
      digitalWrite(LEDS, LOW);                                          // on éteint le carré
      delay(3000);
      lcd.clear();lcd.print("Carre en attente");lcd.setCursor(2, 1);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);lcd.print("Programmez");lcd.setCursor(4, 1);lcd.print("00:00:00");  // Affiche le format du Compte à rebours
  Serial.print("valeur de val dans GelProg avant While :  ");Serial.println(val);

  if (!(digitalRead(PinSW)))
  {
    encoderPos = 0;
    val = LOW;
    ArretProg();
  }

  // - - - lecture de l'encodeur rotatif - - -
  while ((digitalRead(PinSW)) && (val == HIGH))
  {
    Serial.print(" valeur de val après while dans GelProg :  "); Serial.println(val);
    lecture_PinCLK = digitalRead(PinCLK);//voie A

    if (lecture_PinCLK==HIGH)               //si   voie A en HIGH
    {

      if (digitalRead(PinDT) == lecture_PinCLK)  // et voie B déjà à HIGH
      {//Sens antihoraire
       encoderPos--;
        minute = minute + 15;
        if ( encoderPos > ( nbPas - 1 ) ){encoderPos = 0;} 
      } 
      else                                       //ou  voie B pas encore actionnée
      {//Sens horaire
        encoderPos++;
        minute = minute - 15;
        if ( encoderPos < 0 ){encoderPos = nbPas;minute = 0;heure --;}
      }
      while (lecture_PinCLK==HIGH){lecture_PinCLK=digitalRead(PinCLK);}
      Imprime (); // on lance le sous programme d'impression sur le LCD
    }
    PinCLKLast = lecture_PinCLK;
  }
}

void Imprime ()
{
  lcd.clear();lcd.print("Appuyez pour Go");lcd.setCursor(4, 1);lcd.print("00:00:00");  // Affiche le format du Compte à rebours
  if (minute > 59) {minute = 0;heure ++;}if (minute < 0) {minute = 0;heure --;}if (heure < 0) { heure = 0;}// Limite des minutes et des heures
  affich_tempo(heure,minute,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
}

void affich_tempo(int heure,int minute,int seconde)// affiche sur LCD les heures, minutes, secondes
{
  if (heure >= 10) {lcd.setCursor(4, 1);} else {lcd.setCursor(5, 1);} lcd.print(heure);
  if (minute >= 10) {lcd.setCursor(7, 1);} else {lcd.setCursor(8, 1);} lcd.print(minute);
  if (seconde >= 10) {lcd.setCursor(10, 1);} else { lcd.setCursor(11, 1);} lcd.print(seconde);
}