haas506 2.0开发教程-example - 低功耗模式
最新案例教程点击下方链接跳转,CSDN已停止更新
点
击
跳
转
案例说明
- 本案例用于说明关机,休眠,连接阿里云的状态下进入低功耗的方法。并测试三种不同状态下的功耗大小。
- 进入低功耗模式需要断开所有的外设设备,板载LED,连接的网络平台等,只保留CPU运行。
- 测试统一使用3.7v电压供电。
1 . 关机测试
- 使用RTC闹钟与关机指令制作一个定时关机、重启的案例,测量关机时的电流大小。
- 代码正常运行时电流20mA左右。
main.py
from driver import RTC
import utime as time
import system
#串口实例化
rtc = RTC()
rtc.open()
rtc.setTime(2022, 6, 8, 15, 34, 1) #设置rtc时间
time.sleep_ms(200)
print(rtc.getTime()) #获取rtc时间
rtc.setAlarm(2022, 6, 8, 15, 35,1) #设置rtc闹钟时间,1分钟后自动开机重启
time.sleep(5)
system.poweroff() #关机
#程序关机55秒后会自动重启开机
board.json
{
"name": "haas506",
"version": "2.0.2",
"io": {
},
"debugLevel": "ERROR",
"repl":"enable",
"replPort":0
}
测试结果
- 关机状态下主板平均电流228.8937uA
2 . 休眠测试
- 休眠模式下功耗会降低,串口功能无法正常使用。
- 除此之外进入低功耗还需要主动关闭外部电压、关闭板载LED、开启飞行模式等操作。
- 代码正常运行时电流20mA左右。
main.py
import system
from modem import net
from driver import GPIO
print("start lowpower test")
#实例化外部电压
gpio_test=GPIO()
gpio_test.open("gpio_3v3")
if __name__ == '__main__':
#关闭板载LED
gpio2=GPIO()
gpio2.open('led2')
gpio2.write(0)
#开启飞行模式
ret = net.setModem(1)
print("get modem :",ret)
#关闭外部电压
gpio_test.write(0)
#进入休眠模式
system.lightsleep()
board.json
{
"version": "1.0.0",
"io": {
"led2": {
"type": "GPIO",
"port": 1,
"dir": "output",
"pull": "pullup"
},
"gpio_3v3": {
"type": "GPIO",
"port": 46,
"dir": "output",
"pull": "pullup"
}
},
"debugLevel": "ERROR",
"repl":"enable",
"replPort":0
}
测试结果
3 . 连接阿里云测试
- 连接阿里云平台后功耗比较大,达到100mA左右。在进入低功耗时需要关闭阿里云功能。
- 除此之外还需要主动关闭外部电压、关闭板载LED、开启飞行模式等操作。
main.py
# coding=utf-8
from modem import net
import utime as time
import aliyun
from driver import GPIO
import system
if __name__ == '__main__':
aliyun.connect() #连接阿里云
#关闭led
gpio2=GPIO()
gpio2.open('led2')
gpio2.write(0)
#vcc初始化
vcc = GPIO()
vcc.open('vcc')
system.lightsleep() #进入休眠
aliyun.ali_end() # 关闭阿里云
#设置飞行模式
ret = net.setModem(1)
print("get modem :",ret,'---')
time.sleep(4)
vcc.write(0) #关闭外部电源
aliyun.py
# coding=utf-8
import network
import ujson
import utime as time
import modem
from aliyunIoT import Device
import kv
#更改产品信息
###############################
productKey = "your productKey "
productSecret = "your productSecret "
###############################
global deviceName,g_connect_status,device_dyn_resigter_succed,netw
g_connect_status = False
netw = None
device = None
deviceSecret = None
device_dyn_resigter_succed = False
#初始化物联网平台Device类,获取device实例
device = Device()
#当iot设备连接到物联网平台的时候触发'connect' 事件
connect_state = False
def on_connect(data):
global connect_state,data_handle
global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgrade
print('***** connect lp succeed****')
connect_state = True
data_handle = {}
data_handle['device_handle'] = device.getDeviceHandle()
#当iot云端下发属性设置时,触发'props'事件
def on_props(request):
print('clound req data is {}'.format(request))
# # # #获取消息中的params数据
params=request['params']
# #去除字符串的'',得到字典数据
params=eval(params)
#当连接断开时,触发'disconnect'事件
def on_disconnect(arg):
print('linkkit is disconnected')
#当iot云端调用设备service时,触发'service'事件
def on_service(id,request):
print('clound req id is {} , req is {}'.format(id,request))
#当设备跟iot平台通信过程中遇到错误时,触发'error'事件
def on_error(err):
print('err msg is {} '.format(err))
#网络连接的回调函数
def on_4g_cb(args):
global g_connect_status
pdp = args[0]
netwk_sta = args[1]
if netwk_sta == 1:
g_connect_status = True
else:
g_connect_status = False
#网络连接
def connect_network():
global netw,on_4g_cb,g_connect_status
#NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.
netw = network.NetWorkClient()
g_register_network = False
if netw._stagecode is not None and netw._stagecode == 3 and netw._subcode == 1:
g_register_network = True
else:
g_register_network = False
if g_register_network:
#注册网络连接的回调函数on(self,id,func); 1代表连接,func 回调函数 ;return 0 成功
netw.on(1,on_4g_cb)
netw.connect(None)
else:
print('网络注册失败')
while True:
if g_connect_status:
print('网络连接成功')
break
time.sleep_ms(20)
#动态注册回调函数
def on_dynreg_cb(data):
global deviceSecret,device_dyn_resigter_succed
deviceSecret = data
device_dyn_resigter_succed = True
# 连接物联网平台
def dyn_register_device(productKey,productSecret,deviceName):
global on_dynreg_cb,device,deviceSecret,device_dyn_resigter_succed
key = '_amp_customer_devicesecret'
deviceSecretdict = kv.get(key)
print("deviceSecretdict:",deviceSecretdict)
if isinstance(deviceSecretdict,str):
deviceSecret = deviceSecretdict
if deviceSecretdict is None or deviceSecret is None:
key_info = {
'productKey': productKey ,
'productSecret': productSecret ,
'deviceName': deviceName
}
# 动态注册一个设备,获取设备的deviceSecret
#下面的if防止多次注册,当前若是注册过一次了,重启设备再次注册就会卡住,
if not device_dyn_resigter_succed:
device.register(key_info,on_dynreg_cb)
def connect():
global deviceName,g_connect_status,device_dyn_resigter_succed,connect_state,data_handle,deviceName,deviceName,deviceSecret
deviceName = None
# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
# 连接网络
connect_network()
if deviceName is not None and len(deviceName) > 0 :
#动态注册一个设备
dyn_register_device(productKey,productSecret,deviceName)
else:
print("获取设备IMEI失败,无法进行动态注册")
while deviceSecret is None:
time.sleep_ms(50)
print('动态注册成功:' + deviceSecret)
key_info = {
'region' : 'cn-shanghai' ,
'productKey': productKey ,
'deviceName': deviceName ,
'deviceSecret': deviceSecret ,
'keepaliveSec': 60,
}
#打印设备信息
print(key_info)
# device.ON_CONNECT 是事件,on_connect是事件处理函数/回调函数
device.on(device.ON_CONNECT,on_connect)
device.on(device.ON_DISCONNECT,on_disconnect)
device.on(device.ON_PROPS,on_props)
device.on(device.ON_SERVICE,on_service)
device.on(device.ON_ERROR,on_error)
device.connect(key_info)
while not connect_state:
time.sleep_ms(20)
def up_data(d):
d_str = ujson.dumps(d)
data={
'params':d_str
}
device.postProps(data)
def ali_end():
ret = device.end()
if ret == 0:
print('aliyunIoT end succeed')
else:
print('aliyunIoT end failed')
board.json
{
"version": "2.0.0",
"io": {
"led2": {
"type": "GPIO",
"port": 1,
"dir": "output",
"pull": "pullup"
},
"vcc": {
"type": "GPIO",
"port": 46,
"dir": "output",
"pull": "pullup"
}
},
"debugLevel": "ERROR",
"repl": "enable",
"replPort": 0
}