// Pines del encoder KY-040 para ESP32
const int pinCLK = 18;
const int pinDT = 19;
const int pinSW = 21;
// Flags minimalistas
volatile bool encoderCambio = false;
volatile bool botonPresionado = false;
volatile unsigned long lastInterruptTime = 0;
int contador = 0;
void IRAM_ATTR onInterrupEncoder() {
unsigned long interruptTime = micros();
if (interruptTime - lastInterruptTime < 100000) return; // Anti-rebote 1ms
{
lastInterruptTime = interruptTime;
encoderCambio = true;
}
}
void IRAM_ATTR onBotonSw() {
botonPresionado = true;
}
void setup() {
pinMode(pinCLK, INPUT_PULLUP);
pinMode(pinDT, INPUT_PULLUP);
pinMode(pinSW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(pinCLK), onInterrupEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(pinSW), onBotonSw, FALLING);
Serial.begin(115200);
Serial.println("Encoder KY-040 - Flags Minimalistas");
}
void loop() {
// Procesar encoder
if (encoderCambio) {
encoderCambio = false;
// Determinar dirección
if (digitalRead(pinCLK) != digitalRead(pinDT)) {
contador++;
Serial.print("+ Contador: ");
} else {
contador--;
Serial.print("- Contador: ");
}
Serial.println(contador);
}
// Procesar botón
if (botonPresionado) {
botonPresionado = false;
contador = 0;
Serial.println("Reset a 0");
}
delay(1);
}