#include LiquidCrystal lcd(8, 9, 4, 5, 6, 7); #define encodeur_A 2 // Déclaration de la constante encodeur_A égale à 2 #define encodeur_B 3 // Déclaration de la constante encodeur_B égale à 3 volatile int position_encodeur; // Variable indiquant la position de l'encodeur volatile int sens_encodeur; // Variable indiquant le sens de rotation de l'encodeur boolean etat_A; // Etat de la voie A boolean etat_B; // Etat de la voie B void setup() { lcd.begin(16, 2); pinMode(encodeur_A, INPUT); // Le port digital D2 (car encodeur_A = 2) est déclaré en entrée pinMode(encodeur_B, INPUT); // Le port digital D3 (car encodeur_B = 3) est déclaré en entrée // Interruption 0 provoquée par le changement d'état du port digital A2 traitée par Traitement_A attachInterrupt(0, Traitement_A, CHANGE); // Interruption 1 provoquée par le changement d'état du port digital A3 traitée par Traitement_B attachInterrupt(1, Traitement_B, CHANGE); } void loop() { //Indique le sens et la position de l'encodeur lcd.clear(); lcd.setCursor(0,0); lcd.print(position_encodeur); lcd.setCursor(0,1); if (sens_encodeur > 0) { lcd.print("Sens horaire"); } if (sens_encodeur < 0) { lcd.print("Anti horaire"); } delay(10); } // Traitement de l'interruption générée par le changement d'état de A void Traitement_A() { // Transition montante? if ((digitalRead(encodeur_A) == HIGH)&(!etat_B)) { etat_A = true; // Instructions à exécuter, par exemple : position_encodeur = position_encodeur + 1; sens_encodeur = +1; // Fin des instructions à exécuter. } // Transition descendante? if (digitalRead(encodeur_A) == LOW) { etat_A = false; } } // Traitement de l'interruption générée par le changement d'état de B void Traitement_B() { // Transition montante? if ((digitalRead(encodeur_B) == HIGH)&(!etat_A)) { etat_B = true; // Instructions à exécuter, par exemple : position_encodeur = position_encodeur - 1; sens_encodeur = -1; // Fin des instructions à exécuter. } // Transition descendante? if (digitalRead(encodeur_B) == LOW) { etat_B = false; } }