
前阵子一个朋友做低功耗温湿度传感器PCB还在打样他先问我一句一颗CR2032广播间隔和连接参数怎么配电池才能撑一年这个问题很典型很多做BLE项目的朋友都卡在这一步。你把广播间隔调大确实能省一点电但同一个模块如果连接参数没有配合好或者板上多了一个LED、一组上拉电阻续航照样对不上账。这篇文章我就从蓝牙模块功耗优化出发把广播间隔、连接参数、电池容量的关系拆开讲最后给出一组可以直接抄的配置和算续航的方法。打算用纽扣电池做低功耗传感器、防丢器、门锁、ibeacon的朋友可以照着这个思路去算自己的产品账。先说明一下这里说的是BLE低功耗蓝牙模块不是大家熟知的HC-05那种经典蓝牙串口模块。HC-05协议栈常连接、能耗高不适合拿纽扣电池做一年续航。后面所有讨论默认是BLE模块。1. 先算总账一颗CR2032一年只能给25μA平均电流很多功耗优化文章一上来就讲广播参数其实应该先算电池账。公式非常简单电池寿命小时 可用容量mAh / 平均电流mA。如果目标是一年就是8760小时。1.1 标称容量和可用容量是两回事以CR2032为例标称容量大概220mAh但别把它当220mAh用。纽扣电池在小电流放电时能放出接近标称的容量但在BLE模块发射时会有几毫安到十几毫安的脉冲电流电池内部电阻会吃掉一部分电压导致容量不能100%放出来。通常按70%~85%估取80%就是180mAh。不同电池的可用容量差别很大先列一个常用参考表电池类型标称容量按80%可用一年平均电流预算CR2032220mAh约180mAh20.5μACR24771000mAh约800mAh91μAAA锂铁电池3000mAh约2400mAh274μA锂亚电池4000mAh约3200mAh365μA所以“电池能不能撑一年”第一个问题不是蓝牙参数而是你愿意为电池付出多少体积。CR2032是很多传感器产品的首选但它的平均电流预算只有20μA左右比你想象的紧得多。1.2 一年平均电流预算怎么算反过来算一下180mAh / 8760h ≈ 20.5μA。也就是说整机平均电流如果超过20μA理论上一年的目标就悬了。这里可以做几个直观换算1μA的持续漏电流一年就是8.76mAh。模块深度睡眠电流如果是2μA一年就是17.5mAh约占CR2032可用容量的10%。一个一直点亮的LED如果电流是1mA一年就是8760mAh几节AA都扛不住。很多项目续航对不上账不是模块本身功耗太大而是各种“看似很小”的电流加在一起很快吃完了预算。所以第一步一定要建立整机平均电流的概念而不是只看模块峰值电流。2. 蓝牙模块的功耗花在哪从睡眠电流到广播事件逐项拆低功耗蓝牙模块的电流不是单一数值它是一个状态机睡眠、唤醒、广播、连接、处理业务、再睡回去。每个状态电流不同持续时间也不同真正决定续航的是每个状态占总时间的比例。2.1 模块的工作状态拆解典型状态可以看这张表状态典型电流持续时间频率深度睡眠0.5~3μA常驻常驻广播发射5~20mA每个广播事件1~1.5ms由广播间隔决定连接事件5~20mA每次0.5~1ms由连接参数决定CPU唤醒1~10mA几ms由业务逻辑决定传感器测量视型号几ms到几十ms测量周期模块厂商给的数据手册往往会写一个“极低睡眠电流”和一个“峰值发射电流”这两个数字不能直接用来估算续航。睡眠电流管的是静态基线峰值电流管的是电池瞬间能不能扛住而平均电流才是电池寿命的直接决定因素。2.2 广播事件电荷的计算方法BLE广播不是发一个包就完事而是在37、38、39三个信道轮流各发一遍目的是躲开Wi-Fi干扰也让扫描方有更大概率收到。这三个脉冲合起来算常见模块一个广播事件要占1ms~1.5ms。计算时用“事件电荷”最方便。比如发射电流8mA事件时长1.2ms那这个广播事件的电荷就是Q_event 8mA × 1.2ms 9.6μC一个广播事件消耗9.6μC电荷。平均电流就是电荷除以事件周期平均电流 Q_event / 广播间隔假如广播间隔是2s平均电流就是9.6μC / 2s 4.8μA。这个换算方式比直接盯着峰值电流直观得多后面所有估算都基于这个思路。连接事件也类似但复杂度更高。从机要在每个连接事件锚点醒来听主机发的第一个包如果没有数据还要回一个空包然后再睡回去。一次空连接事件典型占用0.5ms~1ms算上唤醒开销电荷大概在5μC~15μC之间。具体数值和芯片、协议栈、供电方式都有关先用10μC估算没太大问题。3. 广播间隔的取舍既想省电又想让手机秒连该怎么做广播间隔在BLE规范里可以设20ms到10.24s默认很多模块是100ms。100ms对配网很友好但对纽扣电池很不友好。3.1 默认100ms广播间隔为什么养不起纽扣电池按上一节的例子单广播事件9.6μC广播间隔100ms时平均电流就是9.6μC / 0.1s 96μA。一年算下来是96μA × 8760h ≈ 841mAh一节CR2032大概只够两个月。我把不同广播间隔下的理论平均电流算了一下按单事件9.6μC、睡眠电流2μC估算广播间隔每秒广播次数广播平均电流加睡眠后一年耗电100ms1096μA98μA858mAh1s19.6μA11.6μA102mAh2s0.54.8μA6.8μA60mAh5s0.21.9μA3.9μA34mAh10s0.11.0μA3.0μA26mAh注意这张表是按不可连接广播估的如果使用可连接广播单事件时间会更长电流也会更高。但数量级不会变广播间隔100ms对纽扣电池基本是灾难2s是一个比较舒服的起点。3.2 双模式广播配网时快运行时省如果你做的是需要手机连接的产品我不建议常态用10s广播因为手机扫描时发现设备太慢用户会以为设备坏了。更合理的做法是“双模式广播”配网模式上电后或按键触发广播间隔100ms可连接持续30秒到60秒保证手机一扫描就能看到。正常运行模式进入正常工作后广播间隔切到1s或2s仍然保持可连接但发现速度会慢一点。还可以再加一个更省的“休眠广播”模式设备只发不可连接广播或者干脆停止广播只通过低功耗定时器唤醒。如果手机需要连接就先通过某种方式唤醒设备再切到可连接广播。3.3 广播类型、载荷和发射功率的隐藏功耗除了广播间隔广播类型也影响功耗。如果数据单向上报网关或手机只需要扫描拿数据优先用不可连接广播ADV_NONCONN_IND。不可连接广播的事件更短事后也不会有监听扫描请求的接收窗口整体更省。可连接广播ADV_IND因为有接收窗口单事件电流会高一些所以只在需要连接时再开。广播数据长度不用刻意拉到最大够用就行。BLE广播载荷最多31字节做beacon用不到那么多能短就短。发射功率也一样很多室内场景-4dBm到0dBm就够用没必要上4dBm。发射功率提高一档发射电流明显上升而通讯距离并不会因此变远很多。4. 连接参数才是隐藏大户连接间隔、从机延迟、超时时间的配合连接建立之后广播一般会停掉功耗由连接参数决定。这里三个参数必须一起看少一个都可能踩坑。4.1 三个参数和一条必须记住的公式连接间隔Connection Interval主机每次尝试与从机通信的间隔BLE规范允许7.5ms到4s。从机在每个连接事件锚点要醒来片刻。从机延迟Slave Latency从机允许跳过最多N个连接事件范围0到499。跳过的越多从机可以睡得越久。超时时间Supervision Timeout如果超过这个时间双方没有成功通信连接会被认为断开范围100ms到32s。这三个参数有一条硬性公式必须满足supervisionTimeout (1 slaveLatency) × connInterval × 2如果不满足从机会认为链路超时直接断开连接。很多人在SDK里改了连接间隔却忘了改超时时间结果设备老是莫名其妙掉线就是这个原因。4.2 slave latency带来的功耗改善和时延代价很多人只调连接间隔不调slave latency这是最常见的浪费。连接间隔30ms、slave latency0时从机每30ms要醒一次。哪怕没有业务数据也要收一个空包并回一个空包。按每次空事件10μC算平均电流就是10μC / 30ms ≈ 333μA一年2918mAh普通纽扣电池根本扛不住。如果把slave latency调上去平均电流会明显下降slave latency有效事件周期空事件平均电流一年耗电030ms333μA2918mAh4150ms66.7μA584mAh9300ms33.3μA292mAh491500ms6.7μA59mAh注意这个表只算了射频事件本身没有算协议栈醒来跑代码的功耗实际只会更高。slave latency带来的代价是数据延迟。如果设备想上报数据它最快也要等到下一个没有被跳过的连接事件才能发。slave latency9、连接间隔30ms最坏情况下要等300msslave latency49要等1.5s。对温度这类慢变量没问题对门锁告警这类实时性强的业务就不合适。更好的做法是平时保持高latency检测到告警事件时立刻发起连接参数更新请求把latency降下来告警发完再恢复。4.3 参数协商不是从机说了算BLE参数协商不是从机单方面说了算。从机可以发Connection Parameter Update Request但主机有最终决定权。手机系统一般会检查参数是否合理slave latency设得太大、timeout不符合公式都会被拒绝最后连接还是按默认参数跑。所以产品侧一定要有“Fallback参数”。当连接参数更新请求被拒绝后软件要能重新读取实际参数确认当前latency是多少而不是假设主机一定接受。5. 一套能撑一年的配置示例温湿度传感器从参数到续航账回到开头的问题到底广播间隔、连接参数配多大电池能撑一年下面给一个典型例子的完整账单。5.1 一个温湿度传感器的完整配置和账单假设产品是这样的BLE模块TX功率0dBm峰值发射电流8mA深度睡眠电流2μA。常态每2s发一个可连接广播单事件按12μC估包含监听窗口。配网/OTA广播间隔100ms可连接最长持续30s。连接时连接间隔30msslave latency9supervision timeout2000ms只在配网或OTA时建立连接每次保持5s。账单如下广播12μC / 2s 6μA一年6μA × 8760h 52.6mAh。睡眠2μA × 8760h 17.5mAh。连接按每天连一次、每次5s、每300ms一个事件、每个事件10μC算一天16个事件约160μC一年折算不到0.02mAh基本可以忽略。蓝牙部分总功耗约70mAh再加20%的电源转换和电池自放电损耗约84mAh。CR2032可用容量按180mAh算余量超过一倍撑一年很轻松。如果广播间隔降到1s蓝牙部分就变成约10517.5122.5mAh加上损耗约147mAh也还能撑一年但余量明显少了。配置组合可以这样写场景广播间隔可连接连接间隔slave latencytimeout备注配网/OTA100ms是30ms01000ms大流量传输正常运行2s是30ms92000ms无连接时按广播功耗走告警模式根据产品决定是30ms496000ms牺牲实时性换续航5.2 常连接设备又该怎么配如果你做的是24小时保持连接的设备比如防丢器、穿戴设备、无线键盘连接参数就是续航的主要变量。从第4节的表可以看出slave latency49、连接间隔30ms时射频部分平均电流6.7μA加上睡眠2μA约8.7μA一年约76mAhCR2032可行。但如果实时性要求高、slave latency只能设到9那一年约292mAhCR2032就不够了得换CR2477或AA电池。所以“连接参数配多大电池能撑一年”没有固定答案本质是在时延、功耗、电池体积三者之间做权衡。先把业务允许的最大上报延迟写清楚再去设定slave latency就不会走到一半才发现参数不合理。6. 实测电流账光算不算数怎么把平均电流抓出来所有计算都是估算真正拍板前必须实测。我自己的习惯是先用公式粗算确定方案再进行24小时电流积分验证。6.1 低成本的电流波形抓法没有昂贵的功耗分析仪也能测。在电源和模块之间串一个10Ω采样电阻用示波器测采样电阻两端的电压波形电流就等于电压除以10Ω。BLE广播事件会有几个毫秒的脉冲从波形上能清楚看到峰值电流和持续时间。如果示波器存储深度不够可以把单次广播周期抓下来再放大看细节。业务周期如果是15分钟至少要测够15分钟才能得到平均电流。有条件的话直接上带电流分析功能的仪器比如Nordic Power Profiler Kit、Joulescope或者其他功耗分析仪。这类工具会给出平均电流、电荷量和电流波形比手动算省力得多。6.2 测量前一定要避开的干扰项测量时最容易被带偏的几个点开发板不要直接拿来测。板上的调试器、指示灯、USB转串口芯片都可能吃几毫安测出来不是模块的真实功耗。万用表普通电流档适合测稳定电流不适合抓BLE这类脉冲电流测出来的平均值会严重偏小。如果模块供电经过了LDO要把LDO的静态电流也算进去。有些低压差LDO静态电流就有十几μA已经占了CR2032预算的一半。用真电池测时电池电压会慢慢下降导致不同时间点电流不一致。用电池模拟器或稳压源供电测试结果更稳定。7. 实际项目里踩过的坑几个让续航对不上账的细节最后说几个我自己踩过、也帮别人排查过很多次的坑。这些坑在原理图阶段看不见但一测功耗就全都暴露。7.1 I2C上拉电阻、LED和Flash写入I2C上拉电阻漏电是最隐蔽的一个。传感器板上如果有I2C上拉电阻比如10kΩ接到3V一条线就是3V/10kΩ0.3mA两条线就是0.6mA。这个值比整个BLE模块平均电流高出一两个数量级一年下来就是好几Ah的耗电。睡眠时一定要用GPIO断开传感器供电或者有单独的电源开关让传感器回路完全断电。调试LED也一样。一颗LED串1kΩ电阻在3V下约2mA哪怕只在每次广播时闪10ms2s广播周期平均下来也有10μA一年多87.6mAh足以让一年方案变半年。还有一个问题是Flash写入。BLE广播瞬间电流大电池电压会跌落0.2V到0.3V。如果这时候正在写Flash很可能导致复位或写入脏数据。我一般会在电池端放一个100μF到220μF的电容并且把Flash写入放到发射完成后的睡眠前避开电流尖峰。7.2 被手机拒绝的连接参数与低温衰减连接参数被拒的情况非常常见。你配了slave latency49、timeout6000ms看起来符合公式但手机系统有自己的一套参数协商策略最后可能仍然用默认的30ms、latency0运行。所以做完参数更新后一定要读回实际连接参数确认不能只看SDK里配置成什么样。低温对纽扣电池的影响也要考虑。CR2032在0℃时脉冲能力下降明显实测续航可能只有常温的60%到70%。如果产品要在户外冬天用预算至少留30%余量或者直接换CR2477、锂亚电池。这些坑我自己基本都踩过。印象最深的是一个I2C上拉电阻算出来一年该有两年余量实际板子放了两天就没电折腾一圈才发现是传感器板自带上拉模块睡眠时整个传感器回路还在一点一点漏。所以蓝牙模块功耗优化的核心不是把某一项参数调得特别狠而是把每一条电流通路都抓到明面上。做好预算、配好广播间隔和连接参数再用仪器实测验证一年续航才是真的可预期。