#include "sound.h" #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "esp_log.h" #include "sdkconfig.h" #include "driver/ledc.h" #define PWM_PIN GPIO_NUM_19 // GPIO pin for PWM output #define PWM_FREQ 262 // Frequency for C4 (Middle C) #define PWM_CHANNEL LEDC_CHANNEL_0 #define PWM_TIMER LEDC_TIMER_0 #define PWM_RES LEDC_TIMER_8_BIT // 8-bit resolution (0-255) static void setupSound() { // Configure LEDC PWM Timer ledc_timer_config_t timer_conf = { .speed_mode = LEDC_LOW_SPEED_MODE, .duty_resolution = PWM_RES, .timer_num = PWM_TIMER, .freq_hz = PWM_FREQ, .clk_cfg = LEDC_AUTO_CLK, }; ledc_timer_config(&timer_conf); // Configure LEDC PWM Channel ledc_channel_config_t channel_conf = { .gpio_num = PWM_PIN, .speed_mode = LEDC_LOW_SPEED_MODE, .channel = PWM_CHANNEL, .timer_sel = PWM_TIMER, .duty = 0, // Start at 0% volume }; ledc_channel_config(&channel_conf); ESP_LOGI("SOUND", "Sound setup"); } static void sound_task(void *pvParameters) { setupSound(); while (1) { ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, 30); ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL); /*// Gradually increase volume (fade-in) for (int duty = 10; duty <= 127; duty += 5) { ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, duty); ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL); vTaskDelay(pdMS_TO_TICKS(50)); }*/ vTaskDelay(pdMS_TO_TICKS(1000)); // Keep sound for 500ms ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, 10); ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL); /*// Gradually decrease volume (fade-out) for (int duty = 127; duty >= 0; duty -= 5) { ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, duty); ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL); vTaskDelay(pdMS_TO_TICKS(50)); }*/ vTaskDelay(pdMS_TO_TICKS(1000)); // Delay 1 second } ESP_LOGI("SOUND", "Sound task starts...."); } void initSound() { xTaskCreate(sound_task, "sound_task", 2048, NULL, 10, NULL); ESP_LOGI("SOUND", "Sound initialized"); }