#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/adc.h"
#include "hardware/i2c.h"
#include "ssd1306.h"
#define LED_R 13
#define LED_G 11
#define LED_B 12
#define JOYSTICK_X 27
#define JOYSTICK_Y 26
#define BUTTON_JOYSTICK 22
#define BUTTON_A 5
#define I2C_SDA 14
#define I2C_SCL 15
bool led_verde_estado = false;
bool led_pwm_ativo = true;
int borda_estilo = 0;
int quadrado_x = 60, quadrado_y = 28;
void gpio_callback(uint gpio, uint32_t events) {
sleep_ms(50);
if (gpio == BUTTON_JOYSTICK) {
led_verde_estado = !led_verde_estado;
borda_estilo = (borda_estilo + 1) % 3;
gpio_put(LED_G, led_verde_estado);
} else if (gpio == BUTTON_A) {
led_pwm_ativo = !led_pwm_ativo;
if (!led_pwm_ativo) {
pwm_set_gpio_level(LED_R, 0);
pwm_set_gpio_level(LED_B, 0);
}
}
}
uint16_t map_value(uint16_t value, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) {
return (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
int main() {
stdio_init_all();
gpio_init(LED_G);
gpio_set_dir(LED_G, GPIO_OUT);
gpio_set_function(LED_R, GPIO_FUNC_PWM);
gpio_set_function(LED_B, GPIO_FUNC_PWM);
uint slice_r = pwm_gpio_to_slice_num(LED_R);
uint slice_b = pwm_gpio_to_slice_num(LED_B);
pwm_set_enabled(slice_r, true);
pwm_set_enabled(slice_b, true);
gpio_set_irq_enabled_with_callback(BUTTON_JOYSTICK, GPIO_IRQ_EDGE_FALL, true, &gpio_callback);
gpio_set_irq_enabled_with_callback(BUTTON_A, GPIO_IRQ_EDGE_FALL, true, &gpio_callback);
adc_init();
adc_gpio_init(JOYSTICK_X);
adc_gpio_init(JOYSTICK_Y);
i2c_init(i2c1, 400000);
gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
ssd1306_t disp;
ssd1306_init(&disp, 128, 64, i2c1);
while (1) {
adc_select_input(0);
uint16_t x_val = adc_read();
adc_select_input(1);
uint16_t y_val = adc_read();
if (led_pwm_ativo) {
pwm_set_gpio_level(LED_R, map_value(x_val, 0, 4095, 0, 65535));
pwm_set_gpio_level(LED_B, map_value(y_val, 0, 4095, 0, 65535));
}
quadrado_x = map_value(x_val, 0, 4095, 0, 120);
quadrado_y = map_value(y_val, 0, 4095, 0, 56);
ssd1306_clear(&disp);
if (borda_estilo == 0) ssd1306_draw_rect(&disp, 0, 0, 128, 64);
if (borda_estilo == 1) ssd1306_draw_rect(&disp, 2, 2, 124, 60);
if (borda_estilo == 2) ssd1306_draw_rect(&disp, 4, 4, 120, 56);
ssd1306_draw_filled_rect(&disp, quadrado_x, quadrado_y, 8, 8);
ssd1306_show(&disp);
sleep_ms(50);
}
}