低功耗实践指南

供电始终是开发者绕不过去的关键环节。本文给开发者讲述一下如何实现低功耗长续航。

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

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

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

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、定位等功能,经过合理的优化,极小的空间+电池,实现了长续航,赢得了众多开发者一致赞誉,也受到了消费者的一致好评。

  • 发表于 2018-09-09 11:53
  • 阅读 ( 4335 )
  • 分类:默认分类

1 条评论

请先 登录 后评论
不写代码的码农
技术销售Delectate

43 篇文章

作家榜 »

  1. 技术销售Delectate 43 文章
  2. 陈夏 26 文章
  3. 国梁 24 文章
  4. miuser 21 文章
  5. 晨旭 20 文章
  6. 朱天华 19 文章
  7. 金艺 19 文章
  8. 杨奉武 18 文章