#include <stdio.h>
#include "pico/stdlib.h"
#define ENCODER_CLK 10
#define ENCODER_DT 11
#define ENCODER_SW 12
volatile int32_t encoder_count = 0; // Counter for encoder position
// Interrupt handler for encoder signals
void encoder_isr(uint gpio, uint32_t events) {
bool clk_state = gpio_get(ENCODER_CLK); // Read Clock pin state
bool dt_state = gpio_get(ENCODER_DT); // Read Data pin state
if (clk_state == dt_state) {
encoder_count++; // Clockwise rotation
} else {
encoder_count--; // Counter-clockwise rotation
}
}
int main() {
stdio_init_all(); // Initialize standard I/O
// Initialize encoder pins as inputs with pull-up resistors
gpio_init(ENCODER_CLK);
gpio_set_dir(ENCODER_CLK, GPIO_IN);
gpio_pull_up(ENCODER_CLK);
gpio_init(ENCODER_DT);
gpio_set_dir(ENCODER_DT, GPIO_IN);
gpio_pull_up(ENCODER_DT);
gpio_init(ENCODER_SW);
gpio_set_dir(ENCODER_SW, GPIO_IN);
gpio_pull_up(ENCODER_SW);
// Set up interrupts for CLK and DT pins
gpio_set_irq_enabled_with_callback(ENCODER_CLK, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &encoder_isr);
gpio_set_irq_enabled(ENCODER_DT, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true);
while (1) {
printf("Encoder Count: %d\n", encoder_count);
// Optional: Check button press (if switch is available)
if (gpio_get(ENCODER_SW) == 0) {
printf("Button Pressed!\n");
}
sleep_ms(100); // Delay for stable output
}
}