HasS Python 温湿度检测系统及小程序实现 温湿度检测及数据上云

Posted 张竞豪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HasS Python 温湿度检测系统及小程序实现 温湿度检测及数据上云相关的知识,希望对你有一定的参考价值。

前言

偶然的机会接触到阿里云的HaaS Python物联网开发框架,几天的使用下来发现使用起来开发速度非常快,数据采集,上云,应用开发一气呵成。即使对硬件不熟悉的程序员也可以快速地完成物联网全流程的开发,通过复现我之前做的小项目 基于MQTT应用层协议的物联网家庭温湿度监测系统 并记录全过程,作为学习HaaS的学习笔记。

本系列文章主要实现三个任务

  1. 采用HaaS Python 框架实现硬件设备端温湿度检测及数据上云
  2. 采用阿里云IOT studio开发移动端应用程序,实现用手机可以查看硬件设备端数据
  3. 将移动端应用程序迁移至手机小程序,实现小程序查看数据

对比采用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中的示例项目 花卉养殖系统 在进行进一步开发之前,首先要根据官网教程配置好如下软件环境

正文

在读取硬件设备端的数据之前,需要配置云端的数据模型,以便和硬件设备端的数据对应,这样云端接收到硬件设备端的数据就知道这些数据对应着什么样的信息。

云端数据配置

云端数据配置分为以下三步

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 = None

i2cObj = None
humitureDev = None

# 等待Wi-Fi成功连接到路由器
def get_wifi_status():
    global wlan
    wifi_connected = False

    wlan = 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循环
            break
        else:
            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_connected
    iot_connected = True

# 设置props 事件接收函数(当云平台向设备下发属性时)
def on_props(request):
    global led_r,led_g,led_b,led_r_value,led_g_value,led_b_value

    payload = 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_connected
    key_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('物联网平台连接成功')
            break
        else:
            print('sleep for 1 s')
            utime.sleep(1)
    print('sleep for 2s')
    utime.sleep(2)

# 上传温度信息和湿度信息到物联网平台
def upload_temperature_and_Humidity():
    global device

    while 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传感器

    # 初始化 GPIO
    led_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/114360517
    get_wifi_status()

    connect_lk(productKey, deviceName, deviceSecret)
    upload_temperature_and_Humidity()

    i2cObj.close()

然后点击部署运行,部署到硬件上

云端调试

在阿里云物联网控制台点击-监控运维-在线调试-选择要调试的设备,设置RGB灯的开启和关闭,最后点击设置

可以看到相应的灯亮起来了

总结

本文实现了温湿度检测及数据上云,并且在官方示例的基础上增加了云端控制设备端RGB灯的亮灭的功能。之后会在此基础上采用阿里云IOT studio开发移动端应用程序,实现用手机可以查看硬件设备端数据,从而构成一个完整的物联网应用。
对于HaaS 我也有一些小建议,建议把固件开源,重视开发者社区的建设,从而让开发者可以通过更改固件支持需要的设备,如摄像头,语音等,让更多的人为HaaS添砖加瓦,促进HaaS的发展。

以上是关于HasS Python 温湿度检测系统及小程序实现 温湿度检测及数据上云的主要内容,如果未能解决你的问题,请参考以下文章

HasS Python 温湿度检测系统及小程序实现 温湿度检测及数据上云

Python的安装及小程序练习

安装hass

grub命令及小系统的制作

python3 类的属性方法封装继承及小实例

ESP32 + Python打造智能温湿度花卉养植系统