#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include "hardware/irq.h"
#define JOYSTICK_X_PIN 26 // ADC0
#define JOYSTICK_Y_PIN 27 // ADC1
#define JOYSTICK_BUTTON_PIN 28 // Botão "Sel" do joystick
volatile bool button_pressed = false;
// ISR para interrupção no GPIO
void gpio_callback(uint gpio, uint32_t events) {
if (gpio == JOYSTICK_BUTTON_PIN) {
button_pressed = !gpio_get(JOYSTICK_BUTTON_PIN); // Atualizar estado do botão
printf("Botão do joystick %s\n", button_pressed ? "pressionado" : "solto");
}
}
int main() {
stdio_init_all();
sleep_ms(1000); // Aguarda a inicialização da UART
printf("Monitorando joystick com interrupções...\n");
// Inicializar ADC
adc_init();
adc_gpio_init(JOYSTICK_X_PIN);
adc_gpio_init(JOYSTICK_Y_PIN);
// Configurar GPIO do botão como entrada com pull-up interno
gpio_init(JOYSTICK_BUTTON_PIN);
gpio_set_dir(JOYSTICK_BUTTON_PIN, GPIO_IN);
gpio_pull_up(JOYSTICK_BUTTON_PIN);
// Configurar interrupção no GPIO
gpio_set_irq_enabled_with_callback(JOYSTICK_BUTTON_PIN, GPIO_IRQ_EDGE_FALL, true, &gpio_callback);
while (true) {
// Leitura contínua do joystick (opcional)
adc_select_input(0);
uint16_t x = adc_read();
adc_select_input(1);
uint16_t y = adc_read();
float voltage_x = (x / 4095.0) * 3.3;
float voltage_y = (y / 4095.0) * 3.3;
printf("Eixo X: %.2f V, Eixo Y: %.2f V\n", voltage_x, voltage_y);
sleep_ms(500);
}
}