#include <EEPROM.h>
#include <esp32-hal.h>
#define encoderPinA 14 // Pin A do encoder conectado ao pino 14 do ESP32
#define encoderPinB 15 // Pin B do encoder conectado ao pino 15 do ESP32
#define buttonPin 16 // Pino do botão do encoder conectado ao pino 16 do ESP32
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
void setup() {
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(encoderPinA), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoderPinB), updateEncoder, CHANGE);
pinMode(buttonPin, INPUT_PULLUP);
EEPROM.begin(512);
encoderValue = EEPROM.readLong(0); // Lendo a posição anterior do encoder na memória EEPROM
Serial.print("Última posição do encoder: ");
Serial.println(encoderValue);
}
void loop() {
if (encoderValue != lastencoderValue) {
Serial.print("Nova posição do encoder: ");
Serial.println(encoderValue);
lastencoderValue = encoderValue;
// Aqui você pode fazer o que quiser com a nova posição do encoder
}
if (digitalRead(buttonPin) == LOW) {
EEPROM.writeLong(0, encoderValue); // Salvando a posição atual do encoder na memória EEPROM
EEPROM.commit();
Serial.println("===> Posição do encoder salva na memória EEPROM <====.");
Serial.print(encoderValue);
delay(1000); // Delay apenas para evitar múltiplas gravações enquanto o botão está pressionado
}
}
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++;
else if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue--;
lastEncoded = encoded;
}