chatgpt_esp32_蓝牙控制led_1.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include <stdio.h>
  2. #include "freertos/FreeRTOS.h"
  3. #include "freertos/task.h"
  4. #include "driver/gpio.h"
  5. #include "driver/pwm.h"
  6. #include "esp_log.h"
  7. #include "esp_system.h"
  8. #include "nvs_flash.h"
  9. #include "esp_bt.h"
  10. #include "esp_gap_ble_api.h"
  11. #include "esp_gattc_api.h"
  12. #include "esp_gatts_api.h"
  13. #include "esp_gatt_common_api.h"
  14. #define BUTTON_A_GPIO GPIO_NUM_5
  15. #define BUTTON_B_GPIO GPIO_NUM_6
  16. #define BUTTON_C_GPIO GPIO_NUM_7
  17. #define LED_GPIO GPIO_NUM_16
  18. #define PWM_CHANNEL PWM_CHANNEL_0
  19. #define PWM_FREQ 1000
  20. #define PWM_RES 100
  21. #define GATTS_TAG "GATTS_DEMO"
  22. #define GATTS_SERVICE_UUID 0x00FF
  23. #define GATTS_CHAR_UUID_LED_ON_OFF 0xFF01
  24. #define GATTS_CHAR_UUID_LED_BRIGHTNESS 0xFF02
  25. #define GATTS_CHAR_UUID_LED_CONTROL 0xFF03
  26. static bool led_on = false;
  27. static int led_brightness = 0;
  28. // 定义蓝牙服务和特征值UUID
  29. static uint16_t gatts_service_uuid = GATTS_SERVICE_UUID;
  30. static uint16_t gatts_char_uuid_led_on_off = GATTS_CHAR_UUID_LED_ON_OFF;
  31. static uint16_t gatts_char_uuid_led_brightness = GATTS_CHAR_UUID_LED_BRIGHTNESS;
  32. static uint16_t gatts_char_uuid_led_control = GATTS_CHAR_UUID_LED_CONTROL;
  33. // 定义蓝牙特征值句柄
  34. static uint16_t gatts_handle_table[3];
  35. // 定义解析BLE指令的函数
  36. static void parse_ble_command(uint8_t *value, size_t len) {
  37. switch (value[0]) {
  38. case 0x01: // LED开关
  39. if (len == 2) {
  40. if (value[1] == 0x01) {
  41. led_on = true;
  42. pwm_set_duty(PWM_CHANNEL, led_brightness);
  43. pwm_start();
  44. }
  45. else if (value[1] == 0x00) {
  46. led_on = false;
  47. pwm_stop();
  48. }
  49. }
  50. break;
  51. case 0x02: // 逐级增减LED亮度
  52. if (len == 2) {
  53. int delta = (value[1] == 0x01 ? 1 : -1);
  54. led_brightness += delta;
  55. if (led_brightness < 0) {
  56. led_brightness = 0;
  57. }
  58. else if (led_brightness > PWM_RES) {
  59. led_brightness = PWM_RES;
  60. }
  61. if (led_on) {
  62. pwm_set_duty(PWM_CHANNEL, led_brightness);
  63. pwm_start();
  64. }
  65. }
  66. break;
  67. case 0x03: // 直接指定LED亮度
  68. if (len == 2) {
  69. led_brightness = value[1];
  70. if (led_brightness < 0) {
  71. led_brightness = 0;
  72. }
  73. else if (led_brightness > PWM_RES) {
  74. led_brightness = PWM_RES;
  75. }
  76. if (
  77. led_on) {
  78. pwm_set_duty(PWM_CHANNEL, led_brightness);
  79. pwm_start();
  80. }
  81. }
  82. break;
  83. default:
  84. break;
  85. }
  86. }
  87. // 定义BLE GATT Server回调函数
  88. static esp_gatts_cb_event_t gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) {
  89. switch (event) {
  90. case ESP_GATTS_REG_EVT:
  91. // 注册GATT服务
  92. esp_err_t create_attr_ret = esp_ble_gatts_create_attr_tab((esp_gatts_attr_db_t *)param->reg.create.handles, gatts_if, 3, 0);
  93. if (create_attr_ret != ESP_OK) {
  94. ESP_LOGE(GATTS_TAG, "create attr table failed, error code = %x", create_attr_ret);
  95. }
  96. else {
  97. // 保存特征值句柄
  98. memcpy(gatts_handle_table, param->reg.create.handles, sizeof(gatts_handle_table));
  99. }
  100. break;
  101. case ESP_GATTS_READ_EVT:
  102. break;
  103. case ESP_GATTS_WRITE_EVT:
  104. if (param->write.is_prep) {
  105. break;
  106. }
  107. if (param->write.need_rsp) {
  108. esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL);
  109. }
  110. parse_ble_command(param->write.value, param->write.len);
  111. break;
  112. default:
  113. break;
  114. }
  115. return ESP_GATT_OK;
  116. }
  117. // 定义按钮A的中断处理函数
  118. static void IRAM_ATTR button_a_isr_handler(void *arg) {
  119. static uint64_t button_a_pressed_time = 0;
  120. uint64_t button_a_current_time = esp_timer_get_time();
  121. if (gpio_get_level(BUTTON_A_GPIO) == 0) {
  122. button_a_pressed_time = button_a_current_time;
  123. }
  124. else {
  125. if (button_a_current_time - button_a_pressed_time > 500000) { // 长按
  126. led_brightness--;
  127. if (led_brightness < 0) {
  128. led_brightness = 0;
  129. }
  130. pwm_set_duty(PWM_CHANNEL, led_brightness);
  131. pwm_start();
  132. }
  133. else { // 短按
  134. led_brightness++;
  135. if (led_brightness > PWM_RES) {
  136. led_brightness = PWM_RES;
  137. }
  138. pwm_set_duty(PWM_CHANNEL, led_brightness);
  139. pwm_start();
  140. }
  141. }
  142. }
  143. // 定义按钮B的中断处理函数
  144. static void IRAM_ATTR button_b_isr_handler(void *arg) {
  145. static uint64_t button_b_pressed_time = 0;
  146. uint64_t button_b_current_time = esp_timer_get_time();
  147. if (gpio_get_level(BUTTON_B_GPIO) == 0) {
  148. button_b_pressed_time = button_b_current_time;
  149. }
  150. else {
  151. if (button_b_current_time - button_b_pressed_time > 500000) { // 长按
  152. led_brightness++;
  153. if (led_brightness > PWM_RES) {
  154. led_brightness = PWM_RES;
  155. }
  156. pwm_set_duty(PWM_CHANNEL, led_brightness);
  157. pwm_start();
  158. }
  159. else { // 短按
  160. led_brightness--;
  161. if (led_brightness < 0) {
  162. led_brightness = 0;
  163. }
  164. pwm_set_duty(PWM_CHANNEL, led_brightness);
  165. pwm_start();
  166. }
  167. }
  168. }
  169. // 定义按钮C的中断处理函数
  170. static void IRAM_ATTR button_c_isr_handler(void *arg) {
  171. bool led_on = false;
  172. if (gpio_get_level(LED_GPIO) == 0) {
  173. led_on = true;
  174. }
  175. led_on = !led_on;
  176. gpio_set_level(LED_GPIO, led_on ? 1 : 0);
  177. }
  178. void app_main() {
  179. // 初始化GPIO
  180. gpio_pad_select_gpio(BUTTON_A_GPIO);
  181. gpio_pad_select_gpio(BUTTON_B_GPIO);
  182. gpio_pad_select_gpio(BUTTON_C_GPIO);
  183. gpio_pad_select_gpio(LED_GPIO);
  184. gpio_set_direction(BUTTON_A_GPIO, GPIO_MODE_INPUT);
  185. gpio_set_direction(BUTTON_B_GPIO, GPIO_MODE_INPUT);
  186. gpio_set_direction(BUTTON_C_GPIO, GPIO_MODE_INPUT);
  187. gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
  188. gpio_set_level(LED_GPIO, 0);
  189. // 初始化PWM
  190. pwm_init(PWM_CHANNEL, NULL);
  191. pwm_set_freq(PWM_CHANNEL, PWM_FREQ);
  192. pwm_set_duty(PWM_CHANNEL, 0);
  193. pwm_start();
  194. // 设置按钮A的中断
  195. gpio_set_intr_type(BUTTON_A_GPIO, GPIO_INTR_ANYEDGE);
  196. gpio_install_isr_service(0);
  197. gpio_isr_handler_add(BUTTON_A_GPIO, button_a_isr_handler, NULL);
  198. // 设置按钮B的中断
  199. gpio_set_intr_type(BUTTON_B_GPIO, GPIO_INTR_ANYEDGE);
  200. gpio_isr_handler_add(BUTTON_B_GPIO, button_b_isr_handler, NULL);
  201. // 设置按钮C的中断
  202. gpio_set_intr_type(BUTTON_C_GPIO, GPIO_INTR_ANYEDGE);
  203. gpio_isr_handler_add(BUTTON_C_GPIO, button_c_isr_handler, NULL);
  204. // 初始化BLE
  205. esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
  206. esp_bt_controller_init(&bt_cfg);
  207. esp_bt_controller_enable(ESP_BT_MODE_BTDM);
  208. esp_bluedroid_init();
  209. esp_bluedroid_enable();
  210. esp_ble_gatts_register_callback(gatts_event_handler);
  211. esp_ble_gatts_app_register(APP_ID);
  212. }