//Modifique o exemplo de código apresentado na videoaula (reproduzido abaixo) para controlar os três LEDs RGB da placa BitDogLab usando o módulo PWM e interrupções, seguindo as orientações a seguir:
//O LED vermelho deve ser acionado com um PWM de 1kHz.
//O duty cycle deve ser iniciado em 5% e atualizado a cada 2 segundos em incrementos de 5%. Quando atingir o valor máximo, deve retornar a 5%.
//O LED azul deve ser acionado com um PWM de 10kHz.
// pra entender o wrap: https://medium.com/@pranjalchanda08/rp2040-pwm-frequency-and-duty-cycle-set-algorithm-2eb953b83dd4
#include "pico/stdlib.h"
#include "hardware/pwm.h"
// Definindo os pinos dos LEDs e dos botões:
#define LED_RED 13
#define LED_GREEN 11
#define LED_BLUE 12
#define BUTTON_A 5
#define BUTTON_B 6
// Função para configurar um pino como saída PWM
uint pwm_configure(uint pin) {
gpio_set_function(pin, GPIO_FUNC_PWM);
uint slice_num = pwm_gpio_to_slice_num(pin);
pwm_set_wrap(slice_num, 12499); // Frequência de 1kHz com clock padrão 125MHz
pwm_set_enabled(slice_num, true);
return slice_num;
}
// Função principal
int main() {
// Inicializa o sistema
stdio_init_all();
// Configura os LEDs e botões
gpio_init(BUTTON_A);
gpio_init(BUTTON_B);
gpio_set_dir(BUTTON_A, GPIO_IN);
gpio_set_dir(BUTTON_B, GPIO_IN);
gpio_pull_up(BUTTON_A);
gpio_pull_up(BUTTON_B);
// Configura PWM para os LEDs
uint slice_red = pwm_configure(LED_RED);
uint slice_green = pwm_configure(LED_GREEN);
uint slice_blue = pwm_configure(LED_BLUE);
// Inicia os LEDs desligados
pwm_set_gpio_level(LED_RED, 0);
pwm_set_gpio_level(LED_GREEN, 0);
pwm_set_gpio_level(LED_BLUE, 0);
uint duty_cycle = 5; // Duty cycle inicial
bool start_sequence = false;
while (true) {
// Verifica se o botão B foi pressionado
if (!gpio_get(BUTTON_B)) {
// Para a sequência e desliga os LEDs
start_sequence = false;
pwm_set_gpio_level(LED_RED, 0);
pwm_set_gpio_level(LED_GREEN, 0);
pwm_set_gpio_level(LED_BLUE, 0);
while (!gpio_get(BUTTON_B)) {
sleep_ms(10); // Aguarda o botão B ser solto
}
}
// Verifica se o botão A foi pressionado para iniciar a sequência
if (!gpio_get(BUTTON_A)) {
start_sequence = true;
while (!gpio_get(BUTTON_A)) {
sleep_ms(10); // Aguarda o botão A ser solto
}
}
if (start_sequence) {
// Controle do LED vermelho
for (duty_cycle = 5; duty_cycle <= 100; duty_cycle += 10) {
pwm_set_gpio_level(LED_RED, duty_cycle * 125);
sleep_ms(1000);
if (!gpio_get(BUTTON_B)) {
start_sequence = false;
pwm_set_gpio_level(LED_RED, 0);
pwm_set_gpio_level(LED_GREEN, 0);
pwm_set_gpio_level(LED_BLUE, 0);
break;
}
}
if (!start_sequence) continue;
// Controle do LED verde
for (duty_cycle = 5; duty_cycle <= 100; duty_cycle += 10) {
pwm_set_gpio_level(LED_GREEN, duty_cycle * 125);
sleep_ms(1000);
if (!gpio_get(BUTTON_B)) {
start_sequence = false;
pwm_set_gpio_level(LED_RED, 0);
pwm_set_gpio_level(LED_GREEN, 0);
pwm_set_gpio_level(LED_BLUE, 0);
break;
}
}
if (!start_sequence) continue;
// Controle do LED azul
for (duty_cycle = 5; duty_cycle <= 100; duty_cycle += 10) {
pwm_set_gpio_level(LED_BLUE, duty_cycle * 125);
sleep_ms(1000);
if (!gpio_get(BUTTON_B)) {
start_sequence = false;
pwm_set_gpio_level(LED_RED, 0);
pwm_set_gpio_level(LED_GREEN, 0);
pwm_set_gpio_level(LED_BLUE, 0);
break;
}
}
}
}
return 0;
}