Problême Attachinterrupt/LCD 4*20/Encodeur Rotatif

Bonjour à vous, j'ai un petit soucis avec un petit bout de code qui me parait pourtant assez simple, mais bon n'ayant pas la bouteille qu'il faut je ne m'en sort absolument pas.

Premier problème, l'encodeur rotatif, les incrémentation/décrémentation ne sont pas stable, des fois j'ai deux impulsions alors que je n'ai tourné que d'un cran, des fois je n'ai aucune impulsions alors que je tourne l'encodeur de trois positions, et des fois je n'ai que des incrémentations alors que je tourne l'encodeur dans le sens inverse, je devrais donc avoir des décrémentations.
J'ai testé pas mal de code présent sur la page de l'encodeur et sur la toile mais toujours le même soucis, l'encodeur est le STEC12E08, peut être cela provient de ce modèle?
Le câblage : ICI , les R sont des 10K, je n'avais pas de 4.7K

Autre problème, quand j'active le attachinterrupt pour la réactivité de l'encodeur, j'ai l'afficheur LCD qui part en sucette, des caractère japonais s'affiche, les valeurs se décalent, l'écran n'affiche plus rien...bref pas top.

Voila le petit bout de code que j'ai fait, désolé pour le code un peu brouillon de débutant, mais bon faut bien commencer par Qch....
Si vous avez des pistes pour mes deux soucis je prends, et si vous avez vu des lignes qui vous chiquent dans le code merci de m'en faire part et de m'aiguiller vers une solution.

#include "LiquidCrystal.h"
#define encA 2
#define encB 3

//Afficheur HD44780 20x4
LiquidCrystal lcd(9, 8, 7, 4, 1, 0);

//Création Caractére Spéciaux
byte DEGRE[8] = {6, 9, 9, 6, 0, 0, 0, 0};// °
byte Menu_SELECT[8] = {0, 4, 6, 7, 6, 4, 0, 0};// ►
byte E_Aigu[8] = {130,132,142,145,159,144,142,128};// é

//Menu LCD
char* Menu[5]={
  "Temp. LIT", 
  "Temp. AIR",
  "Humidit" "\x3", // \x3 = Accent é
  "Vitesse Ventilo",
  "Menu Configuration"};
char* Sous_Menu[4]={
  "R" "\x3" "gler PID Bed",
  "R" "\x3" "gler PID Humidit" "\x3",
  "R" "\x3" "gler Date & Heure",
  "Echantillonage"};
char* PID[3]={
  "Kp",
  "Ki",
  "Kd"};
char* Set_Date[2]={
  "Date",
  "Heure"}; 
  
//Encodeur Rotatif STEC12E08
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int A = LOW;
int Pos_Menu = 0;

void setup() {
  pinMode(encA, INPUT); 
  //digitalWrite(encoder0PinA, HIGH);
  pinMode(encB, INPUT); 
  //digitalWrite(encoder0PinB, HIGH);
  //attachInterrupt(0, Encodeur, CHANGE);
  lcd.createChar(1, DEGRE);
  lcd.createChar(2, Menu_SELECT);
  lcd.createChar(3, E_Aigu);
  lcd.begin(20, 4);
  //Intro LCD
  lcd.setCursor(5,1);
  lcd.print("R" "\x3" "gulateur");
  lcd.setCursor(5,2);
  lcd.print("D'humidit" "\x3");
  delay (1000);
  lcd.clear();
}


void loop() {
  Encodeur();
  lcd.setCursor(12,0);
  lcd.print(Pos_Menu);
  lcd.setCursor(12,1);
  lcd.print(encoder0Pos);
/*lcd.setCursor(0,0);
  lcd.print(Menu[0]);
  
  switch(Pos_Menu){// Menu Principale
    case 1:
       lcd.setCursor(0,0);
       lcd.write(2);
      break;
    case 2:
       lcd.setCursor(0,1);
       lcd.write(2);
      break;
    case 3:
       lcd.setCursor(0,2);
       lcd.write(2);
      break;
    case 4:
       lcd.setCursor(0,3);
       lcd.write(2);
      break;
    case 5:
       lcd.setCursor(0,0);
       lcd.write(2);
      break;
  }*/
}


void Encodeur() {
  A = digitalRead(encA);
  if ((encoder0PinALast == LOW)&& (A == HIGH)) {
     if (digitalRead(encB) == HIGH){
       encoder0Pos++;
       Pos_Menu++;
     } else {
       Pos_Menu--;
       encoder0Pos--;
    }
  }
  encoder0PinALast = A;
  Pos_Menu = constrain(Pos_Menu,0,6);
  if(Pos_Menu > 5) Pos_Menu = 1;
  if(Pos_Menu == 0) Pos_Menu = 5;
}

Bien à vous.

Salut,

J'ai eu un peu le même soucis récemment avec un 160x120 couleur en SPI, et je suis arrivé à le faire fonctionné donc pas de raison qu'on y arrive pas pour toi. Plusieurs corrections à faire :

  • gère ton affichage quand il le faut : il tu n'as besoin de faire la mise à jour que lorsque ton menu change. Donc stocke en mémoire la valeur du menu à chaque loop(), s'il diffère alors mise à jour nécessaire. Ca permet de laisser le µC tourner pour l'encodeur. Si tu as besoin d'un affichage dynamique, utilise millis() pour mettre à jour ton affichage périodiquement, au maximum 24 i/s. La aussi ça libère énormément le µC

  • utilise la manipulation des ports : http://www.arduino.cc/en/Reference/PortManipulation
    En reprenant ta routine et en accélérant les tests logique aussi :

void Encodeur() {

  A = (PIND & 0b00000100) >>2;

  if ((encoder0PinALast == LOW) && A) {

     if (PIND & 0b00001000){
       encoder0Pos++;
       Pos_Menu++;
     } else {
       Pos_Menu--;
       encoder0Pos--;
    }
  }
  encoder0PinALast = A;

}
  • hardware : il manque des condensateurs, perso j'utilise avec succès ce schéma :

Bonjour,

Pour l’encodeur, j’ai essayé de nombreux bouts de code. Le plus simple et efficace est celui présenté à l’adresse suivante :

Encodeur reliés aux pins analogiques de l’Arduino
—————————————————————————
Elles sont utilisées par le code de la page web ci-dessus. Il faut impérativement utiliser les pins analogiques (comme dans l’exemple) reliées aux broches A et B de l’encodeur.
Inverser les connexions A et B si le comptage est inversé.

Encodeur reliés aux pins logiques de l’Arduino
—————————————————————————
Il faut modifier le code comme suit :
#define ENC_A 8 //Ici pin 8 de la platine Arduino.
#define ENC_B 9 //Ici pin 9 de la platine Arduino.
#define ENC_PORT PINB // Ne pas oublier cette modification. IMPORTANT !
Inverser les connexions A et B si le comptage est inversé.

Pas de ratés, pas besoin de réseau RC. Le code fonctionne parfaitement même à vitesse de rotation importante.

Bonne programmation.

standardUser:
Bonjour,

Pour l’encodeur, j’ai essayé de nombreux bouts de code. Le plus simple et efficace est celui présenté à l’adresse suivante :
http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino

Pas de ratés, pas besoin de réseau RC. Le code fonctionne parfaitement même à vitesse de rotation importante.

testé et .... J'ai dû mettre un RC. Tout dépend de la qualité de l'encodeur

Merci pour vos conseils, je vais mettre en pratique quand je serais chez moi ^^
Pour la gestion de l'encodeur de circuitathome j'avais testé le bout de code, mais j'avais pas été emballé plus que ça, à revoir donc...
Et merci B@tto pour la gestion du menu LCD, je vais tenter de corriger ma copie et revenir ici pour la faire valider :wink: