#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;
    }
  }
}