Rotary Encoder non risponde come dovrebbe. Valori sballati !!

I Serial.print e le scritture sul display rallentano il loop. Scrivi solo una volta ogni secondo o due, con qualcosa come:

//t è unsigned long

if(millis()-t>999) // Una volta al secondo:
  {
  t=millis();
  Serial.print ... ... ...
  display.print ... ... ... 
  }

Per leggere l'encoder, ormai faccio sempre così:

void encoder()
{
//S=3-(PIND>>3)&B00000011; Serviva per l'encoder su PD3 e PD4, ma ora è su PD0 e PD1.

//     PD 76543210
S=3-PIND&B00000011; // Gli I/O 0 e 1 sono PD0 e PD1, perciò non devo scorrere a destra. 
// Il valore binario di S rappresenta A e B. Il centrale dell'encoder è a massa, quindi faccio complemento a 3 (11)  
S^=S>>1; // Faccio XOR (^) fra S (gray) e il suo bit 1, facendolo scorrere a Dx: AB XOR A, ottenendo un binario che per ogni scatto fa 0-1-2-3-0 oppure 0-3-2-1-0.
if (S!=So && S==0) X=0;
if (X==0)  // X evita letture multiple, cambiando stato subito dopo la prima lettura dell'encoder. Viene azzerato solo quando S torna a zero.
  {
  if (So==1&&S==2)
    {E=1; X=1; Bip();}
  if (So==3&&S==2)
    {E=-1; X=1; Bip();}
  if (S==0)
    {E=0; X=0;}
  So=S;  
  }
}

void Bip() {if(biptic==1||biptic==3)tone(7,1000,15);}

loop()
{
... ... ...
encoder();
if(E!=0){valore+=E; E=0;}
if(valore>valMax) valore=valMax;
if(valore<1) valore=1;
  
lcd.setCursor(0,0);
lcd.print(valore);
}

E restituisce 1 se l'encoder è stato ruotato in senso orario o -1 se è stato ruotato in senso antiorario; se non è stato ruotato, restituisce 0.