#include <LiquidCrystal_I2C.h>
#define LCD_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
#define ENCODER_CLK 3
#define ENCODER_DT 4
#define ENCODER_BTN 2
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLUMNS, LCD_ROWS);
int count = 0;
const unsigned long interval_lcd = 100;
char buffer_line_1 [16];
char buffer_line_2 [16];
void setup() {
Serial.begin(115200);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_BTN, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
attachInterrupt(digitalPinToInterrupt(ENCODER_BTN), readButton, CHANGE);
lcd.begin(16,2);
lcd.init();
lcd.backlight();
}
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
++count;
if (count > 359){count = 0;}
Serial.print("Rotated cw Count = ");
Serial.println(count);
}
if (dtValue == LOW) {
--count;
if (count < 0){count = 359;}
Serial.print("Rotated ccw Count = ");
Serial.println(count);
}
}
// for test
void readButton(){
int swValue = digitalRead(ENCODER_BTN);
if (swValue == HIGH){
Serial.println("Button up");
} else {
Serial.println("Button down");
}
}
void loop() {
static unsigned long previousMillis_lcd = 0;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis_lcd >= interval_lcd) {
sprintf(buffer_line_1,"Position %3d",count);
lcd.setCursor(0,0);
lcd.print(buffer_line_1);
}
if (digitalRead(ENCODER_BTN) == LOW) {
digitalWrite(LED_BUILTIN, HIGH);
sprintf(buffer_line_2,"Button down");
lcd.setCursor(0,1);
lcd.print(buffer_line_2);
} else {
digitalWrite(LED_BUILTIN, LOW);
sprintf(buffer_line_2,"Button up ");
lcd.setCursor(0,1);
lcd.print(buffer_line_2);
}
}