Module d’encodeur rotatif avec interrupteur connecter sur un Arduino Uno
Description :
Ce montage utilise un encodeur rotatif avec interrupteur relié à une carte Arduino Uno. En tournant l’encodeur, la variation de position est détectée et affichée sur le moniteur série. Lorsqu’on appuie sur le bouton intégré, un message s’affiche également dans la console, indiquant l’action effectuée.
Prérequis :
- 1 x Carte Arduino Uno
- 1 x Encodeur rotatif avec interrupteur
- 1 x Breadboard
- Fils de connexion
Version IDE :
- Arduino IDE 2.3.4
Vidéo de démonstration :
Schéma de câblage :


Code :
int S1 = 4; // Broche S1 de l'encodeur sur la pin 4 de l'Arduino
int S2 = 5; // Broche S2 de l'encodeur sur la pin 5 de l'Arduino
int KEY = 6; // Broche KEY de l'encodeur sur la pin 6 de l'Arduino
// Variables
int compteur = 0; // Cette variable nous permettra de savoir combien de crans nous avons parcourus sur l'encodeur
// (sachant qu'on comptera dans le sens horaire, et décomptera dans le sens anti-horaire)
int etatPrecedentS1; // Cette variable nous permettra de stocker le dernier état de S1 lu, afin de le comparer à l'actuel
int etatPrecedentKEY; // Cette variable nous permettra de stocker le dernier état du bouton (key) lu, afin de le comparer à l'actuel
void setup() {
Serial.begin(9600);
pinMode(S1, INPUT); // Pin S1 déclarée en entrée
pinMode(S2, INPUT); // Pin S2 déclarée en entrée
pinMode(KEY, INPUT); // Pin KEY déclarée en entrée
// Mémorisation des valeurs initiales, au démarrage du programme
etatPrecedentS1 = digitalRead(S1);
etatPrecedentKEY = digitalRead(KEY);
// Affichage de la valeur initiale du compteur, sur le moniteur série
Serial.print(F("Valeur initiale du compteur = "));
Serial.println(compteur);
}
void loop() {
// Lecture des signaux de l'encodeur arrivant sur l'arduino
int etatActuelS1 = digitalRead(S1);
int etatActuelS2 = digitalRead(S2);
int etatActuelKEY = digitalRead(KEY);
// *****************************************
// On regarde si encodeur changé d'état
// *****************************************
// On regarde si S1 a changé d'état
if (etatActuelS1 != etatPrecedentS1) {
// On mémorise cet état, pour éviter les doublons
etatPrecedentS1 = etatActuelS1;
if (etatActuelS1 == LOW) {
// On compare le niveau de la ligne S1 avec celui de la ligne S2
// --------------------------------------------------------------
// Nota : - si S1 est différent de S2, alors cela veut dire que nous avons tourné l'encodeur dans le sens horaire
// - si S1 est égal à S2, alors cela veut dire que nous avons tourné l'encodeur dans le sens anti-horaire
if (etatActuelS1 != etatActuelS2) {
// Si S1 est différent de S2 => cela veut dire que nous comptons dans le sens horaire
// Alors on incrémente le compteur
compteur++;
// Et on affiche ces infos sur le moniteur série
Serial.print(F("Sens = horaire | Valeur du compteur = "));
Serial.println(compteur);
} else {
// S1 est identique à S2 => cela veut dire que nous comptons dans le sens antihoraire
// Alors on décrémente le compteur
compteur--;
// Et on affiche ces infos sur le moniteur série
Serial.print(F("Sens = antihoraire | Valeur du compteur = "));
Serial.println(compteur);
}
// Petit délai de 1 ms, pour filtrer les éventuels rebonds sur S1
delay(1);
}
}
// *****************************************
// On regarde si le bouton (key) a changé d'état
// *****************************************
if (etatActuelKEY != etatPrecedentKEY) {
// Si l'état du bouton (key) a changé, alors on mémorise son nouvel état
etatPrecedentKEY = etatActuelKEY;
// Puis on affiche le nouvel état du bouton (key) sur le moniteur série de l'IDE Arduino
if (etatActuelKEY == LOW)
Serial.println(F("Bouton appuyé"));
else
Serial.println(F("Bouton relâché"));
// Petit délai de 10 ms, pour filtrer les éventuels rebonds sur SW
delay(10);
}
}
