Progetto misura velocità tramite encoder

Salve, sto cercando di realizzarre un progetto per il mio esame di maturità soltanto che ho qualche problema:
utilizzo un encoder della bourns enc1j-d28 con applicato sopra un disco in modo da farci passare un filo per la rilevazione della velocità. Quando con l’arduino vado a leggere il pin a dell’encoder la lettura avviene in modo errato, il contatore del programma alla fine ha letto più volte il valore rispetto a quello reale.
Questo è il codice del programma, non è il massimo ma lo sto ancora sviluppando:

[edit]#include <stdio.h>

//dichiarazione funzioni

void divisione();

//dichiarazione variabili

int attesa = 1000;

int appoggioA = 0;

int appoggioB = 0;

int sensorPinA = 10;

int sensorPinB = 9;

int countA = 0;

int countB = 0;

long time = 0;

long inizio = 0;

long fine = 0;

long impiegato = 0;

int gradiB = {25, 64, 125, 200};

int gradiA = {50, 100, 128, 256};

int gradi;

float omega;

float vel;

char lettura=‘I’;

float circonferenza = 128.74;

float distanza = 0;

int tempo = 0;

float tempo2 = 0;

void setup() {

Serial.begin(9600);

pinMode(sensorPinA, INPUT);

pinMode(sensorPinB, INPUT);

}

void loop() {

Serial.print("Pronto alla misurazione: ");

// lettura=‘s’;

//do{

//scanf(&lettura);

//}

//while(lettura!=‘s’);

//Serial.print(lettura);

time = millis();

countB = 0;

countA = 0;

appoggioA = 0;

appoggioB = 0;

fine = 0;

//INIZIO LETTURA

do{

time = millis(); //inizializzo la funzione millis che mi permette di misurare il tempo

if((digitalRead(sensorPinB)==1)&&(lettura!=‘B’)) { //se il segnale arriva dal pin b allora:

countB+=1; //incremento il contatore di b

if(countB==1){inizio = time;};

fine = time; //segno il tempo del momento dell’ultima lettura

// delay(100); //ritardo le letture per avere una sola lettura per volta

Serial.println(“B”); //do in uscita b

lettura=‘B’; //segno che l’ultimo valore letto è stato b

}

else if((digitalRead(sensorPinA)==1)&&(lettura!=‘A’)){ //se invece il segnale arriva dal pin a allora:

countA+=1; //incremento il contatore di a

fine = time; //segno il tempo del momento dell’ultima lettura

// delay(100); //ritardo la lettura per avere una sola lettura per volta

Serial.println(“A”); //do in uscita a

lettura=‘A’;} //segno che l’ultimo valore letto è stato a

else{ //altrimenti se non c’è nessuna lettura:

Serial.println(“no”); //do in uscita no

}

/*

if(lettura==‘A’){

appoggioA+=1;

appoggioB=0;

}else if (lettura==‘B’){

appoggioA=0;

appoggioB+=1;

}*/

time=millis();

//}while(((time-fine)<3000)and(appoggioA<3)and(appoggioB<3));

}while(((time-fine)<attesa)or(countA<1));

fine = time-attesa; //faccio time-3000 perchè l’esercizio è finito 3" prima ma io aspetto 3 secondi per fermare la misurazione

impiegato = fine - inizio; //trovo il tempo reale usato per effettuare l’esercizio

Serial.print("Tempo: ");

Serial.println(impiegato);

/*Serial.println(10^-3);

impiegato = impiegato*(10^-3);//trasformo impiegato che è misurato in millisecondi in secondi

Serial.println(impiegato);*/

if(lettura==‘A’){ //controllo qual’è il valore letto per ultimo

gradi=(countA/4)*360+gradiA[countA%4]; //se è a utilizzo il contatore di a per trovare il totale della rotazione ù

Serial.print("A: ");

Serial.println(countA);

}

else {

gradi=(countB/4)*360+gradiB[countB%4]; //altrimenti uso il contatore di b per trovare la rotazione totale

Serial.print("B: ");

Serial.println(countB);

}

Serial.print("gradi: ");

Serial.println(gradi);

/*PROVA VELOCITà TRAMITE VELOCITA ANGOLARE

omega=(long)gradi/impiegato; //è la formula per trovare la velocità angolare

Serial.print("omega: ");

Serial.println(omega);

vel=omega*0.02; //formula per trovare la velocità cioè velocità angolare per raggio

*/

//Serial.print("Velocità: ");

//Serial.println(int(vel));

//PROVA VELOCITA TRAMITE DISTANZA/TEMPO

distanza = (circonferenza / 360)*gradi;

Serial.print("Distanza: ");

Serial.println((int) distanza);

tempo = (int) impiegato;

tempo2 = (float) tempo;

tempo2 = tempo2 / 1000;

Serial.print("Tempo2: ");

Serial.println((int)tempo2);

vel = distanza / tempo2;

Serial.print("Velocità: ");

Serial.println((int) vel);

delay(5000);

}

void divisione(){

}
[/edit]