sound.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "sound.h"
  2. #include <stdio.h>
  3. #include "freertos/FreeRTOS.h"
  4. #include "freertos/task.h"
  5. #include "driver/gpio.h"
  6. #include "esp_log.h"
  7. #include "sdkconfig.h"
  8. #include "driver/ledc.h"
  9. #define PWM_PIN GPIO_NUM_19 // GPIO pin for PWM output
  10. #define PWM_FREQ 262 // Frequency for C4 (Middle C)
  11. #define PWM_CHANNEL LEDC_CHANNEL_0
  12. #define PWM_TIMER LEDC_TIMER_0
  13. #define PWM_RES LEDC_TIMER_8_BIT // 8-bit resolution (0-255)
  14. static void setupSound() {
  15. // Configure LEDC PWM Timer
  16. ledc_timer_config_t timer_conf = {
  17. .speed_mode = LEDC_LOW_SPEED_MODE,
  18. .duty_resolution = PWM_RES,
  19. .timer_num = PWM_TIMER,
  20. .freq_hz = PWM_FREQ,
  21. .clk_cfg = LEDC_AUTO_CLK,
  22. };
  23. ledc_timer_config(&timer_conf);
  24. // Configure LEDC PWM Channel
  25. ledc_channel_config_t channel_conf = {
  26. .gpio_num = PWM_PIN,
  27. .speed_mode = LEDC_LOW_SPEED_MODE,
  28. .channel = PWM_CHANNEL,
  29. .timer_sel = PWM_TIMER,
  30. .duty = 0, // Start at 0% volume
  31. };
  32. ledc_channel_config(&channel_conf);
  33. ESP_LOGI("SOUND", "Sound setup");
  34. }
  35. static void sound_task(void *pvParameters) {
  36. setupSound();
  37. while (1) {
  38. ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, 30);
  39. ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL);
  40. /*// Gradually increase volume (fade-in)
  41. for (int duty = 10; duty <= 127; duty += 5) {
  42. ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, duty);
  43. ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL);
  44. vTaskDelay(pdMS_TO_TICKS(50));
  45. }*/
  46. vTaskDelay(pdMS_TO_TICKS(1000)); // Keep sound for 500ms
  47. ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, 10);
  48. ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL);
  49. /*// Gradually decrease volume (fade-out)
  50. for (int duty = 127; duty >= 0; duty -= 5) {
  51. ledc_set_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL, duty);
  52. ledc_update_duty(LEDC_LOW_SPEED_MODE, PWM_CHANNEL);
  53. vTaskDelay(pdMS_TO_TICKS(50));
  54. }*/
  55. vTaskDelay(pdMS_TO_TICKS(1000)); // Delay 1 second
  56. }
  57. ESP_LOGI("SOUND", "Sound task starts....");
  58. }
  59. void initSound() {
  60. xTaskCreate(sound_task, "sound_task", 2048, NULL, 10, NULL);
  61. ESP_LOGI("SOUND", "Sound initialized");
  62. }