5.16 综合案例2.0-久坐提醒系统(2.2版本接口有更新)

5.16 综合案例2.0-久坐提醒系统(2.2版本接口有更新)综合案例2.0-久坐提醒系统简介准备硬件连接图代码流程功能实现1、物联网平台开发2、设备端开发3、调试调试结果4、钉钉消息提醒4.1添加钉钉机器人4.2、IoTStudio设置简介长期久坐会损害身体健康,本案例就是为了提醒人们不要坐太久而设计的一个提醒系统。当你长时间在工位上坐着,他会通过顶顶提醒你,让你每隔一段时间活动一下筋骨。久坐提醒设备是通过人体红外检测周围区域是否有人移动,当累计检测时长超过设定值,将会在钉钉群发来提醒,每次回到座位会重新开始计时。并且提醒时间可以自行调节,默认30分钟。准备

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

简介

长期久坐会损害身体健康,本案例就是为了提醒人们不要坐太久而设计的一个提醒系统。当你长时间在工位上坐着,他会通过顶顶提醒你,让你每隔一段时间活动一下筋骨。久坐提醒设备是通过人体红外检测周围区域是否有人移动,当累计检测时长超过设定值,将会在钉钉群发来提醒,每次回到座位会重新开始计时。并且提醒时间可以自行调节,默认30分钟。

人体红外传感器

  • 人体红外传感器是以探测人体辐射为目标的。所以热释电元件对波长为10UM左右的红外辐射必须非常敏感。

  • 为了仅仅对人体的红外辐射敏感,在它的辐射照面通常覆盖有特殊的菲泥尔滤光片,使环境的干扰受到明显的控制作用。

  • 传感器上有两个调节旋钮

     1、调节距离电位器顺时针旋转,感应距离增大(约 7 米),反之,感应距离减小(约 3 米)。
     2、调节延时电位器顺时针旋转,感应延时加长(约300S),反之,感应延时减短(约 0.5S)。
    

    在这里插入图片描述

准备

本案例需要的硬件

器材 数量
HaaS506开发板 1
人体红外传感器 1
SIM卡 1
杜邦线 若干

硬件连接图

在这里插入图片描述

代码流程

1、连接阿里云平台。
2、传感器检测人体活动,计算人体久坐时间,当时间超过设定值,将信号上传阿里云平台。
3、设置云端与钉钉机器人,当满足条件时发出提醒。

功能实现

1、物联网平台开发

第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。

1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT
2、创建产品属性(添加物模型)
选择产品功能定义–编辑草稿
在这里插入图片描述

  • 添加自定义功能
  • 设置标识符、数据类型、读写类型参数,标识符(light)要与代码保持一致。点击确定。
  • 发布上线,点击确定。
    在这里插入图片描述

2、设备端开发

  • 第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。
  • 搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。
    在这里插入图片描述
  • 2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找modem)
# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...

main.py(改149、150行产品信息)

# coding=utf-8
from driver import GPIO
from driver import PWM
from driver import TIMER
import network
import ujson
import utime as time
import modem
from  aliyunIoT import Device
import kv
import sntp
import net



#当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):
    global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgrade
    print('***** connect lp succeed****')
    data_handle = { 
   }
    data_handle['device_handle'] = device.getDeviceHandle()


#当连接断开时,触发'disconnect'事件
def on_disconnect():
    print('linkkit is disconnected')


#当iot云端下发属性设置时,触发'props'事件
def on_props(request):
    global warns
    params=request['params']
    params=eval(params)
    if 'warning' in params:
        warns=params['warning']
        upload_interval()


#当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 net,on_4g_cb,g_connect_status
     #NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.
     net = network.NetWorkClient()
     g_register_network = False
     if net._stagecode is not None and net._stagecode == 3 and net._subcode == 1:
         g_register_network = True
     else:
         g_register_network = False
     if g_register_network:
    #注册网络连接的回调函数on(self,id,func); 1代表连接,func 回调函数 ;return 0 成功
         net.on(1,on_4g_cb)    
         net.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)   


interval_data = { 
   }
def upload_interval():
    global interval_data,warns
    interval_data["warning"]= warns
    interval_data_str=ujson.dumps(interval_data)
    data1={ 
   
        'params':interval_data_str
        }      
    device.postProps(data1)


turn = 0
def every_second():
    global duration_time,begin_time,interval_time,turn,warns
    if hc.read()==1:
        if turn == 0:
            now_time=time.time()          #获取当前时间
            duration_time = (now_time - begin_time )/60
            print(round(duration_time,2))
            if int(duration_time) >= interval_time:
                warns= 1
                upload_interval()
                time.sleep_ms(500)
                begin_time = time.time()      #获取当前时间
        else:
            begin_time = time.time()      #获取当前时间
            turn = 0
            warns = 0
    else:
        turn +=1
        warns = 0
        print('leave the seat')


if __name__ == '__main__':
    ICCID=None
    g_connect_status = False
    net = None
    device = None
    deviceSecret = None
    deviceName = None
    #替换下列产品信息
    ###################################
    productKey = "a1A9j0EmrQr"
    productSecret = "21ATZN5PR2iuv08w"
    ###################################
    device_dyn_resigter_succed = False

    # 连接网络
    connect_network()
     # 获取设备的IMEI 作为deviceName 进行动态注册
    #2.2版本改为
    #deviceName = modem.info.getDevImei()
    deviceName = modem.getDevImei()
    #获取设备的ICCID
    ICCID=modem.sim.getIccid()
    #初始化物联网平台Device类,获取device实例
    device = Device()
    if deviceName is not None and len(deviceName) > 0 :
     #动态注册一个设备
        dyn_register_device(productKey,productSecret,deviceName)
    else:
        print("获取设备IMEI失败,无法进行动态注册")
    while deviceSecret is None:
        time.sleep(0.2)
    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)

    #
    interval = 0   #初始化提醒bool
    interval_time = 30 #初始化提示时长
    time.sleep(2)
    # 上传提醒
    warns = 0
    upload_interval()
    #传感器使能
    hc=GPIO()
    hc.open('hc')
    sntp.settime()         #sntp 校时
    begin_time=time.time()          #获取当前时间

    while True:	
        every_second()
        time.sleep_ms(500)
  



board.json

{ 
   
  "name": "haas506",
  "version": "2.0.0",
  "io": { 
   
    "ADC0": { 
   
      "type": "ADC",
      "port": 0,
      "sampling": 12000000
    },
    "ADC1": { 
   
      "type": "ADC",
      "port": 1,
      "sampling": 12000000
    },
    "ADC2": { 
   
      "type": "ADC",
      "port": 2,
      "sampling": 12000000
    },
    "qma8981": { 
   
      "type": "I2C",
      "port": 1,
      "addrWidth": 7,
      "freq": 400000,
      "mode": "master",
      "devAddr": 18
    },
    "KEY1": { 
   
      "type": "GPIO",
      "port": 44,
      "dir": "irq",
      "pull": "pullup",
      "intMode": "rising"
    },      
    "led1": { 
   
      "type": "GPIO",
      "port": 7,
      "dir": "output",
      "pull": "pulldown"
    },
    "led_g": { 
   
      "type": "GPIO",
      "port": 32,
      "dir": "output",
      "pull": "pulldown"
    },
    "cs": { 
   
      "type": "GPIO",
      "port": 15,
      "dir": "output",
      "pull": "pullup"
    },
    "hc":{ 
   
      "type":"GPIO",
      "port": 17,
      "dir": "input",
      "pull":"pullup"
    },               
    "SPI0": { 
   
      "type": "SPI",
      "port": 0,
      "mode": "master",
      "freq": 2000000
    },
    "serial1": { 
   
      "type": "UART",
      "port": 0,
      "dataWidth": 8,
      "baudRate": 115200,
      "stopBits": 1,
      "flowControl": "disable",
      "parity": "none",
      "timeout": 1000
    },
    "serial2": { 
   
      "type": "UART",
      "port": 1,
      "dataWidth": 8,
      "baudRate": 9600,
      "stopBits": 1,
      "flowControl": "disable",
      "parity": "none",
      "timeout": 1000
    },
    "serial3": { 
   
      "type": "UART",
      "port": 2,
      "dataWidth": 8,
      "baudRate": 115200,
      "stopBits": 1,
      "flowControl": "disable",
      "parity": "none",
      "timeout": 1000
    }
  },
  "debugLevel": "ERROR",
  "repl": "enable",
  "replPort": 0
}


3、调试

1、串口调试工具log,网络连接成功–动态注册成功–打印根据传感器状态打印信息
在这里插入图片描述
2、阿里云平台,打开实时刷新,物模型会即时显示lLED当前状态。
在这里插入图片描述

4、钉钉消息提醒

4.1添加钉钉机器人

在钉钉创建一个群组并进入群设置→智能助手→添加机器人→自定义。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:自定义关键词要与平台物模型一致
在这里插入图片描述
复制webhook地址,后面需要用到。
在这里插入图片描述

4.2、IoT Studio设置

进入IoT Studio产品页,开通服务后
项目管理→新建项目
在这里插入图片描述
在这里插入图片描述
添加关联产品、设备
在这里插入图片描述
在这里插入图片描述
返回主页,新建空白业务逻辑。
在这里插入图片描述
将节点拖入操作区
在这里插入图片描述
节点用线连接。
在这里插入图片描述
配置设备触发节点
选择调试设备
在这里插入图片描述

配置钉钉机器人节点,复制钉钉webhook网址。
在这里插入图片描述
依次点击保存、部署、发布。
在这里插入图片描述

4.3 在线调试

云平台在线调试发送数据1
在这里插入图片描述
钉钉群发出消息
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187139.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库与spring事务隔离级别不一致_spring事务传播行为

    数据库与spring事务隔离级别不一致_spring事务传播行为脏读:一个事务读取到另一个事务未提交的数据,出现脏读的本质是是因为操作(修改)完数据就立马释放掉锁,导致其他事务可以读取数据,而读取的数据是无用的或者错误的。不可重复读:一个事务读取到另外一个事务已经提交的数据,即一个事务可以看到其他事务所做的修改。幻读(虚读):一个事务内读取到了别的事务插入的数据,导致前后读取不一致。查看当前会话隔离级别:select@@tx_isolation;查看…

    2022年10月21日
  • C# winform开发界面美化

    C# winform开发界面美化总述winform属于比较老的桌面程序开发框架,由于它的易用性常用于一些测试软件、工控软件的开发,界面的美观是其存在的比较大的问题,自带的控件普遍比较不美观,下面介绍一下一些第三方的组件库。CSkin使用方法导入官网下载的dll链接库即可使用,导入后会在左边的组件框生成组件。组件效果SunnyUI使用方法导入dll链接库可用,下载连接组件效果NetWinform使用方法代码开源,可直接使用代码,或者NuGetInstall-PackageHZH_Controls,下载路径

    2022年5月8日
  • 毫无头绪的自学Python,你可能连门槛都摸不到![通俗易懂]

    毫无头绪的自学Python,你可能连门槛都摸不到![通俗易懂]目前的IT行业发展日趋迅猛,IT产业的产值成倍增长,不少人都打算从零基础开始学习python。对于零基础的初学者来说,最迷茫的是不知道怎样开始学习?那这里小编为大家规划了一条零基础自学必看pyth

    2022年7月3日
  • kafka消息和日志

    kafka消息和日志

    2021年9月15日
  • 将win server 2003 DHCP角色迁移到win server 2012 R2

    将win server 2003 DHCP角色迁移到win server 2012 R2

    2022年3月8日
  • Tensorflow数据读取之tfrecord

    Tensorflow数据读取之tfrecord文章目录tfrecordtfrecord的使用流程写入tfrecord文件读取tfrecord文件tfrecord中的数据格式tfrecord中对于变长数据和定长数据的处理tfrecord中生成batch_data的方法插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数…

    2022年11月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号