#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
#define LED_PIN 15 // LED no pino GP15
volatile bool button_pressed = false; // Estado do botão
volatile uint32_t last_interrupt_time = 0; // Tempo do último evento (para debouncing)
// Função ISR para interrupção no GPIO
void gpio_callback(uint gpio, uint32_t events) {
// Controle de debouncing
uint32_t current_time = to_ms_since_boot(get_absolute_time());
if (current_time - last_interrupt_time < 200) { // 200ms de debounce
return; // Ignorar interrupções repetidas
}
last_interrupt_time = current_time;
if (gpio == JOYSTICK_BUTTON_PIN) {
button_pressed = !button_pressed; // Alternar o estado
gpio_put(LED_PIN, button_pressed); // Ligar/desligar o LED
printf("Botão %s, LED %s\n",
button_pressed ? "pressionado" : "solto",
button_pressed ? "ligado" : "desligado");
}
}
// Inicializa ADC
void init_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
void config_button() {
gpio_init(JOYSTICK_BUTTON_PIN);
gpio_set_dir(JOYSTICK_BUTTON_PIN, GPIO_IN);
gpio_pull_up(JOYSTICK_BUTTON_PIN);
}
// Configura LED
void config_led() {
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, false); // Inicialmente desligado
}
int main() {
stdio_init_all();
sleep_ms(1000); // Aguarda a inicialização da UART
printf("Monitorando joystick com controle de debouncing...\n");
// Inicializa ADC
init_adc();
// Configurar GPIO do botão como entrada com pull-up interno
config_button();
// Configurar GPIO do LED como saída
config_led();
// 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
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);
}
}
Loading
pi-pico-w
pi-pico-w