Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*********
- title : ESP32 LCD1602 Rotary Encoder
- target : ESP32 Dev Module
- ESP32 pinout
- LCD1602_I2C display SDA on GPIO21, SCL on GPIO22
- author : Patrick Dubois
- date : 2025-02-02
- license : public domain
- *********/
- #include <LiquidCrystal_I2C.h>
- #include <Wire.h>
- // --- Configuration de l'écran LCD ---
- #define numCols 20 // for lcd
- #define numRows 4
- #define SCREEN_ADDRESS 0x27
- LiquidCrystal_I2C lcd(SCREEN_ADDRESS, numCols, numRows); // use this for I2C LCD.
- #define baudrateSerial 115200 // vitesse communication Arduino - PC
- #define pinEncoderClick 25
- #define pinData 26
- #define pinClock 27
- #define tempoClick 50 // 50 ms
- #define tempoRotation 100 // 100 ms
- volatile int16_t counter = 0;
- uint32_t oldMillis, oldMillisR, newMillis;
- bool bRotaryStatus = false, bCounterStatus = false;
- uint8_t npinDataValue, oldnpinDataValue = 2;
- String RotationWay[] = {"Right", "Left", "None"};
- // void setup() est après void loop() :-)
- void IRAM_ATTR onEncoderClickEvent() {
- newMillis = millis();
- if (newMillis > oldMillis + tempoClick) {
- ++counter;
- oldMillis = newMillis;
- bCounterStatus = true;
- }
- }
- void IRAM_ATTR onRotaryEvent() {
- newMillis = millis();
- if (newMillis > oldMillisR + tempoRotation) {
- npinDataValue = digitalRead(pinData);
- oldMillisR = newMillis;
- bRotaryStatus = true;
- }
- }
- void loop() {
- char buffer[64];
- if (bCounterStatus) {
- lcd.setCursor(13, 0);
- lcd.print(counter);
- bCounterStatus = false;
- }
- if (bRotaryStatus) {
- sprintf(buffer,"from %s to %s ", RotationWay[oldnpinDataValue], RotationWay[npinDataValue]);
- lcd.setCursor(0, 3);
- lcd.print(buffer);
- //Serial.println(npinDataValue);
- oldnpinDataValue = npinDataValue;
- bRotaryStatus = false;
- }
- }
- void setup() {
- Serial.begin(baudrateSerial);
- // Initialisation de l'écran LCD
- lcd.init();
- lcd.backlight();
- lcd.setCursor(0, 0);
- lcd.print("Init Display...");
- delay(1000);
- lcd.clear();
- pinMode(pinEncoderClick, INPUT_PULLUP);
- pinMode(pinClock, INPUT);
- pinMode(pinData, INPUT);
- attachInterrupt(digitalPinToInterrupt(pinEncoderClick), onEncoderClickEvent, RISING); // gestion du bouton par interruption
- attachInterrupt(digitalPinToInterrupt(pinClock), onRotaryEvent, FALLING); // gestion du bouton par interruption
- newMillis = oldMillis = oldMillisR = millis();
- lcd.setCursor(0, 0); lcd.print("Clics");
- lcd.setCursor(0, 1); lcd.print("Rotation Status");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement