|

Module d’encodeur rotatif avec interrupteur connecter sur un Arduino Uno

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);
  }
}

Publications similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *