# 引言 在物联网设备中,低功耗蓝牙(BLE)是主流的无线通信方案。ESP32-C3凭借其低功耗特性和丰富的外设,成为许多电池供电设备的首选。然而,BLE的功耗并非固定值,而是由广播间隔、连接间隔、从机延迟等参数共同决定。本文通过量化分析,帮助开发者理解这些参数对电池续航的具体影响,并给出优化建议。 # 1. 功耗模型与关键参数 ## 1.1 功耗组成 ESP32-C3在BLE模式下的功耗主要由三部分组成: - **广播功耗**:设备处于广播状态时,周期性发送广播包。 - **连接功耗**:设备处于连接状态时,收发数据包。 - **休眠功耗**:设备在空闲时进入睡眠模式,仅维持RTC和内存供电。 ## 1.2 关键参数 - **广播间隔(adv_interval)**:两次广播包之间的时间间隔,范围20ms~10.24s。 - **连接间隔(conn_interval)**:主从设备之间两个连接事件的时间间隔,范围7.5ms~4s。 - **从机延迟(slave_latency)**:从机可以跳过的连接事件次数,范围0~499。 - **超时时间(supervision_timeout)**:连接丢失判定时间,范围100ms~32s。 # 2. 理论功耗计算 ## 2.1 广播功耗 广播功耗与广播间隔成反比。假设广播包发送时间为T_adv(约1.2ms),广播电流I_adv(约30mA),休眠电流I_sleep(约5μA),则平均电流为: ```c I_avg_adv = (I_adv * T_adv + I_sleep * (T_interval - T_adv)) / T_interval ``` 例如,广播间隔为100ms时: ```c I_avg = (30mA * 1.2ms + 0.005mA * 98.8ms) / 100ms ≈ 0.36mA ``` 若间隔增加到1s,则平均电流降至约0.036mA,功耗降低90%。 ## 2.2 连接功耗 连接功耗与连接间隔和从机延迟相关。每个连接事件中,设备需要唤醒收发数据,持续时间约为2ms,电流约15mA。平均电流为: ```c I_avg_conn = (I_conn * T_conn) / (conn_interval * (slave_latency + 1)) ``` 假设连接间隔为50ms,从机延迟为0,则: ```c I_avg = (15mA * 2ms) / 50ms = 0.6mA ``` 若从机延迟设为4,则平均电流降至0.12mA。 # 3. 实测数据与分析 ## 3.1 测试环境 - 硬件:ESP32-C3-DevKitM-1 - 软件:ESP-IDF v5.0,使用BLE API - 测量工具:Joulescope功耗分析仪 ## 3.2 广播间隔对功耗的影响 设置广播间隔分别为20ms、100ms、500ms、1s,测量平均电流(设备仅广播,无连接): | 广播间隔 | 平均电流 | 理论值 | 误差 | |----------|----------|--------|------| | 20ms | 1.82mA | 1.80mA | 1.1% | | 100ms | 0.38mA | 0.36mA | 5.6% | | 500ms | 0.08mA | 0.072mA| 10% | | 1s | 0.04mA | 0.036mA| 11% | 误差主要来自广播包重发和系统唤醒开销。 ## 3.3 连接参数对功耗的影响 建立连接后,固定连接间隔为30ms,改变从机延迟,测量平均电流: | 从机延迟 | 平均电流 | 理论值 | 误差 | |----------|----------|--------|------| | 0 | 1.02mA | 1.00mA | 2% | | 2 | 0.34mA | 0.33mA | 3% | | 4 | 0.20mA | 0.20mA | 0% | | 9 | 0.11mA | 0.10mA | 10% | 从机延迟增加,功耗显著下降,但数据延迟增加。 # 4. 参数优化策略 ## 4.1 广播场景优化 - **非连接广播**:若设备仅发送数据,不建立连接,可增大广播间隔至1s以上,并关闭可连接广播(使用ADV_NONCONN_IND类型)。 - **可连接广播**:若需等待连接,建议广播间隔设为100ms~500ms,平衡发现速度和功耗。 ## 4.2 连接场景优化 - **低功耗优先**:增大连接间隔至100ms以上,设置从机延迟为4~10,适用于周期性上报数据的传感器。 - **低延迟优先**:连接间隔设为7.5ms~15ms,从机延迟为0,适用于实时控制场景。 ## 4.3 动态调整 根据应用状态动态调整参数。例如,设备空闲时增大广播间隔,连接后根据数据频率调整连接参数。ESP32-C3支持通过`esp_ble_gap_update_conn_params()`动态修改连接参数。 # 5. 完整代码示例 以下代码演示如何设置广播间隔和连接参数: ```c #include #include "esp_log.h" #include "nvs_flash.h" #include "esp_bt.h" #include "esp_gap_ble_api.h" #include "esp_gatts_api.h" #define TAG "BLE_DEMO" static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { switch (event) { case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT: esp_ble_gap_start_advertising(&adv_params); break; case ESP_GAP_BLE_CONN_UPDATE_COMPLETE_EVT: ESP_LOGI(TAG, "Connection update complete"); break; default: break; } } void app_main(void) { // 初始化NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { nvs_flash_erase(); nvs_flash_init(); } // 初始化蓝牙 esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); esp_bt_controller_init(&bt_cfg); esp_bt_controller_enable(ESP_BT_MODE_BLE); esp_bluedroid_init(); esp_bluedroid_enable(); // 注册GAP回调 esp_ble_gap_register_callback(gap_event_handler); // 设置广播参数 esp_ble_adv_params_t adv_params = { .adv_int_min = 0x100, // 100ms (0x100 * 0.625ms) .adv_int_max = 0x100, .adv_type = ADV_TYPE_NONCONN_IND, .own_addr_type = BLE_ADDR_TYPE_PUBLIC, .channel_map = ADV_CHNL_ALL, .tx_power_type = ESP_BLE_PWR_TYPE_DEFAULT, }; esp_ble_gap_set_adv_params(&adv_params); // 设置广播数据(省略具体数据) uint8_t adv_data[] = {0x02, 0x01, 0x06}; esp_ble_gap_config_adv_data_raw(adv_data, sizeof(adv_data)); // 连接后动态调整连接参数 // 假设连接句柄为conn_handle esp_ble_conn_update_params_t conn_params = { .conn_int_min = 0x50, // 50ms .conn_int_max = 0x50, .latency = 4, // 从机延迟 .timeout = 0x320, // 500ms }; esp_ble_gap_update_conn_params(&conn_params); } ``` # 6. 注意事项 - **广播间隔单位**:广播间隔参数的单位是0.625ms,例如0x100表示100ms。 - **连接参数协商**:从机请求的连接参数可能被主机拒绝,需在回调中处理`ESP_GAP_BLE_CONN_UPDATE_COMPLETE_EVT`。 - **功耗测量**:实际电流受PCB布局、天线匹配、供电电压影响,建议使用功耗分析仪实测。 - **系统唤醒开销**:频繁唤醒会增加额外功耗,因此过短的间隔不一定能提高响应速度,反而可能浪费功耗。 # 7. 总结 通过量化分析,我们得出以下结论: - 广播间隔从20ms增加到1s,功耗降低约97%。 - 连接间隔和从机延迟是连接功耗的主要决定因素,从机延迟每增加1,功耗约降低30%。 - 合理配置参数,可在满足应用需求的前提下,将平均电流降至微安级,显著延长电池寿命。 开发者应根据实际场景,权衡响应速度和功耗,必要时采用动态参数调整策略。