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

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

来这里发现更多创意案例

HaaS开发框架

HaaS积木方案,赋能生态开发者,让您快速找到自己需要的解决方案,硬件主板与外设,以及各种应用组件。

https://haas.iot.aliyun.com/solution/


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




1、简介

1.1、背景

 

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


 

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


 

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


紫外线强度为0、1、2时,表示紫外线量最小,这个量对人体基本上没有影响

紫外线强度为3或4时,表示紫外线量是比较低的,对人体的影响也是比较小的

紫外线强度为5和6时,表示紫外线量是中等强度,对人体皮肤也有中等强度的伤害影响

紫外线强度为7、8、9时,表示有较强的紫外线照射强度,这时,对人体的影响就比较大,需要采取相应的防护措施

紫外线强度大于10时,表示紫外线照射量非常强,对人体有最大的影响,必须采取防护措施

 

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


紫外线强度低于或等于4点亮绿灯

紫外线强度在5和6之间点亮蓝灯

紫外线强度在7和9之间点亮红灯

紫外线强度大于9开蜂鸣器

1.2、准备

 

本案例需要如下硬件:


ESP32开发板一台

紫外线传感器一个

RGB三色LED灯一个

杜邦线若干

Micro-USB数据线一条

蜂鸣器一个

 

硬件连线图如下图所示:





2、物联网平台开发

 

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


 

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





开通物联网平台功能之后,需要完成下面的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”,这里开发者可以自己填入自己想设定的设备名称,也可以不填任何内容让系统自动生成设备名称,如下图所示。





 

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


 

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


三元组

物模型属性信息




获取设备三元组


 

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




查看设备属性信息


 

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




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



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 = "设备密钥"

修改设备端上报温湿度信息所用标识符

 

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端应用程序的开发。




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

————————————————

版权声明:本文为CSDN博主「HaaS技术社区」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/HaaSTech/article/details/126542229

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
2月前
|
缓存 监控 Python
在Python中,如何检测和处理内存泄漏?
【2月更文挑战第7天】【2月更文挑战第18篇】在Python中,如何检测和处理内存泄漏?
|
3月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
61 0
|
4月前
|
算法 开发工具 Python
python入门(八) 书体检测和识别
python入门(八) 书体检测和识别
|
2月前
|
监控 安全 自动驾驶
基于python的室内老人实时摔倒智能监测系统-跌倒检测系统(康复训练检测+代码)
基于python的室内老人实时摔倒智能监测系统-跌倒检测系统(康复训练检测+代码)
83 1
|
7月前
|
C++ 计算机视觉 Python
Python Yolov5路面裂缝识别检测识别
Python Yolov5路面裂缝识别检测识别
141 0
|
5月前
|
机器学习/深度学习 自动驾驶 算法
【OpenAI】Python:基于 Gym-CarRacing 的自动驾驶项目(2)| 车道检测功能的实现 | 边缘检测与分配 | 样条拟合
【OpenAI】Python:基于 Gym-CarRacing 的自动驾驶项目(2)| 车道检测功能的实现 | 边缘检测与分配 | 样条拟合
53 1
|
2月前
|
数据可视化 数据挖掘 调度
【Python数据挖掘】优化电能能源策略:基于非侵入式负荷检测与分解的智能解决方案
【Python数据挖掘】优化电能能源策略:基于非侵入式负荷检测与分解的智能解决方案
37 0
|
3月前
|
Python
Python 递归检测文件夹下的文件
Python 递归检测文件夹下的文件
23 0
|
9天前
|
数据采集 存储 安全
python检测代理ip是否可用的方法
python检测代理ip是否可用的方法
|
1月前
|
机器学习/深度学习 编解码 算法
Python实现视频人脸检测识别功能
Python实现视频人脸检测识别功能
37 0