• 这个夏天太热了,只能用他来保命,ESP32 + Python做一个检测紫外线设备


    来这里发现更多创意案例

    HaaS开发框架HaaS积木方案,赋能生态开发者,让您快速找到自己需要的解决方案,硬件主板与外设,以及各种应用组件。https://haas.iot.aliyun.com/solution/

    下图是本案例除硬件连线外的3步导学,每个步骤中实现的功能请参考图中的说明。

    1、简介

    1.1、背景

      
    紫外线是阳光光线中的一部分。适当紫外线强度的照射有助于人体合成维生素D,然而,过量的紫外线暴晒,会对人体造成损害,诱发皮肤疾病。

      
    本案例的紫外线检测系统可以实时检测紫外线光强度, 并在紫外线强度过高时提醒作出相应的防护。

      
    紫外线的强度等级分为0-15级别,通常,夜间的紫外线指数为0,热带、高原地区、晴天时的紫外线指数为15。按照对人体的影响,在紫外线强度等级的基础上,有以下划分:

    1. 紫外线强度为0、1、2时,表示紫外线量最小,这个量对人体基本上没有影响
    2. 紫外线强度为3或4时,表示紫外线量是比较低的,对人体的影响也是比较小的
    3. 紫外线强度为5和6时,表示紫外线量是中等强度,对人体皮肤也有中等强度的伤害影响
    4. 紫外线强度为7、8、9时,表示有较强的紫外线照射强度,这时,对人体的影响就比较大,需要采取相应的防护措施
    5. 紫外线强度大于10时,表示紫外线照射量非常强,对人体有最大的影响,必须采取防护措施

      
    本案例通过紫外线传感器测量环境紫外线强度,并根据不同的紫外线强度点亮不同颜色的LED灯或者打开蜂鸣器

    • 紫外线强度低于或等于4点亮绿灯
    • 紫外线强度在5和6之间点亮蓝灯
    • 紫外线强度在7和9之间点亮红灯
    • 紫外线强度大于9开蜂鸣器

    1.2、准备

      
    本案例需要如下硬件:

    • ESP32开发板一台
    • 紫外线传感器一个
    • RGB三色LED灯一个
    • 杜邦线若干
    • Micro-USB数据线一条
    • 蜂鸣器一个

      
    硬件连线图如下图所示:

     

    2、物联网平台开发

      
    对于第一次使用物联网平台的读者,需要开通实例以使用物联网平台的功能。这里可以使用免费的公共实例进行开发。

      
    物联网平台中,左上角选择“华东2-上海”,点击“公共实例”,即可开通。

     

    开通物联网平台功能之后,需要完成下面的4个步骤完成云端设备的设定:

    1. 创建云端产品
    2. 创建产品属性(物模型)
    3. 创建云端设备(获取三元组)
    4. 多设备场景联动设定

    2.1、创建云端产品

      
    点击上图中的“公共实例”,即可进入控制台进行产品创建。然后,点击创建产品按钮,如下图所示。

     

      
    在新建产品设定页面按照下图所示,设定“产品名称”,选择自定义品类,节点类型选择“直连设备”,联网方式选择“Wi-Fi”,数据格式选择“ICA标准数据格式”,检验类型和认证方式选择默认设定即可。还可以根据开发者自己的需求在“产品描述”页面添加针对此产品的描述。

     


    选择之后,点击“确认”按钮,即可完成产品创建。返回“产品”页面之后可以看到产品类表中会出现刚刚创建的“紫外线检测系统”的产品,如下图所示。

     

    2.2、创建产品属性(物模型)

      
    点击上图中的“查看”按钮,即可看到产品信息,Topic列表,功能定义,数据解析等跟产品相关功能的设定。点开“功能定义”标签页,可以看到设备物模型定义。

      
    标识符是设备端上报设备属性状态的消息中需要使用的标识符,并且只有在设备上报的属性内容符合“数据定义”中的数据取值范围的时候才会被物联网平台记录,否则会被物联网平台认定为非法属性而过滤掉。

       
    本节我们选择直接新建方式来创建此产品需要的物模型信息,点击上图中的”编辑草稿“按钮。然后如下图再点击“添加自定义功能”。

     

      
    如下图添加一个“红色LED”的功能。其中标识符为redledSwith, 0表示LED灯关闭,1表示LED灯开启。

     

    用同样的方式分别添加“蓝色LED”、“绿色LED”、“蜂鸣器” 和 “紫外线强度”功能,标识符分别为 blueSwitch, greeSwitch,buzzer 和 uvlevel

    蓝色LED:

     

    绿色LED:

     

    蜂鸣器:

     

    紫外线强度:

     添加完属性之后,点击左下角的“发布上线”按钮 ,根据系统提示进行确认即可,如下图所示:

     

     产品及其物模型创建完成后就可以创建这个产品的设备了。
     

    2.3、创建云端设备(获取三元组)

      
    在产品列表页面中,点击“管理设备”,就会进到设备管理页面。

     

      
    在“设备”页面点击“添加设备”按钮,如下图所示。

     

      
    在“添加设备”页面中设定“deviceName”,这里开发者可以自己填入自己想设定的设备名称,也可以不填任何内容让系统自动生成设备名称,如下图所示。

     

      
    设备添加完成后,点击“前往查看”按钮,就可以看到此设备端详细信息了。

      
    设备信息中有两个信息需要和设备端开发相匹配:

    1. 三元组
    2. 物模型属性信息

     

    获取设备三元组

      
    如上图所示,点击“查看”按钮,就可以看到设备的三元组信息,三元组是物联网设备端和物联网云端设备相关联的唯一标识符,在设备端连接云端的时候会使用三元组信息和云端进行鉴权,鉴权通过之后云端会认为设备已激活并上线。

    查看设备属性信息

      
    设备详情信息页中的“物模型数据”标签页中可以看到设备的所有属性信息、设备时间上报情况及设备服务调用情况,如下图所示。待物联网设备按照设备属性对应的标识符上报设备属性的时候,本图片中的“紫外线强度“,”蜂鸣器“等属性值就会显示设备最新的属性信息。

    创建产品和设备的过程是按照面向对象的思想进行设计的,其中创建产品可以看成是新建一个类,其中的物模型则是类的对象,创建设备则是进行类的实例化。

     

    3、设备端开发

    3.1、开发环境

      
    在进行下一步之前请确保ESP32开发环境已经搭建完毕。详情请参考esp32开发环境的说明。

    3.2、创建解决方案

      
    如下图所示,在Haas Studio中创建项目。先选择左侧的“开发板型号”再从右侧的案例中选择“紫外线检测系统”案例点击“立即创建”即可。

     然后对main.py里边的内容后需要完成以下三处代码修改。

    Python脚本的详细说明请参考脚本内嵌的文字版注释

    修改路由器名称及密码
      
    修改main.py中wifiSsid和wifiPassword的值为读者实际要连接的路由器的名称及密码(请注意名称和密码都需要放在""符号中间)。

    1. # Wi-Fi SSID和Password设置
    2. wifiSsid = "请填写您的路由器名称"
    3. wifiPassword = "请填写您的路由器密码"

      
    修改完成之后get_wifi_status函数中的wlan.connect(wifiSsid, wifiPassword)语句就会连接读者自己设定的路由器。

    修改设备端三元组

      
    修改main.py中productKey、deviceName和deviceSecret的值为读者创建的物联网设备的三元组信息,如下图所示:

    1. # 三元组信息
    2. productKey = "产品密钥"
    3. deviceName = "设备名称"
    4. deviceSecret = "设备密钥"
    1. 修改设备端上报温湿度信息所用标识符

      
    main.py中下面的代码实现的是上传紫外线强度值到云端的功能。其中uvlevel便是紫外线强度上报时所用的标识符。

    1. # 上传紫外线等级信息到物联网平台
    2. def upload_uvlevel():
    3. global device
    4. while True:
    5. data = get_uvlevel() # 读取紫外线等级
    6. # 生成上报到物联网平台的属性值字串
    7. prop = ujson.dumps({
    8. 'uvlevel': data
    9. })
    10. print('uploading data: ', prop)
    11. upload_data = {'params': prop}
    12. # 上传紫外线等级值到物联网平台
    13. device.postProps(upload_data)
    14. utime.sleep(2)

      
    确保这个标识符和物联网产品的物模型中属性标识符是一样的,如下图所示:

     

      
    下面是本案例重点代码段落讲解:

    • 定义4个变量用来控制LED和蜂鸣器对应的GPIO
    1. # LED灯和蜂鸣器状态
    2. redledon = 0
    3. greenledon = 0
    4. blueledon = 0
    5. buzzeron = 0
    • 定义函数处理云端信息并控制GPIO的接口
    1. # 设置props 事件接收函数(当云平台向设备下发属性时)
    2. def on_props(request):
    3. global redledon, greenledon, blueledon, buzzeron, redleddev, blueleddev, greenleddev, buzzerdev
    4. payload = ujson.loads(request['params'])
    5. if "redledSwith" in payload.keys():
    6. redledon = payload["redledSwith"]
    7. if (redledon):
    8. print("点亮红色LED")
    9. if "blueledSwitch" in payload.keys():
    10. blueledon = payload["blueledSwitch"]
    11. if (blueledon):
    12. print("点亮蓝色LED")
    13. if "greenledSwitch" in payload.keys():
    14. greenledon = payload["greenledSwitch"]
    15. if (greenledon):
    16. print("点亮绿色LED")
    17. if "buzzer" in payload.keys():
    18. buzzeron = payload["buzzer"]
    19. if (buzzeron):
    20. print("打开蜂鸣器")
    21. redleddev.write(redledon) # 控制红灯开关
    22. blueleddev.write(blueledon) # 控制蓝灯开关
    23. greenleddev.write(greenledon) # 控制绿灯开关
    24. buzzerdev.write(buzzeron) # 控制蜂鸣器
    25. # 要将更改后的状态同步上报到云平台
    26. prop = ujson.dumps({
    27. 'redledSwith': redledon,
    28. 'blueledSwitch': blueledon,
    29. 'greenledSwitch': greenledon,
    30. 'buzzer': buzzeron,
    31. })
    32. upload_data = {'params': prop}
    33. # 上报LED和蜂鸣器属性到云端
    34. device.postProps(upload_data)

    4、运行结果

    4.1、设备端

      
    推送此脚本到ESP32之后,运行此脚本,ESP32串口会周期性的打印如下日志,其中:

    • “物联网平台连接成功”代表成功连接到物联网平台。
    • “uploading data: {"uvlevel": 0}” 代表在向云平台上传紫外线强度等级(uvlevel),等级值为0。
    1. ==== python file check /data/pyamp/main.py ====
    2. ==== python execute from /data/pyamp/main.py ====
    3. uv inited!
    4. LED inited!
    5. buzzer inited!
    6. wifi_connected: False
    7. wifi_connected: False
    8. wifi_connected: False
    9. wifi_connected: False
    10. wifi_connected: False
    11. wifi_connected: False
    12. wifi_connected: False
    13. wifi_connected: False
    14. ('192.168.43.45', '255.255.255.0', '192.168.43.1', '192.168.43.1')
    15. establish tcp connection with server(host='gv4cPr38bfE.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443])
    16. sleep for 1 s
    17. sleep for 1 s
    18. tcp_connect: can only connect from state CLOSED
    19. success to establish tcp, fd=54
    20. 物联网平台连接成功
    21. sleep for 2s
    22. uploading data: {"uvlevel": 0}
    23. uploading data: {"uvlevel": 0}
    24. uploading data: {"uvlevel": 0}
    25. uploading data: {"uvlevel": 0}
    26. uploading data: {"uvlevel": 0}
    27. uploading data: {"uvlevel": 0}
    28. uploading data: {"uvlevel": 0}
    29. uploading data: {"uvlevel": 0}

    4.2、物联网平台端设备信息查看

      
    物联网设备的系统启动成功并连接到物联网平台之后,物联网平台上对应的设备状态会从“未激活”状态变为“上线”,在物模型数据标签页上会显示设备上报到物联网平台的属性值。

      
    此时如果开发板紫外线强度发生变化,物联网平台的物模型数据会更新为设备上报的最新的属性值。

     

    4.3、物联网平台控制LED灯和蜂鸣器

      
    物联网设备上线之后,可以通过”监控运维“中的"在线调试"功能进行调试,详细操作步骤见下图:

      
    此产品的物模型属性中,"紫外线强度"设置的是只读,也就是说智能从设备端读取,不支持设置此状态到设备端,所以点开"紫外线强度"后面的”调试“之后,里边只有获取的选项。三个LED和蜂鸣器设置的是可读可写,所以点开”红色LED“后面的”调试“之后,里边有”获取“、”设置”和“设置期望值”三个选项。
    这里可以选择打开"绿色lED"之后点击“设置”进行绿色LED功能的调试。

     

     此时查看设备端绿色LED是否已经打开,打开成功则代表控制成功。

    5、紫外线强度监控系统物联网应用开发

      
    下图是一个典型的物联网应用程序开发的流程图,接下来本节就按照这个流程介绍如何完成紫外线监控系统web端应用程序的开发。

    这部分的细节就不详细介绍了,开发者朋友们,自动来动手试试吧。 

  • 相关阅读:
    C++多态【下】
    云服务器哪家便宜?教你怎么在AWS免费领一年云服务器(领取篇)
    14.4 Socket 双向数据通信
    电子电子架构——AUTOSAR信息安全机制有哪些(下)
    7. RabbitMQ之延时队列
    jvm虚拟机之类加载器子系统
    AQS源码阅读与强软弱虚4种引用以及ThreadLocal原理与源码
    莱特飞行优化及其使用场景
    C++进阶篇2---多态
    整理的最新版的K8S安装教程,看完还不会,请你吃瓜
  • 原文地址:https://blog.csdn.net/HaaSTech/article/details/126542229