低功耗实践指南

物联网模块以优异的性能、低廉的价格、超强定制性,经常被应用到各种场景中。但是,一旦没有电,巧妇难为无米之炊,模块立地变砖。所以,供电始终是开发者绕不过去的关键环节。

如果是按摩椅、擦鞋机等这类有常电的场景,开发者几乎不用考虑功耗问题,随便用;如果是共享单车、太阳能路灯这类有太阳能板充电的场景,开发者需要找到功耗和性能的平衡点;如果是定位手表、无线报警器这类完全靠电池供电的场景,开发者则应尽量降低功耗,以延长续航时间。

实现低功耗,有点像内外兼修,单纯的优化软件,或者修改硬件,都不能完成目标。只有软件和硬件互相配合,标本兼治,才能达到理想效果。

Air202模块为例,软件上要执行相应代码,进入飞行模式、并主动休眠,硬件上也要关闭输出(如LEDLCD),最终才可做到《硬件设计手册》标称<1ma的电流:

attachments-2018-09-vyKWslPS5b9498339e2ab.png

那么,降低功耗都有哪些方法呢?


常用措施

自动休眠  在“闲时”会自动休眠,即自动降频。当发生数据传输,或产生GPIO中断等时,模块会自动唤醒。这个机制是底层自动处理的,开发者无需特殊设置。它近似于CPU的自动降频、睿频;

休眠功能  即强制降频。开发者可以通过代码设置模块使之处于休眠/唤醒状态。示例代码:

pm.sleep("A") --执行本句后,标记为A的事件 休眠了模块

pm.wake("A") --执行本句后,标记为A的事件 唤醒了模块

--值得注意的是,如果需要全功能,必须执行pm.wake(),否则可能导致串口接收出错、LCD刷新失败等问题;每个“事件”一一对应,“A”唤醒模块,也必须是“A”才能休眠模块;如果“A”唤醒模块,“B”休眠模块,则因为“A”的存在,“B”无法休眠模块。

--更多用法,请参考pm demo

关闭GPIO输出  顾名思义,虽然GPIO输出的电流不大,但是聚沙成塔,也是不容小觑的(请参考 gpio demo)。一些靠GPIO驱动的LED也应关闭,譬如Air800 M4等开发板的一些LED

关闭UART12  降低主频后,UART12的接收功能实际上已经受限,建议关闭(请参考 uart demo);

关闭GPS  关闭GPS芯片供电,同时关闭有源GPS天线供电,可以进一步降低功耗(请参考gps demo);

进入飞行模式  彻底禁止射频,可以有效降低通信模块的功耗,最低可以低至1ma(请参考socket/shortConnectionFlymode demo;

关闭音频输出  譬如喇叭等的输出,将产生额外的消耗(请参考audio demo);

优化代码逻辑  尽量减少大量运算(如GPS 坐标纠偏算法,应放到服务端,而非模块处理),避免死循环、频繁io操作、频繁检查OTA、同步NTP。尽量提高代码鲁棒性,减少因错重启的概率;

优化通信逻辑  根据网络情况自动控制心跳包发送间隔,取得可用性和省电之间的平衡点;

改善天线  改善GPSGSM提高信号等级。更好的信号,有助于降低通信时的功耗,对于GPS也能更快搜星,追踪时耗电量也更少;

关闭LCD屏幕  采用关闭LCD背光、局部刷新等方式,可以有效减少LCD产生的消耗;

其他措施  还有一些其他的节能方式,譬如彻底关机(底电流200ua),由外部单片机开机,或者闹钟开机(请参考 《Air2xx/Air8xx 系列模块的开机、关机和重启》http://oldask.openluat.com/article/51)。

有的开发者可能会问,禁止HOST_UART输出的Trace,会不会也降低能耗呢?在这里,可以负责任的告诉大家,不会。是否输出Trace,都一样的,所以不必纠结了。

说了这么多延长续航,降低功耗低手段,具体怎么应用呢?接下来,咱们就根据不同的应用场景(常电/太阳能板/电池供电)讲讲分别怎么用。

常电

既然有常电?还降低毛功耗?略过,就是这么霸气~

太阳能板

以共享单车为例,他们通常采用的是车篮式太阳能板,输出电压位5V,功率为5W(即正午太阳直射时电流才可达到1A)。

但是,共享单车的应用场景极为复杂,单车可能停放在楼宇间、树荫下等阳光较弱的地方,或者存在倒斜、连续阴雨天的情况,太阳能板不能全功率工作,对电池的充电效果有限。所以如何根据电池剩余电量进行功率控制就成了关键。

Air800模块为例,2400mah的电池,GPS+MQTT+TTS可以续航约40+小时。那么7200mah的电池,合理优化的情况下,续航3~4周。如果搭载太阳能板,可以做到无人干预下的可靠运行。那么,如何做到“自给自足”呢?

首先,应该尽量扩大电池容量,使用性能更好的太阳能板。膜拜单车电池容量约为5400mah,哈罗单车约为7200mahofo小黄车电池时不可充电的,忽略不计。所以,更大容量的电池,意味着更强劲、更持久的续航能力。契合“深挖洞广积粮”、“深淘滩低作堰”的思想。

同时,开发者应该考虑到冬季日照减少无法充电,雨雪天低温导致电池容量骤减等因素。

其次,应该合理安排代码逻辑和充放电管理,使电池效能最大化。譬如:

    电池剩余7成电量时,可以适当缩短GPS定位间隔和数据上报周期,检查是否有升级包等骚操作;

    电池剩余5成电量时,应适当增加GPS定位间隔,延长数据上报周期,禁止检查是否升级包,禁止同步NTP,喇叭降低音量,LED停止闪烁等;

    电池剩余3成电量时,禁止使用GPS定位,改用基站定位,最大限度延长数据上报周期,停止使用喇叭,改用蜂鸣器。必要时需要进入飞行模式,;

    电池剩余1成电量时,彻底禁止所有耗电应用,把当前状态(电量、最后一次GPS定位坐标等)间歇性上报服务器(如每30分钟上报一次,期间进入飞行模式),等待运维人员前来“解救”。

最后,应有后备措施(如运维人员现场处理),处理异常和突发状况。譬如用户端APP和车锁,均可自动上报故障。 如低电情况下,车锁自动上报,运维人员前去充电。

PS:膜拜单车有两个版本,豪华版(即无链条)是轮毂发电的,没有人骑车,电池的电就会耗光,所以经常出现低电情况;而普通版(即有链条)是太阳能板发电,只要有日照就可以给电池充电,所以几乎很少出现低电的情况了。

电池供电

由于某些特殊场景,只能使用电池供电。此种情况下,似乎飞行模式是长续航最佳的选择。

模块应该有被唤醒的机制(内部计时器,或者外部中断),唤醒后退出飞行模式,进行相应的数据处理;处理完成后立即进入飞行模式,节省电能。

而无法进入飞行模式的情况下,也应该按照上文所述,关闭所有不必要的耗电应用,同时主动休眠模块,使之进一步减少耗电量。譬如我司出品的小蛮儿童定位手表(http://www.openluat.com/Product/solution/Watch.html),就是使用了Air202同款的通信芯片,同时具有LED手电、触摸屏、LCD、定位等功能,经过合理的优化,极小的空间+电池,实现了长续航,赢得了众多开发者一致赞誉,也受到了消费者的一致好评。

上次更新 2021-01-28