beep.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 "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. ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 100));
  27. // Update duty to apply the new value
  28. ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
  29. }
  30. static void set_beep_stop() {
  31. // Stop fading
  32. ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 0));
  33. // Update duty to apply the new value
  34. ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
  35. }
  36. static void beep_task(void * arg) {
  37. for(;;) {
  38. EventBits_t bits = xEventGroupWaitBits(beep_event_group, BEEP_BIT | STOP_BEEP_BIT, pdTRUE, pdFALSE, portMAX_DELAY);
  39. if(bits & BEEP_BIT) {
  40. set_beep();
  41. vTaskDelay(60 / portTICK_PERIOD_MS);
  42. set_beep_stop();
  43. }
  44. if(bits & STOP_BEEP_BIT) {
  45. set_beep_stop();
  46. }
  47. }
  48. }
  49. /**
  50. * @brief 蜂鸣器模块初始化
  51. */
  52. void beep_init(void) {
  53. ledc_timer_config_t ledc_timer = {
  54. .speed_mode = LEDC_MODE,
  55. .timer_num = LEDC_TIMER,
  56. .duty_resolution = LEDC_DUTY_RES,
  57. .freq_hz = LEDC_FREQUENCY, // Set output frequency at 4 kHz
  58. .clk_cfg = LEDC_AUTO_CLK
  59. };
  60. ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
  61. ledc_channel_config_t ledc_channel = {
  62. .speed_mode = LEDC_MODE,
  63. .channel = LEDC_CHANNEL,
  64. .timer_sel = LEDC_TIMER,
  65. .intr_type = LEDC_INTR_DISABLE,
  66. .gpio_num = LEDC_OUTPUT_IO,
  67. .duty = 0, // Set duty to 0%
  68. .hpoint = 0
  69. };
  70. ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
  71. beep_event_group = xEventGroupCreate();
  72. xTaskCreate(beep_task, "beep_task", 2048, NULL, 5, NULL);
  73. }