chatgpt_esp32_蓝牙控制led_2.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #define PROFILE_NUM 1
  2. #define PROFILE_APP_IDX 0
  3. #define LED_CHAR_UUID 0x0100
  4. #define LED_CHAR_PROP (ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_READ)
  5. #define LED_CHAR_DESCR_UUID 0x0101
  6. #define LED_SERVICE_UUID 0x00FF
  7. #define LED_VALUE_LEN 1
  8. static uint8_t led_value = 0;
  9. static uint8_t led_char_descr[ESP_UUID_LEN_16] = {
  10. ESP_UUID_16(LED_CHAR_DESCR_UUID),
  11. ESP_UUID_16(ESP_GATT_UUID_CHAR_CLIENT_CONFIG),
  12. };
  13. static esp_ble_adv_data_t adv_data = {
  14. .set_scan_rsp = false,
  15. .include_name = true,
  16. .include_txpower = true,
  17. .min_interval = 0x20,
  18. .max_interval = 0x40,
  19. .appearance = 0x00,
  20. .manufacturer_len = 0,
  21. .p_manufacturer_data = NULL,
  22. .service_data_len = 0,
  23. .p_service_data = NULL,
  24. .service_uuid_len = sizeof(LED_SERVICE_UUID),
  25. .p_service_uuid = (uint8_t *)&LED_SERVICE_UUID,
  26. .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
  27. };
  28. static esp_ble_adv_params_t adv_params = {
  29. .adv_int_min = 0x20,
  30. .adv_int_max = 0x40,
  31. .adv_type = ADV_TYPE_NONCONN_IND,
  32. .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
  33. .channel_map = ADV_CHNL_ALL,
  34. .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
  35. };
  36. static esp_gatts_attr_db_t gatt_db[1] = {
  37. [0] = {
  38. .att_desc = {
  39. .uuid_length = ESP_UUID_LEN_16,
  40. .uuid_p = (uint8_t *)&LED_CHAR_UUID,
  41. .perm = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
  42. .max_length = LED_VALUE_LEN,
  43. .length = LED_VALUE_LEN,
  44. },
  45. .desc = {
  46. .uuid_length = ESP_UUID_LEN_16,
  47. .uuid_p = (uint8_t *)&LED_CHAR_DESCR_UUID,
  48. .perm = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
  49. .max_length = sizeof(uint16_t),
  50. .length = sizeof(uint16_t),
  51. .value = (uint8_t *)&led_char_descr,
  52. },
  53. .attr_control = {
  54. .auto_rsp = ESP_GATT_AUTO_RSP,
  55. },
  56. },
  57. };
  58. static esp_gatts_attr_db_t *gatt_db_ptr = gatt_db;
  59. static esp_gatts_service_t gatt_service = {
  60. .uuid = {
  61. .len = ESP_UUID_LEN_16,
  62. .uuid = (uint8_t *)&LED_SERVICE_UUID,
  63. },
  64. .num_handle = 1,
  65. .handle = NULL,
  66. .end_handle = NULL,
  67. .type = ESP_GATT_SVC_TYPE_PRIMARY,
  68. .parent = NULL,
  69. .desc = {
  70. .uuid_length = 0,
  71. .uuid_p = NULL,
  72. .perm = 0,
  73. .max_length = 0,
  74. .length = 0,
  75. .value = NULL,
  76. },
  77. .srvc_db = gatt
  78. static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param)
  79. {
  80. switch (event) {
  81. case ESP_GATTS_REG_EVT:
  82. esp_ble_gap_set_device_name("LED Control");
  83. esp_ble_gap_config_adv_data(&adv_data);
  84. esp_ble_gatts_create_service(gatts_if, &gatt_service, PROFILE_NUM);
  85. break;
  86. case ESP_GATTS_READ_EVT:
  87. if (param->read.handle == gatt_db[0].att_desc.handle) {
  88. esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &led_value, sizeof(led_value));
  89. }
  90. break;
  91. case ESP_GATTS_WRITE_EVT:
  92. if (param->write.handle == gatt_db[0].att_desc.handle) {
  93. led_value = *param->write.value;
  94. update_led_brightness(led_value);
  95. esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL, 0);
  96. }
  97. break;
  98. case ESP_GATTS_CREAT_ATTR_TAB_EVT:
  99. if (param->add_attr_tab.status != ESP_GATT_OK) {
  100. break;
  101. }
  102. gatt_db_ptr[0].att_desc.handle = param->add_attr_tab.handles[0];
  103. gatt_db_ptr[0].desc.handle = param->add_attr_tab.handles[1];
  104. esp_ble_gatts_start_service(gatt_db_ptr[0].att_desc.handle);
  105. break;
  106. case ESP_GATTS_CONNECT_EVT:
  107. esp_ble_gap_stop_advertising();
  108. break;
  109. case ESP_GATTS_DISCONNECT_EVT:
  110. esp_ble_gap_start_advertising(&adv_params);
  111. break;
  112. default:
  113. break;
  114. }
  115. }
  116. void app_main()
  117. {
  118. gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
  119. gpio_set_direction(BUTTON_A_PIN, GPIO_MODE_INPUT);
  120. gpio_set_direction(BUTTON_B_PIN, GPIO_MODE_INPUT);
  121. gpio_set_direction(BUTTON_C_PIN, GPIO_MODE_INPUT);
  122. esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
  123. esp_bt_controller_init(&bt_cfg);
  124. esp_bt_controller_enable(ESP_BT_MODE_BLE);
  125. esp
  126. esp_bluedroid_init();
  127. esp_bluedroid_enable();
  128. esp_gap_ble_set_device_name("LED Control");
  129. esp_gap_ble_set_advertise_mode(ESP_BLE_ADV_TYPE_ADV_IND);
  130. esp_gap_ble_add_service_uuid(&gatt_service_id);
  131. esp_gap_ble_set_adv_data(&adv_data);
  132. esp_gap_ble_start_advertising(&adv_params);
  133. esp_ble_gatts_register_callback(gatts_event_handler);
  134. esp_ble_gatts_app_register(PROFILE_NUM);
  135. while (1) {
  136. if (gpio_get_level(BUTTON_A_PIN) == 0) {
  137. increase_led_brightness();
  138. }
  139. if (gpio_get_level(BUTTON_B_PIN) == 0) {
  140. decrease_led_brightness();
  141. }
  142. if (gpio_get_level(BUTTON_C_PIN) == 0) {
  143. toggle_led();
  144. }
  145. vTaskDelay(50 / portTICK_PERIOD_MS);
  146. }
  147. }