|
本帖最后由 Ameba_Arduino 于 2016-5-11 11:02 编辑
转载声明:原文链接 http://makerpro.cc/2016/03/ameba-series-1-1-power-saving-mode/
作者:柯大
为了创造更省电的物联网设备,瑞昱阿米巴(Ameba)开发板加入了省电模式,并提供Arduino开发环境不同的省电API,让设备可以轻易的以电池或太阳能电板维持很长时间的正常运作,以下来介绍实作方式。
6种省电API
Realtek在2016/02/19发布的Ameba IoT/Arduino Solution Version 1.0.5版本中,新增了对Ameba开发板的省电API,共6组API:
要使用Ameba的省电功能,需要在程序中添加一下头文件:
#include <PowerManagement.h>
API 功能说明:
1. void sleep():
呼叫这个API之后,就允许系统在闲暇的时候进入sleep(但不一定会马上进入sleep),如果Ameba开着WiFi,依照802.11的省电模式定时wake up来听AP发出来的beacon,收完之后如果没事就会继续进入sleep。
如果WiFi资料量比较大的时候,WiFi会离开802.11的省电模式,此时系统也不会进入sleep,所以开着WiFi的耗电量会因为资料量与WiFi环境的干净程度有关。
2. void active():
呼叫这个API等于是关掉sleep功能,闲暇时间也不允许Ameba sleep。
3. void deepsleep(uint_32_t duration_ms):
这是最省电的模式,几乎将Aemba所有岛区(岛区概念请见【Ameba Arduino】省电模式前编--认识基础概念)都关闭,经过duration_ms之后会从头开始执行,像是经过reset一样,呼叫这个API之后会马上进入deepsleep。
4. void setPllReserved(bool reserves):
当Ameba进入sleep,如果PLL clock关掉,会让一些周边设备(ex. UART, I2C, SPI…)无法接收资料,目前预算是保留PLL不关掉,适合关掉的情况:(1)没有用到这些周边设备,(2)用到这些周边设但不需要在Ameba进入sleep之后还接收资料。关掉省电约5.5mA,算是自己需要取舍的电量。
5. void softReset():
呼叫之后会马上重新开机,这是软件行为,电路上并没有重新上电。
6. void safeLock():
当Ameba进入deepsleep,会无法烧录程序,为了避免使用者写出的程序开机Ameba即计入deepsleep,所以使用D18这个PIN当做保护,当D18这根PIN被接到GND,就会防止Ameba进入deepsleep或者sleep。
回传值:
True:D18 is connected to GND
False: D18 is not connected to GND
注:因为Ameba进入deepsleep之后就无法烧录程序,在deepsleep的API里面我们将D18这个PIN当做避免Ameba进入deepsleep的PIN脚,只要将D18接GND,并且从开机即可重新烧录程序。
Ameba常用的省电模式
Ameba提供许多省电模式,最常用的是deepsleep与sleep。
1. deepsleep mode
当Ameba进入deepsleep mode,会让Ameba出于最省电的模式,他的耗电会小于20uA, 此时大部分元件都关掉了,但低解析度的timer仍然运作并且用来唤醒Ameba。这种模式适合定时运作的情况,像是每个小时起来测量一次温湿度,送出资料,再回到deepsleep。
2. sleep mode
这个模式是Ameba可以维持WiFi连线的省电模式,它的耗电会因为WiFi资料量有无以及WiFi环境的干净程度有所不同,但是瞬间最低电流会在2.5mA, 任然是相当省电的模式。这种应用适合要远端操控Ameba的情况,像是用手机通过网络通知Ameba马上测量一次温湿度,再回传结果。
省电模式例程
范例一:让Ameba出于WiFi连接的省电模式
Ameba的deepsleep无法让WiFi保持连线状态,如果想让Ameba省电,并且保持WiFi连线,可以使用sleep API。
打开范例“File” -> “Examples” -> “AmebaPowerSave” -> “SleepWithDHTUdpServ”
范例里一样需要设定连线AP的SSID和password。
这个范例里,Ameba会先建立WiFi连线,进入sleep省电模式,Ameba会当做UDP server,每当收到UDP封包内容为’H’,就回传湿度,接收到UDP封包为’T’就回传温度。
与deepsleep不同的地方是,当Ameba开启sleep模式,会自己寻找可以睡眠的时间,所以整个睡眠与醒来的动作都是自动的,无需使用者干预。
当Ameba连线之后,我们参考之前测试TCP/UDP的工具Sokit设定Ameba的ip&port。我们没分钟轮流获取一次温湿度,可以看到Ameba的反应。
这个范例会侦测D18这个防止进入睡眠的pin脚,如果D18被GND,就不会让Ameba进入sleep模式,于是我们可以测量两种耗电:
注:实际情况里,不会用到那么多,它会因为升压转换造成能力损失,也会因为电池电压随时间而降低造成无法使用到全部的容量。
这里的数据会因为网路状况而不同,让Ameba保持连线的情况下回避让Ameba进入deepsleep要耗电;但让Ameba保持连线来提供使用者做远程操控,这是deepsleep无法做到的,这需要视使用者的应用而定。
范例二:将DHT资料上传到LASS之后进入睡眠
使用Ameba通常都会使用到它的WiFi功能,实际的省电使用情况也会因为如何使用WiFi功能二有所不同。这个范例会先测量DHT的温湿度数据,打开WiFi并连上AP,取得NTP时间,连上LASS的MQTT server,将测量的温湿度数据上传,再进入deepsleep,每10分钟重复这样的动作。
打开范例“File” -> “Examples” -> “AmebaPowerSave” -> “DeepSleepWithDHTLass”修改程序相关设定:
– DHT的型號:DHT11/DHT22/DHT21
– 連上AP的方式:ssid, password
– 目前的GPS位置:latitude & longitude
编译上传之后,测量到的耗电会因为许多因素影响,包括WiFi环境的干净与否,连线是否顺畅,server是否马上回应。但一般应该会在10多秒内完成。
范例测试的结果里,我上传所花的时间是13s,量得的Ameba module耗电平均为1.3mA。这个数据比范例“DeepSleepWithDHT”要大上许多,因为Ameba在工作模式下的耗电通常大于29mA,甚至在WiFi连线时68mA左右,与deepsleep的0.018mA相比,我们要让Ameba尽量维持在deepsleep才会取得最大的省电效益。
为了比较未省电的情况,我们将程序修改如下,让它平常保持WiFi连线,每10分钟测量一次,然后上传至LASS的MQTT server:
void setup()
{
dht.begin();
initializeWiFi();
initializeMQTT();
}
void loop()
{
if (gatherHumidityAndTemperature() == DATA_CNT_FOR_UPLOAD) {
retrieveNtpTime();
if (!client.connected()) {
reconnectMQTT();
}
publishResults();
pDhtData->dataCount = 0;
}
// store data back to flash memory
FlashMemory.update();
delay(measureInterval * 1000);
}
这中方式测量到的平均耗电为67mA,和我们用2颗AA电池比较耗电
可以看到沒省電的情況下只能用一天,但經過省電並且單獨供電給Ameba module可以使用2.8個月。
关于更多介绍请访问官方主页:http://ameba.realsil.com.cn/
QQ交流群:Ameba Arduino 技术交流群(184666894)
其他省电相关:
【Ameba Arduino】省电模式前编--认识基础概念
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|