#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
const uint RED_LED = 12; // Pino do LED Vermelho
const uint GREEN_LED = 13; // Pino do LED Verde
const uint BLUE_LED = 14; // Pino do LED Azul
const uint16_t PERIOD = 2000; // Período do PWM (valor máximo do contador)
const float DIVIDER_PWM = 16.0; // Divisor fracional do clock para o PWM
const uint16_t LED_STEP = 50; // Passo de incremento/decremento para o duty cycle do LED
uint16_t color_level = 10; // Nível inicial do PWM para a cor ativa
uint8_t up_down = 1; // Direção do fade
uint8_t active_color = 0; // 0=vermelho, 1=verde, 2=azul
void setup_pwm(uint gpio) {
uint slice;
gpio_set_function(gpio, GPIO_FUNC_PWM);
slice = pwm_gpio_to_slice_num(gpio);
pwm_set_clkdiv(slice, DIVIDER_PWM);
pwm_set_wrap(slice, PERIOD);
pwm_set_enabled(slice, true);
}
void set_color_level(uint gpio, uint16_t level) {
pwm_set_gpio_level(gpio, level);
}
int main() {
stdio_init_all();
setup_pwm(RED_LED);
setup_pwm(GREEN_LED);
setup_pwm(BLUE_LED);
while (true) {
uint active_gpio;
// Seleciona o pino da cor ativa
if (active_color == 0) {
active_gpio = RED_LED;
} else if (active_color == 1) {
active_gpio = GREEN_LED;
} else {
active_gpio = BLUE_LED;
}
// Define o nível do PWM da cor ativa
set_color_level(active_gpio, color_level);
printf("Color: %d, Level: %d, up_down: %d\n", active_color, color_level, up_down);
sleep_ms(100); // Ajuste o atraso para controlar a velocidade do fade
// Aplica o efeito fade
if (up_down) {
color_level += LED_STEP;
if (color_level > PERIOD) {
up_down = 0; // Inverte a direção do fade
active_color = (active_color + 1) % 3; // Avança para a próxima cor
color_level = PERIOD; // Garante que comece do máximo na próxima cor
}
} else {
color_level -= LED_STEP;
if (color_level <= LED_STEP) {
up_down = 1; // Inverte a direção do fade
active_color = (active_color + 1) % 3; // Avança para a próxima cor
color_level = 0; // Garante que comece do mínimo na próxima cor
}
}
}
}