j'ai commencé à potasser le code. La pratique et l'expérimentation étants un bon moyen de progresser, je rassemble un nano et quelques composants de base, et j'essaie ce tuto...
https://dronebotworkshop.com/rotary-encoders-arduino/
Tout fonctionne super bien, aucun problème.
Du coup je rajoute une led (et sa résistance), un peu de code et voilà le bouton poussoir de l'encodeur qui à aussi sa petite interaction.
Alors je rajoute un LCD i2C 20x4, l'idée est d'aussi y afficher les infos qui sont déjà envoyées dans le Moniteur Série, et notamment un X en haut à droite de l'écran quand le switch est actionné.
...quelques oublis, maladresses et typos plus loin, ça compile et ça fonctionne, mais pas totalement aussi bien que la version d'origine..
Voici le code:
/*
Rotary Encoder Demo deeply revisited as a test guinea pig
UNSTABLE, It's not advised to use this code
Original code details:
--------------------------------------------------------
rot-encode-demo.ino
Demonstrates operation of Rotary Encoder
Displays results on Serial Monitor
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //FDEBRABANDER
// Rotary Encoder Inputs
#define inputCLK 4
#define inputDT 5
#define inputSW 6
// LED Outputs
#define ledCW 8
#define ledCCW 9
#define ledSW 10
LiquidCrystal_I2C lcd(0x27, 20, 4);
int counter = 0;
int currentStateSW = 0;
int currentStateCLK;
int previousStateCLK;
String encdir = "";
void setup() {
lcd.begin(); // initialisation de l'afficheur
lcd.clear(); // removes all characters from display
// Set encoder pins as inputs
pinMode (inputCLK, INPUT);
pinMode (inputDT, INPUT);
// Set switch pin as input
pinMode (inputSW, INPUT);
// Set LED pins as outputs
pinMode (ledCW, OUTPUT);
pinMode (ledCCW, OUTPUT);
pinMode (ledSW, OUTPUT);
// Setup Serial Monitor
Serial.begin (9600);
// Read the initial state of inputCLK
// Assign to previousStateCLK variable
previousStateCLK = digitalRead(inputCLK);
}
void loop() {
lcd.backlight();
// read the state of the switch inputSW value: DIGITAL
currentStateSW = digitalRead(inputSW);
// check if the pushbutton is NOT-pressed. If it is, the currentStateSW is HIGH due to pull-up restistors:
if (currentStateSW == HIGH) {
digitalWrite(ledSW, LOW); // turn LED off
lcd.setCursor(19, 0); //set cursor at top right corner
lcd.print(" "); //write blank char.
} else {
digitalWrite(ledSW, HIGH); // turn LED on
lcd.setCursor(19, 0); //set cursor at top right corner
lcd.print("X"); //write an X
}
// Read the current state of inputCLK
currentStateCLK = digitalRead(inputCLK);
// If the previous and the current state of the inputCLK are different then a pulse has occured
if (currentStateCLK != previousStateCLK) {
// If the inputDT state is different than the inputCLK state then
// the encoder is rotating counterclockwise
if (digitalRead(inputDT) != currentStateCLK) {
counter --;
encdir = "CCW";
digitalWrite(ledCW, LOW);
digitalWrite(ledCCW, HIGH);
} else {
// Encoder is rotating clockwise
counter ++;
encdir = "CW";
digitalWrite(ledCW, HIGH);
digitalWrite(ledCCW, LOW);
}
Serial.print("Direction: ");
Serial.print(encdir);
Serial.print(" -- Value: ");
Serial.println(counter);
// LCD print all the values anoted
lcd.clear(); // removes all characters from display
lcd.setCursor(0, 0);
lcd.print("Direction: ");
lcd.print(encdir);
lcd.setCursor(0, 1);
lcd.print("Value: ");
lcd.print(counter); // and also start a new line
}
// Update previousStateCLK with the current state
previousStateCLK = currentStateCLK;
}
En principe, quand l'encodeur tourne dans le sens horaire (clockwise) la led verte s'allume et l'information CW et un nombre incrémenté s'affichent,
Et quand on tourne dans le sens anti-horaire (counter CW) la led rouge s'allume et l'information CCW et un nombre décrémenté s'affichent.
Niveau led + moniteur série + LCD tout s'affiche, et idem pour l'activation du switch,
Par contre avec ma version, la rotation anti-horaire est TRES mal détectée... elle l'est de temps à autre, mais on est loin du systématique infaillible de la version d'origine
Quand elle n'est pas bien détectée, l'incrémentation ne change pas, et c'est le sens horaire (CW) et la led verte qui s'affichent, au lieu que ce soit l'info CCW et la led rouge.
J'ai expérimenté différents 'emplacements' dans les conditions et la boucle, mais sans grand succès, cette version étant la moins pire.. ![]()
Et merci d'avance! ![]()



