HasS Python 温湿度检测系统及小程序实现 (一) 温湿度检测及数据上云
前言
偶然的机会接触到阿里云的HaaS Python物联网开发框架,几天的使用下来发现使用起来开发速度非常快,数据采集,上云,应用开发一气呵成。即使对硬件不熟悉的程序员也可以快速地完成物联网全流程的开发,通过复现我之前做的小项目 基于MQTT应用层协议的物联网家庭温湿度监测系统 并记录全过程,作为学习HaaS的学习笔记。
本系列文章主要实现三个任务
- 采用HaaS Python 框架实现硬件设备端温湿度检测及数据上云
- 采用阿里云IOT studio开发移动端应用程序,实现用手机可以查看硬件设备端数据
- 将移动端应用程序迁移至手机小程序,实现小程序查看数据
对比采用HaaS和不采用HaaS开发的区别
HaaS
- 阿里云官方提供硬件固件,猜测固件封装了操作系统,文件系统以及python解释器。开发者编写python脚本上传至硬件即可运行代码,不用编译
- 固件自带网络,设备驱动和MQTT等网络协议,不用自己移植,后期方便加入AI应用,真正实现端云一体开发
- 云端和自己开发的无差别都采用阿里云物联网平台。但HaaS采用阿里云推出的IOT studio来完成Web应用或小程序应用的开发,无需自己再搭建服务器,打通了整个物联网数据的全生命周期管理。
- IOT studio类似于之前我使用的nodered,应用界面和数据逻辑都可以通过图形化拖拽的方式建立,加快了应用速度
HaaS整体框图如下
不采用HaaS开发
- 硬件设备端采用C语言,需要自己移植MQTT等协议和底层驱动,开发周期较长,而且需要开发者对硬件有一定了解
- 需要自己搭建应用服务器,这里我采用了阿里云服务器ECS,运行nodered实现web应用。搭建服务器过程繁琐,且不能和阿里云物联网一些AI和云计算等服务做整合,比较简单粗暴
下面是自己之前不采用HaaS开发的整体框图
相关链接
HaaS EDU,对HaaS有较全面的资料文档,方便小白入门
https://gitee.com/haasedu/haasedu
HaaS 主页
https://haas.iot.aliyun.com/haasv2
硬件准备
- nodemcu esp32s 开发板一个
- SHT3X-DIS温湿度传感器一个
- RGB三色LED灯一个
- 杜邦线若干
- Micro-USB数据线一条
硬件连接如下图
实物图如下
软件准备
本文基于HaaS EDU中的示例项目 花卉养殖系统 在进行进一步开发之前,首先要根据官网教程配置好如下软件环境
- HaaS Studio开发环境
- ESP32固件烧录
正文
在读取硬件设备端的数据之前,需要配置云端的数据模型,以便和硬件设备端的数据对应,这样云端接收到硬件设备端的数据就知道这些数据对应着什么样的信息。
云端数据配置
云端数据配置分为以下三步
1.创建云端产品
2.创建产品属性(物模型)
3.创建云端设备(获取三元组)
云端的数据结构可以用面向对象的思想来类比
- 云端产品就是一个类
- 产品属性(物模型)是类的属性,一个类的所有对象都有这些属性
- 云端设备等同于类的对象,是类的一个具体实现
比如人是一个类,属于云端产品;人的年龄身高是类的属性,属于物模型;你,是一个具体的人,是人类的具体对象,属于云端设备。
创建云端产品
进入阿里云物联网控制台,并开通公共实例
https://iot.console.aliyun.com/
点击创建产品
输入产品名称,选择自定义品类,WIFI直连设备,其他保持默认
创建产品属性(物模型)
点击定义物模型
点击编辑草稿
添加自定义功能
这里添加两个功能,温度和湿度,配置如下
添加完成后点击发布上线,然后在产品界面点击发布才能使当前物模型更改生效,每次更改物模型后都要这么操作
创建云端设备(获取三元组)
首先点击添加设备
基于 温湿度检测设备 这个产品添加一个设备
设备生成成功后可以查看设备的三元组,云端设备也就对应着一个实际的物理设备。设备三元组可以唯一确定一个物理设备,三元组要留好,待会要用
硬件设备端开发
打开安装好 haas插件的 vscode,在快速开始界面选择创建项目
创建好项目后,找到HaaS官方花卉养殖系统的 代码仓库,将其中的代码复制到自己的项目中去
最终如下图所示
在main.py中将设备三元组信息改成刚刚创建的云端设备的三元组信息,并修改wifi名称和密码
点击部署运行,通过串口可以看到已经可以读取到温湿度信息
在阿里云控制台,也可以看到温湿度数据如下
进阶实验
前面实现了温湿度数据检测及上云,实现了硬件设备向云端发送数据,下面要实现云端向硬件设备发送数据,实现云端对硬件设备的控制。
下面要把RGB三色灯用起来,通过云端控制三色灯的亮灭。
云端物模型更改
首先在产品界面-功能定义-点击编辑草稿,编辑物模型
添加三个物模型属性,对应RGB三个颜色的灯
下面是红灯的物模型属性定义
三色灯属性定义完成后图所示,点击发布上线,完成物模型的更改
硬件设备端代码更改
将board.json中代码用下面的代码覆盖,增加了RGB灯的GPIO设置
{"name": "esp32","version": "1.0.0","io": {"sht3x": {"type": "I2C","port": 0,"addrWidth": 7,"freq": 400000,"mode": "master","devAddr": 68},"led_r": {"type": "GPIO","port": 25,"dir": "output","pull": "pullup"},"led_g": {"type": "GPIO","port": 26,"dir": "output","pull": "pullup"},"led_b": {"type": "GPIO","port": 27,"dir": "output","pull": "pullup"}},"debugLevel": "ERROR","repl": "disable"
}
将main.py中代码用下面的代码覆盖,记得wifi名称密码和三元组改成你自己的
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : main.py
@Description: 温湿度上云
@Author : franhawk
@version : 1.0
'''
from aliyunIoT import Device # aliyunIoT组件是连接阿里云物联网平台的组件
import network # Wi-Fi功能所在库
import utime # 延时API所在组件
from driver import I2C # I2C总线驱动库
from driver import GPIO
import sht3x # SHT3X-DIS温湿度传感器驱动库
import ujson # json库
# 物联网平台连接标志位
iot_connected = False# 空调和加湿器状态变量
airconditioner = 0
humidifier = 0
airconditioner_value = 0
humidifier_value = 0# RGB状态变量
led_r = 0
led_g = 0
led_b = 0
led_r_value = 0
led_g_value = 0
led_b_value = 0# 三元组信息
productKey = "改成你自己的"
deviceName = "改成你自己的"
deviceSecret = "改成你自己的"# Wi-Fi SSID和Password设置
wifiSsid = "改成你自己的"
wifiPassword = "改成你自己的"wlan = None# 物联网设备实例
device = Nonei2cObj = None
humitureDev = None# 等待Wi-Fi成功连接到路由器
def get_wifi_status():global wlanwifi_connected = Falsewlan = network.WLAN(network.STA_IF) #创建WLAN对象wifi_connected = wlan.isconnected() # 获取Wi-Fi连接路由器的状态信息if not wifi_connected:wlan.active(True) #激活界面wlan.scan() #扫描接入点#print("start to connect ", wifiSsid)wlan.connect(wifiSsid, wifiPassword) # 连接到指定的路由器(路由器名称为wifiSsid, 密码为:wifiPassword)while True:wifi_connected = wlan.isconnected() # 获取Wi-Fi连接路由器的状态信息if wifi_connected: # Wi-Fi连接成功则退出while循环breakelse:utime.sleep(0.5)print("wifi_connected:", wifi_connected)ifconfig = wlan.ifconfig() #获取接口的IP/netmask/gw/DNS地址print(ifconfig)utime.sleep(0.5)# 通过温湿度传感器读取温湿度信息
def get_temp_humi():global humitureDev'''# 如果需要同时获取温湿度信息,可以呼叫getTempHumidity,实例代码如下:humniture = humitureDev.getTempHumidity() # 获取温湿度传感器测量到的温湿度值temperature = humniture[0] # get_temp_humidity返回的字典中的第一个值为温度值humidity = humniture[1] # get_temp_humidity返回的字典中的第二个值为相对湿度值'''temperature = humitureDev.getTemperature() # 获取温度测量结果# print("The temperature is: %.1f" % temperature)humidity = humitureDev.getHumidity() # 获取相对湿度测量结果# print("The humidity is: %d" % humidity)return temperature, humidity # 返回读取到的温度值和相对湿度值# 物联网平台连接成功的回调函数
def on_connect(data):global iot_connectediot_connected = True# 设置props 事件接收函数(当云平台向设备下发属性时)
def on_props(request):global led_r,led_g,led_b,led_r_value,led_g_value,led_b_valuepayload = ujson.loads(request['params'])# print (payload)# 获取dict状态字段 注意要验证键存在 否则会抛出异常if "led_r" in payload.keys():led_r_value = payload["led_r"]if (led_r_value):print("红灯亮")else:print("红灯灭")if "led_g" in payload.keys():led_g_value = payload["led_g"]if (led_g_value):print("绿灯亮")else:print("绿灯灭")if "led_b" in payload.keys():led_b_value = payload["led_b"]if (led_b_value):print("蓝灯亮")else:print("蓝灯灭")print(led_r_value, led_g_value,led_b_value)led_r.write(led_r_value)led_g.write(led_g_value) led_b.write(led_b_value) # 要将更改后的状态同步上报到云平台prop = ujson.dumps({'led_r': led_r_value,'led_g': led_g_value,'led_b': led_b_value,})upload_data = {'params': prop}# 上报空调和加湿器属性到云端device.postProps(upload_data)def connect_lk(productKey, deviceName, deviceSecret):global device, iot_connectedkey_info = {'region': 'cn-shanghai','productKey': productKey,'deviceName': deviceName,'deviceSecret': deviceSecret,'keepaliveSec': 60}# 将三元组信息设置到iot组件中device = Device()# 设定连接到物联网平台的回调函数,如果连接物联网平台成功,则调用on_connect函数device.on(Device.ON_CONNECT, on_connect)# 配置收到云端属性控制指令的回调函数,如果收到物联网平台发送的属性控制消息,则调用on_props函数device.on(Device.ON_PROPS, on_props)# 启动连接阿里云物联网平台过程device.connect(key_info)# 等待设备成功连接到物联网平台while(True):if iot_connected:print('物联网平台连接成功')breakelse:print('sleep for 1 s')utime.sleep(1)print('sleep for 2s')utime.sleep(2)# 上传温度信息和湿度信息到物联网平台
def upload_temperature_and_Humidity():global devicewhile True:data = get_temp_humi() # 读取温度信息和湿度信息# 生成上报到物联网平台的属性值字串prop = ujson.dumps({'CurrentTemperature': data[0],'CurrentHumidity': data[1]})print('uploading data: ', prop)upload_data = {'params': prop}# 上传温度和湿度信息到物联网平台device.postProps(upload_data)utime.sleep(2)if __name__ == '__main__':# 硬件初始化i2cObj = I2C()i2cObj.open("sht3x") # 按照board.json中名为"sht3x"的设备节点的配置参数(主设备I2C端口号,从设备地址,总线频率等)初始化I2C类型设备对象print("sht3x inited!")humitureDev = sht3x.SHT3X(i2cObj) # 初始化SHT3X-DIS传感器# 初始化 GPIOled_r = GPIO()led_g = GPIO()led_b = GPIO()led_r.open('led_r') # 使用board.json中led_g节点定义的GPIO,对应开发板上的红灯led_g.open('led_g') # 使用board.json中led_b节点定义的GPIO,对应开发板上的绿灯led_b.open('led_b') # 使用board.json中led_b节点定义的GPIO,对应开发板上的蓝灯# 请替换物联网平台申请到的产品和设备信息,可以参考文章:https://blog.csdn.net/HaaSTech/article/details/114360517get_wifi_status()connect_lk(productKey, deviceName, deviceSecret)upload_temperature_and_Humidity()i2cObj.close()
然后点击部署运行,部署到硬件上
云端调试
在阿里云物联网控制台点击-监控运维-在线调试-选择要调试的设备,设置RGB灯的开启和关闭,最后点击设置
可以看到相应的灯亮起来了
总结
本文实现了温湿度检测及数据上云,并且在官方示例的基础上增加了云端控制设备端RGB灯的亮灭的功能。之后会在此基础上采用阿里云IOT studio开发移动端应用程序,实现用手机可以查看硬件设备端数据,从而构成一个完整的物联网应用。
对于HaaS 我也有一些小建议,建议把固件开源,重视开发者社区的建设,从而让开发者可以通过更改固件支持需要的设备,如摄像头,语音等,让更多的人为HaaS添砖加瓦,促进HaaS的发展。
HasS Python 温湿度检测系统及小程序实现 (一) 温湿度检测及数据上云相关推荐
- php访问小程序内容检测接口,关于小程序接入敏感词检测接口的坑
接入 msgSecCheck 接口47001 错误码踩坑! 这是官方文档要求,写的有些笼统,根据开发者社区提供需要进行编码后在传参,以下为 php 代码示例/** * 敏感词检测 * @param $ ...
- 从0到1使用python开发一个半自动答题小程序
从0到1使用python开发一个半自动答题小程序 前言 最近每天都有玩微信读书上面的每日一答的答题游戏,完全答对12题后,可以瓜分无限阅读卡.但是从小就不太爱看书的我,很难连续答对12道题,由此,产生 ...
- python flask实战订餐系统微信小程序-60nginx + uwsgi 实现多进程访问
python flask实战订餐系统微信小程序-60nginx + uwsgi 实现多进程访问 B站配套视频教程观看 uwsgi多进程配置 uwsgi.ini配置 nginx和uwsgi通过配置文件s ...
- 计算机毕业设计Python+django 宠物领养中心小程序(源码+系统+mysql数据库+Lw文档)
项目介绍 据世界动物保护协会统计,全世界大概有5亿只流浪狗和散养的狗和大致同样数量的流浪猫,而这些主要源于主人的弃养.同时,在很多地区,狗和猫都处于散养状态,这部分的动物,也经常会变成流浪动物.猫和狗 ...
- java基于安卓微信小程序的医院核酸检测预约挂号系统 uniapp 小程序
医院核酸检测预约挂号的需求和管理上的不断提升,医院核酸检测预约挂号管理的潜力将无限扩大,医院核酸检测预约挂号微信小程序在业界被广泛关注,本网站及对此进行总体分析,将医院核酸检测预约挂号信息管理的发展提 ...
- python flask实战订餐系统微信小程序-59flask部署单进程启动服务
欢迎关注原创 Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn. ...
- 计算机毕业设计Python+uniapp基于微信小程序的旅游系统论文(小程序+源码+LW)
计算机毕业设计Python+uniapp基于微信小程序的旅游系统论文(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ ...
- 计算机毕业设计Python+uniapp基于微信小程序的校园跑腿系统论文(小程序+源码+LW)
计算机毕业设计Python+uniapp基于微信小程序的校园跑腿系统论文(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区 ...
- 计算机毕业设计Python+uniapp基于微信小程序点餐与结账系统LW(小程序+源码+LW)
计算机毕业设计Python+uniapp基于微信小程序点餐与结账系统LW(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区 ...
最新文章
- “汇新杯”新兴科技+互联网创新大赛青年创客专项赛即将截止报名
- usb-to-isp-for-stm32
- hdu 1568 Fibonacci 对数。。
- Android 常用的性能分析工具详解:GPU呈现模式, TraceView, Systrace, HirearchyViewer(转)...
- 《交互式程序设计 第2版》一3.6 关系比较
- 转账给张三,钱却被李四收到,如何狙击凶险的 App 漏洞?——专访娜迦CTO玩命...
- 985程序员因迟到工资被扣,一怒之下破解钉钉打卡,要不你也试试?
- 【CF453D】 Little Pony and Elements of Harmony(FWT)
- risc-v 编译 linux,linux - 如何为RISC-V编译Linux Kernel 4.20 - 堆栈内存溢出
- java常量表达式区别_java编译器对string常量表达式的处理和优化
- 【JavaWeb】IDEA中启动SpringBoot项目及解决相关报错问题
- 下docfetcher先下Java,DocFetcher使用教程——高效的文档文本检索工具
- java电子小词典课程设计,java课程设计---英汉电子词典
- linux文件系统 ubi,UBI文件系统简介
- [裴礼文数学分析中的典型问题与方法习题参考解答]4.5.1
- 原来变压器可以用来调节阻抗匹配!
- freebsd MySQL 提权_Intel Sysret (CVE-2012-0217)内核提权漏洞
- Ubuntu 14.04 配置 Java SE jdk-7u55
- Mysql数据库和navicat
- 利用树莓派3和RTL-SDR V3搭建一个低成本的QRP小功率监测点