#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include "hardware/timer.h"
#define JOY_Y_ADC_CHANNEL 0 // ADC0 = GPIO27 = Eixo Y do joystick
#define JOY_X_ADC_CHANNEL 1 // ADC1 = GPIO26 = Eixo X do joystick
#define LED_VERMELHO 12 // LED vermelho da BitDogLab (ânodo comum)
#define LED_AZUL 11 // LED azul
#define INTERVALO_MS 50 // Tempo entre amostragens
volatile bool acionado_azul = false;
volatile bool acionado_vermelho = false;
// Callback do timer periódico
bool leitura_joystick_callback(struct repeating_timer *t) {
adc_select_input(JOY_Y_ADC_CHANNEL);
uint16_t valor_x = adc_read();
adc_select_input(JOY_X_ADC_CHANNEL);
uint16_t valor_y = adc_read();
if (valor_x >= 1024 && valor_y >= 1024 && valor_x <= 3071 && valor_y <= 3071) {
if (!acionado_azul) {
acionado_vermelho = false;
acionado_azul = true;
printf("Acionado! Valor do ADC_X: %d e ADC_Y: %d\n", valor_x, valor_y);
gpio_put(LED_VERMELHO, 0); // Acende (ânodo comum)
gpio_put(LED_AZUL, 1);
}
} else {
if (!acionado_vermelho) {
acionado_azul = false;
acionado_vermelho = true;
gpio_put(LED_VERMELHO, 1); // Apaga
gpio_put(LED_AZUL,0);
printf("Acionado! Valor do ADC_X: %d e ADC_Y: %d\n", valor_x, valor_y);
}
}
return true; // Continua chamando o callback
}
int main() {
stdio_init_all();
sleep_ms(2000);
printf("🎮 Sistema iniciado. Aguarde...\n");
// Inicializa LED
gpio_init(LED_VERMELHO);
gpio_set_dir(LED_VERMELHO, GPIO_OUT);
gpio_put(LED_VERMELHO, 1); // LED apagado inicialmente
gpio_init(LED_AZUL);
gpio_set_dir(LED_AZUL, GPIO_OUT);
gpio_put(LED_AZUL, 1); // LED apagado inicialmente
// Inicializa ADC
adc_init();
adc_gpio_init(27); // GPIO27 = ADC1
adc_gpio_init(26); // GPIO26 = ADC0
// Adiciona timer periódico
struct repeating_timer timer;
add_repeating_timer_ms(INTERVALO_MS, leitura_joystick_callback, NULL, &timer);
// Loop principal faz nada, tudo controlado pelo timer
while (true) {
tight_loop_contents();
}
return 0;
}