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

Posted HaaS技术社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个夏天太热了,只能用他来保命,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的值为读者实际要连接的路由器的名称及密码(请注意名称和密码都需要放在""符号中间)。

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

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

修改设备端三元组

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

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

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

# 上传紫外线等级信息到物联网平台
def upload_uvlevel():
    global device

    while True:
        data = get_uvlevel()                      # 读取紫外线等级
        # 生成上报到物联网平台的属性值字串
        prop = ujson.dumps(
            'uvlevel': data
            )
        print('uploading data: ', prop)

        upload_data = 'params': prop
        # 上传紫外线等级值到物联网平台
        device.postProps(upload_data)
        utime.sleep(2)

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

 

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

  • 定义4个变量用来控制LED和蜂鸣器对应的GPIO
# LED灯和蜂鸣器状态
redledon = 0
greenledon = 0
blueledon = 0
buzzeron = 0
  • 定义函数处理云端信息并控制GPIO的接口
# 设置props 事件接收函数(当云平台向设备下发属性时)
def on_props(request):
    global redledon, greenledon, blueledon, buzzeron, redleddev, blueleddev, greenleddev, buzzerdev

    payload = ujson.loads(request['params'])

    if "redledSwith" in payload.keys():
        redledon = payload["redledSwith"]
        if (redledon):
            print("点亮红色LED")

    if "blueledSwitch" in payload.keys():
        blueledon = payload["blueledSwitch"]
        if (blueledon):
            print("点亮蓝色LED")

    if "greenledSwitch" in payload.keys():
        greenledon = payload["greenledSwitch"]
        if (greenledon):
            print("点亮绿色LED")

    if "buzzer" in payload.keys():
        buzzeron = payload["buzzer"]
        if (buzzeron):
            print("打开蜂鸣器")

    redleddev.write(redledon)                  # 控制红灯开关
    blueleddev.write(blueledon)                # 控制蓝灯开关
    greenleddev.write(greenledon)              # 控制绿灯开关
    buzzerdev.write(buzzeron)                  # 控制蜂鸣器

    # 要将更改后的状态同步上报到云平台
    prop = ujson.dumps(
        'redledSwith': redledon,
        'blueledSwitch': blueledon,
        'greenledSwitch': greenledon,
        'buzzer': buzzeron,
    )

    upload_data = 'params': prop
    # 上报LED和蜂鸣器属性到云端
    device.postProps(upload_data)

4、运行结果

4.1、设备端

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

  • “物联网平台连接成功”代表成功连接到物联网平台。
  • “uploading data: "uvlevel": 0” 代表在向云平台上传紫外线强度等级(uvlevel),等级值为0。
 ==== python file check /data/pyamp/main.py ====
 ==== python execute from /data/pyamp/main.py ====
uv inited!
LED inited!
buzzer inited!
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
('192.168.43.45', '255.255.255.0', '192.168.43.1', '192.168.43.1')
establish tcp connection with server(host='gv4cPr38bfE.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443])
sleep for 1 s
sleep for 1 s
tcp_connect: can only connect from state CLOSED
success to establish tcp, fd=54
物联网平台连接成功
sleep for 2s
uploading data:  "uvlevel": 0
uploading data:  "uvlevel": 0
uploading data:  "uvlevel": 0
uploading data:  "uvlevel": 0
uploading data:  "uvlevel": 0
uploading data:  "uvlevel": 0
uploading data:  "uvlevel": 0
uploading data:  "uvlevel": 0

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

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

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

 

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

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

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

 

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

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

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

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

以上是关于这个夏天太热了,只能用他来保命,ESP32 + Python做一个检测紫外线设备的主要内容,如果未能解决你的问题,请参考以下文章

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

你可能这个夏天都看不到祖宗布!合约阶梯又填新比赛!AOP为何突然消失!

夏天电动汽车起火事故频繁,在于它实在太怕热了

返利APP对比,返利APP那个好?

或将迎接史上最热夏天,你准备好了吗?

esp32tcpclient最大传输的数据长度