.
Encoder Rotativo Arduino
Indice
- arduino y encoder rotativo
1. arduino y encoder rotativo

// Entradas del codificador rotatorio
#define CLK 2 // Pin de reloj (CLK)
#define DT 3 // Pin de datos (DT)
#define SW 4 // Pin del botón pulsador (SW)
int counter = 0; // Contador que almacena la posición actual
int currentStateCLK; // Estado actual del pin CLK
int lastStateCLK; // Último estado registrado del pin CLK
String currentDir = ""; // Dirección actual de giro: "CW" (horario) o "CCW" (antihorario)
unsigned long lastButtonPress = 0; // Tiempo del último evento de pulsación del botón
void setup() {
// Configurar los pines del codificador como entradas
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
pinMode(SW, INPUT_PULLUP); // Usamos resistencia pull-up interna para el botón
// Inicializar el Monitor Serie
Serial.begin(9600);
// Leer el estado inicial del pin CLK
lastStateCLK = digitalRead(CLK);
}
void loop() {
// Leer el estado actual del pin CLK
currentStateCLK = digitalRead(CLK);
// Si el estado actual y el anterior de CLK son diferentes, hubo un pulso
// Reaccionamos solo a un cambio de estado (flanco de subida) para evitar doble conteo
if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
// Si el estado de DT es diferente al de CLK,
// el codificador está girando en sentido antihorario (CCW), decrementamos
if (digitalRead(DT) != currentStateCLK) {
counter--;
currentDir = "CCW";
} else {
// De lo contrario, gira en sentido horario (CW), incrementamos
counter++;
currentDir = "CW";
}
// Mostrar la dirección y el contador por el Monitor Serie
Serial.print("Dirección: ");
Serial.print(currentDir);
Serial.print(" | Contador: ");
Serial.println(counter);
}
// Guardar el estado actual de CLK para la próxima iteración
lastStateCLK = currentStateCLK;
// Leer el estado del botón
int btnState = digitalRead(SW);
// Si detectamos señal LOW, el botón está presionado
if (btnState == LOW) {
// Si han pasado más de 50ms desde la última pulsación,
// significa que el botón se ha presionado de nuevo (anti-rebote)
if (millis() - lastButtonPress > 50) {
Serial.println("¡Botón presionado!");
}
// Recordar el momento de esta pulsación
lastButtonPress = millis();
}
// Pequeña pausa para ayudar a eliminar el rebote de las lecturas
delay(1);
}
Explicación del funcionamiento:
- Codificador rotatorio: Los pines CLK y DT generan señales digitales cuando giras la perilla. Comparando el estado de DT con CLK, el programa determina si giras a la derecha (CW) o izquierda (CCW).
- Contador: Se incrementa o decrementa según el sentido de giro.
- Botón: El pin SW (con pull-up interno) se pone a LOW cuando presionas. Se usa un antirrebote de 50ms para evitar lecturas falsas.
- Monitor Serie: Muestra en tiempo real la dirección de giro y el valor del contador.
Este código es ideal para interfaces hombre-máquina con perillas rotatorias, como controles de volumen, menús, etc.