Problemino con un ciclo for

Ciao ragazzi. Premetto che programmo molto poco. Ho fatto qualcosina da autodidatta ma veramente nulla.

Vi spiego il mio problema:

sto cercando di creare con arduino uno un timer countdown con un display 7 segmenti a 4 cifre, shift register( il 595) e un modulo rotary encoder ky040.

per ora lavoro solo con due cifre.
qui c’è tutto il codice

//encoder
int clkPin= 2;
int dtPin =3;
int encoderVal = 0;
int swPin =4;

int buttonState=0;
int lastButtonState=0;
int count=0;


//74HC595

int latchPin = 8;

int clockPin = 12;

int dataPin = 11;

//display
int dig2=6;
int dig1=7;
int num[10] = {129, 207, 146, 134, 204, 164, 160, 143, 128, 132};

//timer
int timer=0;
int dec=0;
int unit=0;
long i=1000;
long old=0;
unsigned long curr=0;

void setup() {

  Serial.begin(9600);

  //encoder
  pinMode(clkPin, INPUT);
  pinMode(dtPin, INPUT);
  pinMode(swPin, INPUT);
  
  //595
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  //display
  pinMode(dig2,OUTPUT);
  pinMode(dig1,OUTPUT);
  pinMode(10,OUTPUT);
  
 
      
}
void loop(){   
  
  buttonState=digitalRead(swPin);
  
  if (buttonState != lastButtonState) {
    
    if (buttonState == HIGH) {
      
    
    count++;
    Serial.println("on");
    Serial.print("numer of button pushes:    ");
    Serial.println(count);
    }
    else {
      Serial.println("off");
      }
      }
    
    lastButtonState = buttonState;
  
 
  
     //***** encoder set*****
     
  int change = getEncoderTurn();
   
    encoderVal = encoderVal + change;
    
    if(encoderVal<0){
      encoderVal=0;
      }
     if(encoderVal>=99){
      encoderVal=99;
      }  
      
      dec=encoderVal/10;
      unit=encoderVal-(dec*10);
      
      
  
//**************timer set**************
  
  
  if(count!=0){
   
      
  if(count>1){
      count=0;
      }
  

     //cifra uno
     
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, num[dec]);     
    digitalWrite(latchPin, HIGH);   
    digitalWrite(dig1,HIGH);
    delay(1);
    digitalWrite(dig1,LOW);
    
    
    //cifra due
    
    
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, num[unit]);  
    digitalWrite(latchPin, HIGH);
    digitalWrite(dig2,HIGH);
    delay(1); 
    digitalWrite(dig2,LOW);
  
  }

   
  
  
  
  
  
  
  //***********timer start**************
  
  else
  {
    
    
    
    for (timer=encoderVal;timer>=0;timer--){
      
   
 
    
      dec=timer/10;
      unit=timer-(dec*10);

 
  
       while(curr-old<i){
     
          curr=millis();
     
     //cifra uno
     
          digitalWrite(latchPin, LOW);
          shiftOut(dataPin, clockPin, LSBFIRST, num[dec]);     
          digitalWrite(latchPin, HIGH);   
          digitalWrite(dig1,HIGH);
          delay(1);
          digitalWrite(dig1,LOW);
    
    
    //cifra due
    
    
          digitalWrite(latchPin,LOW);
          shiftOut(dataPin, clockPin, LSBFIRST, num[unit]);  
          digitalWrite(latchPin, HIGH);
          digitalWrite(dig2,HIGH);
          delay(1); 
          digitalWrite(dig2,LOW);
          
    
            }
              
                    
              
      old=old+i;
      
              
    
    
        }
    count=1;
      
     
  
   
  }
 
 
 

 }



int getEncoderTurn(void)
{
  static int oldA = HIGH;
  static int oldB = HIGH;
  int result = 0;
  int newA = digitalRead(clkPin);
  int newB = digitalRead(dtPin);
  if (newA != oldA || newB != oldB)
  {
    
    if (oldA == HIGH && newA == LOW)
    {
      result = (oldB * 2 - 1);
    }
  }
  oldA = newA;
  oldB = newB;
  return result;
}

il problema è che quando clicco il bottone il timer non parte dal numero che segna sul display ma è come se iniziasse il conto alla rovescia non appena arduino si accende.

Io sinceramente non ho capito. Non mi è chiaro a cosa serve il rotary encoder ?

P.S. nel codice LEVA quelle mille e mille righe vuote che servono a una cippa di nulla !!

se ruoto aumenta o diminuisce il valore del timer. se lo clicco lo fa partire

Ma questo che serve ?

  if(count!=0){
    if(count>1) count=0;

Se count diverso da zero, ma appena vale 2 ridiventa 0 :o

Ogni click che faccio aumenta count di 1: quando è 0 setto il timer, quando è 1 parte il conto alla rovescia.

Sbaglio o nel timer set:

//**************timer set**************
  if(count!=0){

Non azzeri dec e unit ?!

Ho modificato il void loop() in questo modo

void loop(){   
  
  

  
     //***** encoder set*****
     
  int change = getEncoderTurn();
   
    encoderVal = encoderVal + change;
    
    if(encoderVal<0){
      encoderVal=0;
      }
     if(encoderVal>=99){
      encoderVal=99;
      }  
      
      dec=encoderVal/10;
      unit=encoderVal-(dec*10);
     
  
  
  
  
//**************timer set**************
  
  
 
      
  
  

     //cifra uno
     
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, num[dec]);     
    digitalWrite(latchPin, HIGH);   
    digitalWrite(dig1,HIGH);
    delay(1);
    digitalWrite(dig1,LOW);
    
    
    //cifra due
    
    
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, num[unit]);  
    digitalWrite(latchPin, HIGH);
    digitalWrite(dig2,HIGH);
    delay(1); 
    digitalWrite(dig2,LOW);
    
  
  
  if(digitalRead(swPin)==LOW){
  
  //***********timer start**************
  
  
    
    
    
    for (timer=encoderVal;timer>=0;timer--){
      
   
 
    
      dec=timer/10;
      unit=timer-(dec*10);

 
  
       while(curr-old<i){
     
          curr=millis();
     
     //cifra uno
     
          digitalWrite(latchPin, LOW);
          shiftOut(dataPin, clockPin, LSBFIRST, num[dec]);     
          digitalWrite(latchPin, HIGH);   
          digitalWrite(dig1,HIGH);
          delay(1);
          digitalWrite(dig1,LOW);
    
    
    //cifra due
    
    
          digitalWrite(latchPin,LOW);
          shiftOut(dataPin, clockPin, LSBFIRST, num[unit]);  
          digitalWrite(latchPin, HIGH);
          digitalWrite(dig2,HIGH);
          delay(1); 
          digitalWrite(dig2,LOW);
          
    
            }
              
            
              
      old=old+i;
      
            
        }
   
  }
 
 }

ma il problema rimane. nella mia assoluta ignoranza e disperazione ho aggiunto una riga di codice che alla fine del ciclo for mi azzererebbe il timer

 if(digitalRead(swPin)==LOW){
        timer=0;
 }
 for (timer=encoderVal;timer>=0;timer--){
      
   
 
    
      dec=timer/10;
      unit=timer-(dec*10);

 
  
       while(curr-old<i){
     
          curr=millis();
     
     //cifra uno
     
          digitalWrite(latchPin, LOW);
          shiftOut(dataPin, clockPin, LSBFIRST, num[dec]);     
          digitalWrite(latchPin, HIGH);   
          digitalWrite(dig1,HIGH);
          delay(1);
          digitalWrite(dig1,LOW);
    
    
    //cifra due
    
    
          digitalWrite(latchPin,LOW);
          shiftOut(dataPin, clockPin, LSBFIRST, num[unit]);  
          digitalWrite(latchPin, HIGH);
          digitalWrite(dig2,HIGH);
          delay(1); 
          digitalWrite(dig2,LOW);
          
    
            }
              
            if(digitalRead(swPin)==LOW){
        timer=0;
 }       
              
      old=old+i;
      
              
    
    
        }

adesso non capisco perchè ho risolto il problema, il timer comincia dal momento in cui clicco. Ma vorrei capire il perchè