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的发展。

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Hass机台串口通讯采集资料,指的是利用串口通信技术从Hass机台上获取数据Hass机台是一种自动化机械设备,通过串口通信可以实现与其他设备的数据交互和信息传输。 串口通信是一种广泛应用于数据传输的技术,可实现数据采集方式有很多种,以下是其中的一种方法: 首先,需要连接Hass机台和计算机或其他数据采集设备的串口,通常是通过串行端口转USB接口的转换器来实现。 然后,通过在计算机上编写相应的软件程序,通过串口通信协议与Hass机台进行通信。这些通信协议可以是标准的串口通信协议,也可以是厂家提供的特定协议。 在程序中,可以设置串口参数,如波特率、数据位、校验位等,以确保通信的正确性和稳定性。 接下来,可以使用串口通信指令,发送命令给Hass机台,以获取需要的数据。这些命令可以包括获取设备状态、获取传感器数据、控制机台运动等操作。 Hass机台在收到命令后,会根据命令执行相应的操作,并将结果通过串口返回给计算机或数据采集设备。 最后,通过解析串口返回的数据,可以得到所需的采集资料,可以进行进一步的数据处理、分析和存储。 总之,Hass机台串口通讯采集资料是一种利用串口通信技术从Hass机台上获取数据的方法,通过正确的串口连接和通信协议,以及编写相应的软件程序,可以实现Hass机台的数据采集和控制。 ### 回答2: HASS机台串口通讯是一种用于采集资料的技术。HASS是高级自动测试系统的缩写,是一种用于测试电子产品的自动化测试系统。在HASS机台中,串口通讯是一种常用的方式来连接机台与外部设备,以实现数据的传输和控制。 串口通讯是一种基于串行传输的通信方式,可以通过串口连接来和外部设备进行数据的交互。在HASS机台上,利用串口通讯可以方便地采集和传输各种数据,包括温度湿度、电流、电压等等。通过串口通讯,机台可以与外部设备如计算机、传感器、数据采集卡等实现实时数据的交互,从而方便地获取各种测试数据。 在进行HASS机台串口通讯采集资料的过程中,需要使用相应的串口通讯协议和通讯接口,如RS-232、RS-485等。通过配置合适的串口参数,可以与外部设备建立稳定的通信连接。一旦建立连接,就可以通过发送指令和接收数据实现数据的采集。同时,通过对采集到的数据进行解析和处理,可以进行更进一步的数据分析和应用。 值得注意的是,在HASS机台串口通讯采集资料的过程中,需要合理设计和配置串口通讯的时序、波特率等参数,以确保稳定的数据传输和准确的数据采集。此外,还需要保证机台与外部设备之间的物理连接正常,以避免通讯中断或数据丢失。 总之,HASS机台串口通讯采集资料是一种便捷且常用的数据采集方式,通过合理配置和利用串口通讯,可以方便地获取并应用各种测试数据,从而提高测试效率和质量。 ### 回答3: HASS机台串口通讯采集数据是指在HASS机台与外部设备之间通过串口进行通信,以获取相关数据的过程。 串口通信是一种常见的通信方式,它通过发送和接收数据实现设备之间的信息传递。HASS机台可以通过串口与其他设备连接,例如计算机、传感器等,以实现数据的采集和交互。 在HASS机台串口通讯采集资料的过程中,首先需要确保HASS机台和外部设备之间的串口连接是正常的。可以通过检查串口线的连接状态、端口设置等来进行确认。 其次,需要编写相应的程序或脚本来实现数据的采集和处理。这可能涉及到串口通信的协议、数据格式的解析以及数据的存储等操作。可以使用相关的编程语言或软件工具来完成这些任务。 一旦程序编写完成,就可以开始采集数据。通过串口通信,HASS机台可以与外部设备之间进行数据的发送和接收。可以根据需要进行周期性的数据采集,也可以根据外部设备的触发来主动进行数据的采集。 最后,采集到的数据可以进行进一步的处理和分析。可以将数据存储到数据库中,绘制图表进行可视化展示,或者进行其他的数据分析和应用。 总之,HASS机台串口通讯采集资料是一种通过串口通信进行数据交互和采集的过程,需要正确连接串口,编写程序实现数据的采集和处理,并进行数据的存储和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值