#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Defina os pinos do encoder
#define encoderPinA 2
#define encoderPinB 3
#define buttonPin 4
// Inicialize o display LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variáveis globais
float variavel1 = 0.0;
float variavel2 = 0.0;
// Variáveis para controle do encoder
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
bool editMode = false;
// Função para atualizar o display
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Var1: ");
lcd.print(variavel1);
lcd.setCursor(0, 1);
lcd.print("Var2: ");
lcd.print(variavel2);
if (editMode) {
lcd.setCursor(15, 0);
lcd.print("E");
}
}
// Interrupção para leitura do encoder
void updateEncoder() {
int MSB = digitalRead(encoderPinA);
int LSB = digitalRead(encoderPinB);
int encoded = (MSB << 1) | LSB;
int sum = (lastEncoded << 2) | encoded;
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue++;
if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue--;
lastEncoded = encoded;
}
// Função para verificar se o botão foi pressionado
void checkButton() {
if (digitalRead(buttonPin) == LOW) {
editMode = !editMode;
updateLCD();
delay(200); // debounce
}
}
void setup() {
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(encoderPinA), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoderPinB), updateEncoder, CHANGE);
lcd.init();
lcd.backlight();
updateLCD();
}
void loop() {
static long prevEncoderValue = 0;
if (!editMode) {
checkButton(); // Verificar se o botão foi pressionado para entrar/sair do modo de edição
if (encoderValue != prevEncoderValue) {
if (encoderValue % 2 == 0) {
variavel1 += 0.1; // Ajuste de incremento para o valor desejado
} else {
variavel2 += 0.1; // Ajuste de incremento para o valor desejado
}
updateLCD();
prevEncoderValue = encoderValue;
}
} else {
// Se estiver no modo de edição, use o encoder para alterar a variável selecionada
checkButton(); // Verificar se o botão foi pressionado para sair do modo de edição
if (encoderValue != prevEncoderValue) {
if (encoderValue % 2 == 0) {
variavel1 += 0.1; // Ajuste de incremento para o valor desejado
} else {
variavel2 += 0.1; // Ajuste de incremento para o valor desejado
}
updateLCD();
prevEncoderValue = encoderValue;
}
}
}