SOMMAIRE ►
Voyons comment créer un menu contrôlé par un encodeur sur afficher LCD 1602 I2C. Nous présenterons deux exemples : un menu pour allumer les LED et un menu sur l’écran avec contrôle par encodeur de la luminosité des LED. Nous vous recommandons de lire les informations relatives à la connexion de LCD 1602 et du module rotary encodeur Arduino à l’Arduino. Si vous avez déjà connecté ces modules, vous pouvez commencer ce projet.
Pour cette activité, nous aurons besoin:
- Arduino Uno / Arduino Nano / Arduino Mega;
- afficheur LCD 16×2 i2c
- encoder rotatif
- LEDs et résistances
- breadboard
- fils de connexion
- librairies LiquidCrystal_I2C.h et RotaryEncoder.h
Matériel supplémentaire sur ce sujet:
Menu Arduino pour LCD 1602 avec rotary encoder
Les exemples de menus avec module encoder rotatif et afficheur LCD 1602 i2c présentés sur cette page peuvent être adaptés à vos besoins. De nombreux projets Arduino nécessitent que l’utilisateur puisse configurer ou contrôler un dispositif sur le microcontrôleur Arduino Uno. Rotary encoder permet de réaliser un menu simple et natif sur l’afficheur LCD 1602 i2c pour contrôler les LEDs, le micro servo Arduino ou pour d’autres tâches.

| LCD 1602 i2c | Arduino Uno | Arduino Nano | Arduino Mega |
| GND | GND | GND | GND |
| VCC | 5V | 5V | 5V |
| SDA | A4 | A4 | 20 |
| SCL | A5 | A5 | 21 |
Dans le premier exemple, plus simple, le menu d’affichage comporte trois éléments qui peuvent être modifiés en tournant le bouton de l’encodeur. Lorsque vous appuyez sur le bouton de l’encodeur, la couleur de la LED RVB sélectionnée est activée. Selon la position du curseur sur l’écran, la couleur requise est activée à l’aide de l’instruction conditionnelle if. Assemblez le circuit comme indiqué dans l’image et chargez le programme.
Programme Arduino facile de menu avec encodeur
#include "Wire.h" #include "LiquidCrystal_I2C.h" LiquidCrystal_I2C LCD(0x27, 16, 2); #include "RotaryEncoder.h" RotaryEncoder encoder(4, 5); // DT, CLK #define STEPS 6 #define POSMIN 0 #define POSMAX 12 int lastPos, newPos; boolean buttonWasUp = true; void setup() { LCD.init(); // initialisation de l'afficheur LCD.backlight(); pinMode(9, OUTPUT); // LED bleue pinMode(10, OUTPUT); // LED verte pinMode(11, OUTPUT); // LED rouge pinMode(2, INPUT_PULLUP); // SW Serial.begin(9600); encoder.setPosition(10 / STEPS); } void loop() { LCD.setCursor(0, 0); LCD.print("LED1 LED2 LED3"); encoder.tick(); newPos = encoder.getPosition() * STEPS; if (newPos < POSMIN) { encoder.setPosition(POSMIN / STEPS); newPos = POSMIN; } else if (newPos > POSMAX) { encoder.setPosition(POSMAX / STEPS); newPos = POSMAX; } if (lastPos != newPos) { Serial.println(newPos); LCD.setCursor(lastPos, 1); LCD.print(" "); LCD.setCursor(newPos, 1); LCD.print("===="); lastPos = newPos; } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp && newPos == 0) { digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(11,LOW); } if (!buttonIsUp && newPos == 6) { digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); } if (!buttonIsUp && newPos == 12) { digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,HIGH); } } }
Explication du code pour menu avec encodeur rotatif:
- la position du curseur sur le LCD peut prendre trois valeurs – 0, 6 ou 12;
- le bouton de l’encodeur est connecté au port numérique en utilisant la configuration des broches avec le paramètre INPUT_PULLUP, ce qui permet de lire la pression du bouton.
Dans l’exemple suivant, le menu comporte un deuxième niveau permettant de régler la luminosité de chaque DEL séparément. Le passage d’un menu à l’autre se fait en appuyant sur le bouton de l’encodeur, ce qui modifie la valeur de la variable globale w dans le script. Le schéma de câblage des LED et des modules vers le microcontrôleur reste le même que dans l’image ci-dessus, il suffit de charger le code de programme suivant dans la carte.
Programme Arduino menu déroulant avec encodeur
#include "Wire.h" #include "LiquidCrystal_I2C.h" LiquidCrystal_I2C LCD(0x27, 16, 2); #include "RotaryEncoder.h" RotaryEncoder encoder(4, 5); // DT, CLK #define STEPS 6 #define POSMIN 0 #define POSMAX 12 #define STEPS_2 10 #define POSMIN_2 0 #define POSMAX_2 250 int lastPos, newPos; boolean buttonWasUp = true; byte w = 2; void setup() { LCD.init(); // initialisation de l'afficheur LCD.backlight(); pinMode(9, OUTPUT); // LED bleue pinMode(10, OUTPUT); // LED verte pinMode(11, OUTPUT); // LED rouge pinMode(2, INPUT_PULLUP); // SW Serial.begin(9600); encoder.setPosition(10 / STEPS); } void loop() { // CYCLE AVEC MENU PRINCIPAL À L'ÉCRAN while (w == 0) { LCD.setCursor(0, 0); LCD.print("LED1 LED2 LED3"); encoder.tick(); newPos = encoder.getPosition() * STEPS; if (newPos < POSMIN) { encoder.setPosition(POSMIN / STEPS); newPos = POSMIN; } else if (newPos > POSMAX) { encoder.setPosition(POSMAX / STEPS); newPos = POSMAX; } if (lastPos != newPos) { Serial.println(newPos); LCD.setCursor(lastPos, 1); LCD.print(" "); LCD.setCursor(newPos, 1); LCD.print("===="); lastPos = newPos; } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp && newPos == 0) { LCD.clear(); delay(500); w = 1; } if (!buttonIsUp && newPos == 6) { LCD.clear(); delay(500); w = 2; } if (!buttonIsUp && newPos == 12) { LCD.clear(); delay(500); w = 3; } } } // MENU IMBRIQUÉ AVEC UNE PREMIÈRE LED while (w == 1) { LCD.setCursor(0, 0); LCD.print("LED1 - "); encoder.tick(); newPos = encoder.getPosition() * STEPS_2; if (newPos < POSMIN_2) { encoder.setPosition(POSMIN_2 / STEPS_2); newPos = POSMIN_2; } else if (newPos > POSMAX_2) { encoder.setPosition(POSMAX_2 / STEPS_2); newPos = POSMAX_2; } if (lastPos != newPos) { LCD.setCursor(7, 0); LCD.print(newPos); analogWrite(9, newPos); } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp) { LCD.clear();digitalWrite(9,LOW);delay(500);w=0; } } } // MENU IMBRIQUÉ AVEC UNE DEUXIÈME LED while (w == 2) { LCD.setCursor(0, 0); LCD.print("LED2 - "); encoder.tick(); newPos = encoder.getPosition() * STEPS_2; if (newPos < POSMIN_2) { encoder.setPosition(POSMIN_2 / STEPS_2); newPos = POSMIN_2; } else if (newPos > POSMAX_2) { encoder.setPosition(POSMAX_2 / STEPS_2); newPos = POSMAX_2; } if (lastPos != newPos) { LCD.setCursor(7, 0); LCD.print(newPos); analogWrite(10, newPos); } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp) { LCD.clear();digitalWrite(10,LOW);delay(500);w=0; } } } // MENU IMBRIQUÉ AVEC UNE TROISIÈME LED while (w == 3) { LCD.setCursor(0, 0); LCD.print("LED3 - "); encoder.tick(); newPos = encoder.getPosition() * STEPS_2; if (newPos < POSMIN_2) { encoder.setPosition(POSMIN_2 / STEPS_2); newPos = POSMIN_2; } else if (newPos > POSMAX_2) { encoder.setPosition(POSMAX_2 / STEPS_2); newPos = POSMAX_2; } if (lastPos != newPos) { LCD.setCursor(7, 0); LCD.print(newPos); analogWrite(11, newPos); } boolean buttonIsUp = digitalRead(2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(2); if (!buttonIsUp) { LCD.clear();digitalWrite(11,LOW);delay(500);w=0; } } } }
Explication du code pour menu avec encodeur et lcd 16×2:
- une boucle while est utilisée pour chaque section de menu, car initialement la variable globale w=0 une boucle while (w == 0) est exécutée;
- si vous ne voulez pas que les LEDs s’éteignent en sortant du menu principal – supprimez la commande digitalWrite() dans toutes les boucles de sous-menu.
Conclusion. Nous avons vu deux exemples de création d’un menu avec un encodeur rotatif sur afficheur de l’Arduino 1602 IIC. Si vous avez saisi l’essence du contrôle de menu avec un rotary encodeur (encodeur rotatif), vous pouvez facilement utiliser les exemples présentés dans vos propres projets avec afficheur Arduino. Si vous avez encore des questions sur ce sujet, vous pouvez les laisser dans les commentaires de ce billet.








Bonjour, merci pour ce tuto très sympa.
J’ai un projet pour lire la position d’une règle de mesure linéaire qui fonctionne comme un encodeur ( deux signaux déphasés ). je me suis servi de ce tuto, je bute juste sur une remise à zéro de la position à un endroit voulu, ce qui correspond à vouloir éteindre une LED manuellement.
J’aurais besoin d’aide là-dessus. Le projet consiste à mettre 3 règles de mesure sur une vieille fraiseuse car les verniers sont illisibles.
D’avance merci