MENU Encodeur Rotatif

Bonjour
Je travaille sur un petit portique qui compte les tours et affiche les temps de mon futur robot suiveur de ligne.
Je souhaite intégrer un menu pour, entre autres, modifier luminosité et contraste de la bête, mais aussi indiquer le nombre de tours effectués (comme ça il affiche le meilleur temps) etc

C'est un sujet souvent traité, mais rarement clair pour moi. L'encodeur rotatif, j'y comprends rien, sauf que j'ai trouvé un bout de code qui semble fonctionner et que je comprends plutôt bien.

Voici le code en l'état actuel des choses:

//ROTARY MENU pour afficheur LCD

// le bout de code à l'origine a été pompé sur  http://sensorkit.fr.joy-it.net/index.php?title=KY-040_Module_encodeur_rotatif

//NOTES POUR PLUS TARD
// en vue de realiser un menu LCD avec un rotary, je compte faire de ce code une fonction
// elle sera parametrable dans son titre sur la première ligne du LCD avec une variable String, Strng par exemple
// la valeur minimum et maximum, pour mouliner le compteur final dans un constrain, imaginons les variables VMin et VMax
// une variable qui determine de combien on incremente, du genre Compteur = Compteur + VIncr
// une variable string qui contient un texte qui remplace la valeur 0, du genre "valeur minimum atteinte" par exemple
//                     cette option me permet d'afficher "infini" à la place du 0 quand je determine le nombre de tours minimum de mon compteur
// idem avec le max, permet de remplacer une valeur par un texte, exemple "100% atteint"



// LES VARIABLES
int Compteur = 0;   //variable incrementee par le rotary
boolean Direction;  //sera horaire ou antihoraire
int ValClkOld;      //ancienne valeur Clk
int ValClkNew;      //nouvelle valeur Clk

 
// DEFINITION DES PINS du rotary sur l'arduino
int RotClk = 3;  //Clk sur D3 de l'Arduino
int RotDt = 4;   //Dt  sur D4 de l'Arduino
int RotBut = 5;  //Sw  sur D5 de l'Arduino
  
  
void setup() 
{ 
   // On definit le type d'entrees de l'arduino correspondant aux broches du rotary
   pinMode (RotClk,INPUT);
   pinMode (RotDt,INPUT);
   pinMode (RotBut,INPUT);
    
   // ...et activation de leurs résistances de PULL-UP
   digitalWrite(RotClk, true);
   digitalWrite(RotDt, true);
   digitalWrite(RotBut, true);
    
   // Lecture de ValClkOld
   ValClkOld = digitalRead(RotClk);   
   Serial.begin (115200);      //ici je ne comprends pas pourquoi pas 9600 comme d'habitude, pas osé y toucher ^^
 } 
 
// Le programme vérifie si un changement des états des broches a eu lieu, 
// et selon la broche qui est modifiée en premier, détermine le sens de rotation.
// Cette information est obtenue par la comparaison des signaux présents sur les 2 sorties.
// Une fois que la direction a été déterminée, on compte les mouvements depuis la position
// de départ et on les envoie vers la sortie série.
// Une pression sur le bouton de l'encodeur réinitialise la position actuelle.
 
void loop()
{ 
   // Lecture des statuts actuels
   ValClkNew = digitalRead(RotClk); //on lit la position actuelle du rotary
  
    
   // Vérification de changement
   if (ValClkNew != ValClkOld) //on compare la position actuelle à l'ancienne "si ValClkNew different de ValClkOld"
   { 
          
        if (digitalRead(RotDt) != ValClkNew) //on determine le sens de rotation
        {  
            // RotClk a changé en premier
            Compteur ++;
            Direction = true;
        } 
          
        else
        {       // Sinon RotDt a changé en premier
            Direction = false;
            Compteur--;
        }
        Serial.println ("Rotation detectee: ");
        Serial.print ("Sens de rotation: ");
         
        if (Direction)   //pas sur de comprendre cette ligne...
        {
           Serial.println ("dans le sens des aiguilles d'une montre");
        }
        else
        {
           Serial.println("dans le sens contraire des aiguilles d'une montre");
        }
         
        Serial.print("Position actuelle: ");
        Serial.println(Compteur); // ecrit la valeur du compteur
        Serial.println("------------------------------");
          
   } 
    
   // Préparation de la prochaine exécution:
   ValClkOld = ValClkNew; // on stocke la valeur de ValClkNew dans ValClkOld pour plus tard
    
   // fonction Reset remise à la position actuelle
   if (!digitalRead(RotBut) && Compteur!=0)
     {
       
       Serial.println("Valeur stockée ");
       Serial.print(Compteur);
       Compteur = 0;
     }
      
 }

Il reste une part de mystère dans ce code pour moi, j'ai d'ailleurs indiqué ce que je ne comprends pas encore.

Voici mon souci: il affiche deux fois (la plupart du temps) la valeur de Compteur. Selon moi c'est une histoire de rebond... un truc comme ça. Mais je ne le trouve pas.
Résultat, il incrémente de 2 en 2, et ça m'agace, j'y ai passé deux heures, je trouve pas.

Une idée pour qu'il incrémente d'1 en 1?

Merci à mes sauveurs :slight_smile:

hello
vas voir ICI

nota:

Serial.begin (115200); parce que la liaison est plus rapide et le prg perd moins de temps

ton prg va écrire sur le moniteur, pendant ce temps là, tu ne lis pas l'entrée du codeur...

bien que actionné à la main, tu as une marge.

mais pour des codeurs entraînés par un moteur ..., non là tu passeras par les interruptions (ouf)

if (Direction) équivalent à if(direction ==1)

dfgh:
hello
vas voir ICI

Ah bon bah je recommence demain en partant de ce code, merci, je ne l'avais pas trouvé celui-là

dfgh:
hello

nota:

Serial.begin (115200); parce que la liaison est plus rapide et le prg perd moins de temps

ton prg va écrire sur le moniteur, pendant ce temps là, tu ne lis pas l'entrée du codeur...

bien que actionné à la main, tu as une marge.

mais pour des codeurs entraînés par un moteur ..., non là tu passeras par les interruptions (ouf)

Je pensais à une question de débit, effectivement, je dois pouvoir le mettre à 9600 alors, ca suffira

dfgh:
if (Direction) équivalent à if(direction ==1)

Ahhhhhh ok!!!

Un grand merci