beep.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /**
  2. * @Author: 李建
  3. * @Date: 2025/4/22 10:24
  4. * Description: 蜂鸣器模块
  5. * Copyright: Copyright (©) 2025 永续绿建. All rights reserved.
  6. */
  7. #include "freertos/FreeRTOS.h"
  8. #include <freertos/event_groups.h>
  9. #include "beep.h"
  10. #include "driver/ledc.h"
  11. #include "esp_err.h"
  12. #include "main.h"
  13. #define BEEP_BIT BIT0
  14. #define STOP_BEEP_BIT BIT1
  15. static EventGroupHandle_t beep_event_group;
  16. void beep() {
  17. xEventGroupSetBits(beep_event_group, BEEP_BIT);
  18. }
  19. void beep_stop() {
  20. xEventGroupSetBits(beep_event_group, STOP_BEEP_BIT);
  21. }
  22. static void set_beep() {
  23. if(system_setting.sound_on_off == 0)return;
  24. // Set duty to 50%
  25. ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, system_setting.sound_volume));
  26. // Update duty to apply the new value
  27. ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
  28. }
  29. static void set_beep_stop() {
  30. // Stop fading
  31. ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 0));
  32. // Update duty to apply the new value
  33. ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
  34. }
  35. static void beep_task(void * arg) {
  36. for(;;) {
  37. EventBits_t bits = xEventGroupWaitBits(beep_event_group, BEEP_BIT | STOP_BEEP_BIT, pdTRUE, pdFALSE, portMAX_DELAY);
  38. if(bits & BEEP_BIT) {
  39. set_beep();
  40. vTaskDelay(60 / portTICK_PERIOD_MS);
  41. set_beep_stop();
  42. }
  43. if(bits & STOP_BEEP_BIT) {
  44. set_beep_stop();
  45. }
  46. }
  47. }
  48. /**
  49. * @brief 蜂鸣器模块初始化
  50. */
  51. void beep_init(void) {
  52. ledc_timer_config_t ledc_timer = {
  53. .speed_mode = LEDC_MODE,
  54. .timer_num = LEDC_TIMER,
  55. .duty_resolution = LEDC_DUTY_RES,
  56. .freq_hz = LEDC_FREQUENCY, // Set output frequency at 4 kHz
  57. .clk_cfg = LEDC_AUTO_CLK
  58. };
  59. ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
  60. ledc_channel_config_t ledc_channel = {
  61. .speed_mode = LEDC_MODE,
  62. .channel = LEDC_CHANNEL,
  63. .timer_sel = LEDC_TIMER,
  64. .intr_type = LEDC_INTR_DISABLE,
  65. .gpio_num = LEDC_OUTPUT_IO,
  66. .duty = 0, // Set duty to 0%
  67. .hpoint = 0
  68. };
  69. ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
  70. beep_event_group = xEventGroupCreate();
  71. xTaskCreate(beep_task, "beep_task", 2048, NULL, 5, NULL);
  72. }