3.19 haas506 2.0开发教程-example - 低功耗模式 (2.2版本接口有更新)

最新案例教程点击下方链接跳转,CSDN已停止更新

点击跳转HaaS506官方最新案例







案例说明

  • 本案例用于说明关机,休眠,连接阿里云的状态下进入低功耗的方法。并测试三种不同状态下的功耗大小。
  • 进入低功耗模式需要断开所有的外设设备,板载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
        }
    
    
测试结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值