#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "ssd1306.h"
#include "hardware/i2c.h"
#include "hardware/adc.h"
#define LED_R_PIN 11 // GPIO 11 (Vermelho)
#define LED_G_PIN 12 // GPIO 12 (Verde)
#define LED_B_PIN 13 // GPIO 13 (Azul)
void set_rgb(uint r, uint g, uint b) {
gpio_put(LED_R_PIN, r); // Controla o LED Vermelho
gpio_put(LED_G_PIN, g); // Controla o LED Verde
gpio_put(LED_B_PIN, b); // Controla o LED Azul
}
int main() {
stdio_init_all();
adc_init();
// Inicializa os pinos GPIO como saída
gpio_init(LED_R_PIN);
gpio_init(LED_G_PIN);
gpio_init(LED_B_PIN);
gpio_set_dir(LED_R_PIN, GPIO_OUT);
gpio_set_dir(LED_G_PIN, GPIO_OUT);
gpio_set_dir(LED_B_PIN, GPIO_OUT);
// Inicializa os pinos ADC
adc_gpio_init(26); // ADC no pino 26 (Y)
adc_gpio_init(27); // ADC no pino 27 (X)
// Inicializa os LEDs como apagados (todos os valores são 0)
set_rgb(0, 0, 0);
while (1) {
// Lê as entradas do joystick (X e Y)
adc_select_input(1); // Y
uint adc_y_raw = adc_read();
adc_select_input(0); // X
uint adc_x_raw = adc_read();
// Mapeia o valor do joystick para os LEDs (0 a 1)
const uint adc_max = (1 << 12) - 1;
// Inicializa as cores dos LEDs (todas apagadas inicialmente)
uint r = 0, g = 0, b = 0;
// Verifica a direção para o movimento horizontal (esquerda ou direita)
if (adc_x_raw < adc_max / 3) {
// Esquerda -> Vermelho
r = 1;
} else if (adc_x_raw > 2 * adc_max / 3) {
// Direita -> Verde
g = 1;
}
// Verifica a direção para o movimento vertical (cima ou baixo)
if (adc_y_raw < adc_max / 3) {
// Baixo -> Amarelo (vermelho + verde)
r = 1;
g = 1;
} else if (adc_y_raw > 2 * adc_max / 3) {
// Cima -> Azul
b = 1;
}
// Se o joystick estiver na posição central, apagamos os LEDs
if (adc_x_raw > adc_max / 3 && adc_x_raw < 2 * adc_max / 3 &&
adc_y_raw > adc_max / 3 && adc_y_raw < 2 * adc_max / 3) {
r = g = b = 0; // Mantém os LEDs apagados
}
// Atualiza os LEDs de acordo com a direção
set_rgb(r, g, b);
// Atraso de 50ms entre as leituras
sleep_ms(50);
}
}