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; //numéro de l'état actif
brocheA=A0; //numéro de broche Arduino utilisée pour l'entrée A
brocheB=A1; //numéro de broche Arduino utilisée pour l'entrée B
//broches en entrées
pinMode(brocheA,INPUT_PULLUP);
pinMode(brocheB,INPUT_PULLUP);
entreeA=digitalRead(brocheA); //valeur lue sur l'entrée A
entreeB=digitalRead(brocheB); //valeur lue sur l'entrée B
position=0;
}
// #define DEBUG
void loop() {
//lecture et mémorisation des entrées
entreeA=digitalRead(brocheA); //valeur lue sur l'entrée A
entreeB=digitalRead(brocheB); //valeur lue sur l'entrée B
#ifdef DEBUG
Serial.print("A:");
Serial.print(entreeA,HEX);
Serial.print(" B:");
Serial.print(entreeB,HEX);
Serial.print(" e:");
Serial.print(etat,HEX);
Serial.print(" p:");
Serial.print(position,DEC);
Serial.println();
#endif
//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=0;
break;
case 2: if (entreeA==0) etat=3;
else if (entreeB==0) etat=1;
//else etat=0;
break;
case 3: if (entreeB==0) etat=0;
else if (entreeA==1) etat=2;
//else etat=0;
break;
default:
break;
}
//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);
}
}