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.