#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Endereço do display LCD I2C
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
// Pinos do encoder
const int encoderPinClock = 2; // Clock do encoder
const int encoderPinData = 3; // Data do encoder
const int encoderButtonPin = A1; // Botão do encoder
// Cria uma instância do display LCD
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
volatile int encoderPos = 0; // Posições do encoder
int lastEncoderPos = 0; // Última posição do encoder
bool lastButtonState = HIGH; // Último estado do botão
int buttonPressCount = 0; // Contador de toques no botão
void setup() {
// Inicializa o LCD
lcd.begin(LCD_COLUMNS, LCD_ROWS);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Encoder Test");
// Configura os pinos do encoder
pinMode(encoderPinClock, INPUT);
pinMode(encoderPinData, INPUT);
pinMode(encoderButtonPin, INPUT_PULLUP); // Botão com pull-up interno
// Configura interrupções para leitura do encoder
attachInterrupt(digitalPinToInterrupt(encoderPinClock), readEncoder, CHANGE);
}
void loop() {
// Atualiza a tela do LCD
lcd.setCursor(0, 1);
lcd.print("Pos: ");
lcd.print(encoderPos);
// Atualiza a direção
if (encoderPos > lastEncoderPos) {
lcd.setCursor(10, 1);
lcd.print("Dir: Right ");
} else if (encoderPos < lastEncoderPos) {
lcd.setCursor(10, 1);
lcd.print("Dir: Left ");
} else {
lcd.setCursor(10, 1);
lcd.print("Dir: -- ");
}
// Atualiza o número de toques do botão
bool currentButtonState = digitalRead(encoderButtonPin);
if (currentButtonState == LOW && lastButtonState == HIGH) {
delay(50); // Debounce
buttonPressCount++;
}
lastButtonState = currentButtonState;
// Atualiza o contador de toques
lcd.setCursor(0, 0);
lcd.print("Btn Presses: ");
lcd.print(buttonPressCount);
// Atualiza a última posição do encoder
lastEncoderPos = encoderPos;
delay(100); // Pequeno atraso para suavizar a atualização do LCD
}
void readEncoder() {
static int lastClockState = LOW;
int clockState = digitalRead(encoderPinClock);
int dataState = digitalRead(encoderPinData);
if (clockState != lastClockState) {
if (dataState != clockState) {
encoderPos++;
} else {
encoderPos--;
}
}
lastClockState = clockState;
}