HasS Python 温湿度检测系统及小程序实现 (一) 温湿度检测及数据上云
前言
偶然的機會接觸到阿里云的HaaS Python物聯網開發框架,幾天的使用下來發現使用起來開發速度非常快,數據采集,上云,應用開發一氣呵成。即使對硬件不熟悉的程序員也可以快速地完成物聯網全流程的開發,通過復現我之前做的小項目 基于MQTT應用層協議的物聯網家庭溫濕度監測系統 并記錄全過程,作為學習HaaS的學習筆記。
本系列文章主要實現三個任務
對比采用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 温湿度检测系统及小程序实现 (一) 温湿度检测及数据上云的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 严援朝座右铭
- 下一篇: 菜鸟爬取中关村手机详情页参数及报价