byte etat; //numéro de l'état actif
byte entreeA; //valeur lue sur l'entrée A
byte entreeB; //valeur lue sur l'entrée B
int brocheA; //numéro de broche Arduino utilisée pour l'entrée A
int brocheB; //numéro de broche Arduino utilisée pour l'entrée B
int position; //position angulaire mesurée
void setup() {
Serial.begin(115200);
//configurer et initialiser ce qui doit l'être
etat=0;
brocheA=A4;
brocheB=A5;
pinMode(brocheA, INPUT_PULLUP);
pinMode(brocheB, INPUT_PULLUP);
entreeA=digitalRead(brocheA);
entreeB=digitalRead(brocheB);
position=0;
}
void loop() {
//lecture et mémorisation des entrées
entreeA=digitalRead(brocheA);
entreeB=digitalRead(brocheB);
//actions sur transition
if((etat==0)&&(entreeA==1))
position ++;
if((etat==1)&&(entreeA==0))
position --;
//évolution de l'état
switch (etat){
case 0: if(entreeA==1)
etat=1;
else if(entreeB==1)
etat=3;
else
etat=0;
break;
case 1: if(entreeB==1)
etat=2;
else if(entreeA==0)
etat=0;
else
etat=1;
break;
case 2: if(entreeA==0)
etat=3;
else if(entreeB==0)
etat=1;
else
etat=2;
break;
case 3: if(entreeA==1)
etat=2;
else if(entreeB==0)
etat=0;
else
etat=0;
break;
default: etat=0;
}
//actions sur état
//affichage de la valeur mesurée 10 fois par seconde
unsigned int periodiciteTache1=100;
static unsigned long timerTache1 = millis();
if (millis() - timerTache1 >= periodiciteTache1) {
timerTache1 += periodiciteTache1;
Serial.println(position);
}
}