#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/irq.h"
#define LED_VERM 13
#define LED_AZUL 12
#define LED_VERD 11
#define BUTTONA 5
#define BUTTONB 6
#define BUTTONSW 22
const uint16_t PERIOD = 2000;
const float DIVIDER_PWM_RED = 62.4; // 1kHz
const float DIVIDER_PWM_BLUE = 6.24; // 10kHz
const uint16_t LED_STEP = 100; // Passo
const uint32_t PWM_REFRESH_LEVEL = 1280000;
uint16_t led_level_blue = 100;
uint16_t led_level_red = 100;
void init();
void pwm_irq_handler();
void setup_pwm(const uint LED, const float DIVIDER_PWM, uint16_t led_level);
int main() {
init();
while (true) {
sleep_ms(200); // Atraso de 200 ms
}
}
void init() {
stdio_init_all();
sleep_ms(3000);
setup_pwm(LED_VERM, DIVIDER_PWM_RED, led_level_red);
setup_pwm(LED_AZUL, DIVIDER_PWM_BLUE, led_level_blue);
}
void pwm_irq_handler() {
uint32_t status = pwm_get_irq_status_mask();
pwm_clear_irq(status);
static uint32_t count = 0;
if (count++ < PWM_REFRESH_LEVEL) return;
count = 0;
if (status & (1 << pwm_gpio_to_slice_num(LED_VERM))) {
static uint up_down_red = 1;
if (up_down_red) {
led_level_red += LED_STEP;
if (led_level_red >= PERIOD)
up_down_red = 0;
} else {
led_level_red -= LED_STEP;
if (led_level_red <= LED_STEP)
up_down_red = 1;
}
pwm_set_gpio_level(LED_VERM, led_level_red);
}
// LED azul (slice associado ao LED azul)
if (status & (1 << pwm_gpio_to_slice_num(LED_AZUL))) {
static uint up_down_blue = 1; // Direção do fade do LED azul
if (up_down_blue) {
led_level_blue += LED_STEP;
if (led_level_blue >= PERIOD)
up_down_blue = 0;
} else {
led_level_blue -= LED_STEP;
if (led_level_blue <= LED_STEP)
up_down_blue = 1;
}
pwm_set_gpio_level(LED_AZUL, led_level_blue);
}
}
// Função para configurar o PWM para o LED
void setup_pwm(const uint LED, const float DIVIDER_PWM, uint16_t led_level) {
uint slice;
gpio_set_function(LED, GPIO_FUNC_PWM);
slice = pwm_gpio_to_slice_num(LED);
pwm_set_clkdiv(slice, DIVIDER_PWM);
pwm_set_wrap(slice, PERIOD);
pwm_set_gpio_level(LED, led_level);
pwm_set_enabled(slice, true);
irq_set_exclusive_handler(PWM_IRQ_WRAP, pwm_irq_handler);
pwm_clear_irq(slice);
pwm_set_irq_enabled(slice, true);
irq_set_enabled(PWM_IRQ_WRAP, true);
}