// Entradas del encoder rotatorio
#define CLK 6
#define DT 7
#define SW 5
int counter = 0;
int currentStateCLK;
int lastStateCLK;
String currentDir ="";
unsigned long lastButtonPress = 0;
void setup() {
        
// ajusta los pines del encoder como entradas
	pinMode(CLK,INPUT);
	pinMode(DT,INPUT);
	pinMode(SW, INPUT_PULLUP);
// ajusta el Monitor Serial
	Serial.begin(9600);
// lee el estado inicial del CLK
	lastStateCLK = digitalRead(CLK);
}
void loop() {
        
// Lee el estado actual del CLK
       currentStateCLK = digitalRead(CLK);
// si los ultimos estado actuales del CLK son diferentes entonces ocurrió un pulso
// Reacciona solo a 1 cambio de estado para evitar un doble conteo 
if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){
// si el estado DT es diferente al estado del CLK 
// entonces el encoder de rotación tiene un CCW y esto significa que
//está en sentido antihorario CCW es decir Esta decrementando
		if (digitalRead(DT) != currentStateCLK) {
			counter --;
			currentDir ="CCW";
		} else {
			// } CW sentido Horario así que incrementa
			counter ++;
			currentDir ="CW";
		}
		Serial.print("Direction: ");
		Serial.print(currentDir);
		Serial.print(" | Counter: ");
		Serial.println(counter);
	}
// guardar el ultimo estado de CLK
	lastStateCLK = currentStateCLK;
// lee el estado del boton
	int btnState = digitalRead(SW);
//si nosotros detectamos una senal baja, presionamos el boton
	if (btnState == LOW) {
//si han pasado 50ms desde la ultimo pulso bajo,
//significa que el botón ha sido presionado,suéltelo y presione otra //vez
		if (millis() - lastButtonPress > 50) {
			Serial.println("Button pressed!");
		}
		// guarda el ultimo evento de pulsación del boton
		lastButtonPress = millis();
	}
// Ponga un ligero retardo para ayudar a eliminar el rebote de la //lectura
	delay(1);
}