• 3.17 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
            }
        
        
    
    测试结果
  • 相关阅读:
    Redis Stack功能介绍及redis-om-dotnet使用示例
    conda虚拟环境总结与解读
    超实用的图片压缩大小教程,手把手教会你
    上周热点回顾(6.10-6.16)
    el-table 三角形提示
    LeetCode 146. LRU 缓存
    【大数据折腾不息系列】(三) MySQL安装
    43、Flink 的 Window Join 详解
    URLConnection程序报java.net.ConnectException: Connection refused: connect
    IDEA调试总结
  • 原文地址:https://blog.csdn.net/w_hizyf_m/article/details/126645822