#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#define DELAY_MS 5
#define PHASE_GAP_MS 1000 // Pausa entre as fases da atividade
#define LED_COUNT 4
#define LEDC_RESOLUTION LEDC_TIMER_10_BIT
// Canais e Pinos
const int led_pins[LED_COUNT] = {4, 5, 6, 7};
#define BUZZER_GPIO 45
#define BUZZER_CHANNEL LEDC_CHANNEL_4
// Altera duty cycle dos LEDs
void set_led_brightness(int channel, int duty) {
ledc_set_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)channel, duty);
ledc_update_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)channel);
}
//buzzer
void set_buzzer_freq(uint32_t freq) {
if (freq > 0) {
ledc_set_freq(LEDC_LOW_SPEED_MODE, LEDC_TIMER_1, freq);
ledc_set_duty(LEDC_LOW_SPEED_MODE, BUZZER_CHANNEL, 512); // 50% duty para som
} else {
ledc_set_duty(LEDC_LOW_SPEED_MODE, BUZZER_CHANNEL, 0); // Silêncio
}
ledc_update_duty(LEDC_LOW_SPEED_MODE, BUZZER_CHANNEL);
}
void fase_1_sincronizada() {
printf("Fase 1: Fading Sincronizado\n");
for (int b = 0; b <= 1024; b += 8) {
for (int i = 0; i < LED_COUNT; i++) set_led_brightness(i, b);
vTaskDelay(pdMS_TO_TICKS(10));
}
for (int b = 1024; b >= 0; b -= 8) {
for (int i = 0; i < LED_COUNT; i++) set_led_brightness(i, b);
vTaskDelay(pdMS_TO_TICKS(10));
}
}
void fase_2_sequencial() {
printf("Fase 2: Fading Sequencial\n");
for (int k = 0; k < LED_COUNT; k++) set_led_brightness(k, 0);
for (int i = 0; i < LED_COUNT; i++) {
//Sobe
for (int b = 0; b <= 1024; b += 16) {
set_led_brightness(i, b);
vTaskDelay(pdMS_TO_TICKS(10));
}
//Desce
for (int b = 1024; b >= 0; b -= 16) {
set_led_brightness(i, b);
vTaskDelay(pdMS_TO_TICKS(10));
}
set_led_brightness(i, 0);
}
}
void fase_3_buzzer() {
printf("Fase 3: Teste Sonoro (500Hz - 2000Hz)\n");
// Sobe frequência
for (uint32_t f = 500; f <= 2000; f += 50) {
set_buzzer_freq(f);
vTaskDelay(pdMS_TO_TICKS(50));
}
// Desce frequência
for (uint32_t f = 2000; f >= 500; f -= 50) {
set_buzzer_freq(f);
vTaskDelay(pdMS_TO_TICKS(50));
}
set_buzzer_freq(0);
}
void app_main(void) {
// Configuração do Timer 0 (LEDs - 1kHz)
ledc_timer_config_t led_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = LEDC_TIMER_0,
.duty_resolution = LEDC_RESOLUTION,
.freq_hz = 1000,
.clk_cfg = LEDC_AUTO_CLK
};
ledc_timer_config(&led_timer);
// Configuração do Timer 1
ledc_timer_config_t buzz_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = LEDC_TIMER_1,
.duty_resolution = LEDC_RESOLUTION,
.freq_hz = 1000, // Frequência inicial
.clk_cfg = LEDC_AUTO_CLK
};
ledc_timer_config(&buzz_timer);
// Configuração dos Canais
for (int i = 0; i < LED_COUNT; i++) {
ledc_channel_config_t led_chan = {
.gpio_num = led_pins[i],
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = i,
.timer_sel = LEDC_TIMER_0,
.duty = 0
};
ledc_channel_config(&led_chan);
}
ledc_channel_config_t buzz_chan = {
.gpio_num = BUZZER_GPIO,
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = BUZZER_CHANNEL,
.timer_sel = LEDC_TIMER_1,
.duty = 0
};
ledc_channel_config(&buzz_chan);
while (1) {
fase_1_sincronizada();
vTaskDelay(pdMS_TO_TICKS(PHASE_GAP_MS));
fase_2_sequencial();
vTaskDelay(pdMS_TO_TICKS(PHASE_GAP_MS));
fase_3_buzzer();
vTaskDelay(pdMS_TO_TICKS(PHASE_GAP_MS));
}
}