encoder rotativo salta 2 valori

Ciao a tutti,
ho comprato due rotary encoder dalla cina e provando ad usare gli sketch del playground non sono ancora riuscito a rilevare dei dati significativi. mi spiego meglio: sia usando gli interrupts che non, sia con debounce hardware che software il meglio che riesco ad ottenere è che salta di due valori in due valori (0,2,4,6...) però ho notato che muovendolo lentamente tra un click e l'altro ottengo il valore intermedio quindi credo sia un problema di programmazione che non legge quel valore. ho anche pensato di dividere per due il risultato ma capita che ruotandolo velocemente inizi a contare i dispari. allego il codice con cui ottengo il risultato migliore e vi ringrazio in anticipo

#define encoder0PinA  2
#define encoder0PinB  4

volatile unsigned int encoder0Pos = 0;

void setup() { 


  pinMode(encoder0PinA, INPUT); 
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder0PinB, INPUT); 
  digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor

  attachInterrupt(0, doEncoder, CHANGE);  // encoder pin on interrupt 0 - pin 2
  Serial.begin (9600);
  Serial.println("start");                // a personal quirk

} 

void loop(){
// do some stuff here - the joy of interrupts is that they take care of themselves
}

void doEncoder() {
  /* If pinA and pinB are both high or both low, it is spinning
   * forward. If they're different, it's going backward.
   *
   * For more information on speeding up this process, see
   * [Reference/PortManipulation], specifically the PIND register.
   */
  if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
    encoder0Pos++;
  } else {
    encoder0Pos--;
  }

  Serial.println (encoder0Pos, DEC);
}

Per cominciare usa questa sintassi che è la raccomandata:

attachInterrupt(digitalPinToInterrupt(encoder0PinA), doEncoder, CHANGE);

Poi togli il Serial.println (encoder0Pos, DEC); dalla routine perché la rallenta: mettila all'interno del loop