HasS Python 温湿度检测系统及小程序实现 (一) 温湿度检测及数据上云
前言
偶然的機(jī)會(huì)接觸到阿里云的HaaS Python物聯(lián)網(wǎng)開發(fā)框架,幾天的使用下來發(fā)現(xiàn)使用起來開發(fā)速度非常快,數(shù)據(jù)采集,上云,應(yīng)用開發(fā)一氣呵成。即使對硬件不熟悉的程序員也可以快速地完成物聯(lián)網(wǎng)全流程的開發(fā),通過復(fù)現(xiàn)我之前做的小項(xiàng)目 基于MQTT應(yīng)用層協(xié)議的物聯(lián)網(wǎng)家庭溫濕度監(jiān)測系統(tǒng) 并記錄全過程,作為學(xué)習(xí)HaaS的學(xué)習(xí)筆記。
本系列文章主要實(shí)現(xiàn)三個(gè)任務(wù)
對比采用HaaS和不采用HaaS開發(fā)的區(qū)別
HaaS
- 阿里云官方提供硬件固件,猜測固件封裝了操作系統(tǒng),文件系統(tǒng)以及python解釋器。開發(fā)者編寫python腳本上傳至硬件即可運(yùn)行代碼,不用編譯
- 固件自帶網(wǎng)絡(luò),設(shè)備驅(qū)動(dòng)和MQTT等網(wǎng)絡(luò)協(xié)議,不用自己移植,后期方便加入AI應(yīng)用,真正實(shí)現(xiàn)端云一體開發(fā)
- 云端和自己開發(fā)的無差別都采用阿里云物聯(lián)網(wǎng)平臺(tái)。但HaaS采用阿里云推出的IOT studio來完成Web應(yīng)用或小程序應(yīng)用的開發(fā),無需自己再搭建服務(wù)器,打通了整個(gè)物聯(lián)網(wǎng)數(shù)據(jù)的全生命周期管理。
- IOT studio類似于之前我使用的nodered,應(yīng)用界面和數(shù)據(jù)邏輯都可以通過圖形化拖拽的方式建立,加快了應(yīng)用速度
HaaS整體框圖如下
不采用HaaS開發(fā)
- 硬件設(shè)備端采用C語言,需要自己移植MQTT等協(xié)議和底層驅(qū)動(dòng),開發(fā)周期較長,而且需要開發(fā)者對硬件有一定了解
- 需要自己搭建應(yīng)用服務(wù)器,這里我采用了阿里云服務(wù)器ECS,運(yùn)行nodered實(shí)現(xiàn)web應(yīng)用。搭建服務(wù)器過程繁瑣,且不能和阿里云物聯(lián)網(wǎng)一些AI和云計(jì)算等服務(wù)做整合,比較簡單粗暴
下面是自己之前不采用HaaS開發(fā)的整體框圖
相關(guān)鏈接
HaaS EDU,對HaaS有較全面的資料文檔,方便小白入門
https://gitee.com/haasedu/haasedu
HaaS 主頁
https://haas.iot.aliyun.com/haasv2
硬件準(zhǔn)備
- nodemcu esp32s 開發(fā)板一個(gè)
- SHT3X-DIS溫濕度傳感器一個(gè)
- RGB三色LED燈一個(gè)
- 杜邦線若干
- Micro-USB數(shù)據(jù)線一條
硬件連接如下圖
實(shí)物圖如下
軟件準(zhǔn)備
本文基于HaaS EDU中的示例項(xiàng)目 花卉養(yǎng)殖系統(tǒng) 在進(jìn)行進(jìn)一步開發(fā)之前,首先要根據(jù)官網(wǎng)教程配置好如下軟件環(huán)境
- HaaS Studio開發(fā)環(huán)境
- ESP32固件燒錄
正文
在讀取硬件設(shè)備端的數(shù)據(jù)之前,需要配置云端的數(shù)據(jù)模型,以便和硬件設(shè)備端的數(shù)據(jù)對應(yīng),這樣云端接收到硬件設(shè)備端的數(shù)據(jù)就知道這些數(shù)據(jù)對應(yīng)著什么樣的信息。
云端數(shù)據(jù)配置
云端數(shù)據(jù)配置分為以下三步
1.創(chuàng)建云端產(chǎn)品
2.創(chuàng)建產(chǎn)品屬性(物模型)
3.創(chuàng)建云端設(shè)備(獲取三元組)
云端的數(shù)據(jù)結(jié)構(gòu)可以用面向?qū)ο蟮乃枷雭眍惐?/p>
- 云端產(chǎn)品就是一個(gè)類
- 產(chǎn)品屬性(物模型)是類的屬性,一個(gè)類的所有對象都有這些屬性
- 云端設(shè)備等同于類的對象,是類的一個(gè)具體實(shí)現(xiàn)
比如人是一個(gè)類,屬于云端產(chǎn)品;人的年齡身高是類的屬性,屬于物模型;你,是一個(gè)具體的人,是人類的具體對象,屬于云端設(shè)備。
創(chuàng)建云端產(chǎn)品
進(jìn)入阿里云物聯(lián)網(wǎng)控制臺(tái),并開通公共實(shí)例
https://iot.console.aliyun.com/
點(diǎn)擊創(chuàng)建產(chǎn)品
輸入產(chǎn)品名稱,選擇自定義品類,WIFI直連設(shè)備,其他保持默認(rèn)
創(chuàng)建產(chǎn)品屬性(物模型)
點(diǎn)擊定義物模型
點(diǎn)擊編輯草稿
添加自定義功能
這里添加兩個(gè)功能,溫度和濕度,配置如下
添加完成后點(diǎn)擊發(fā)布上線,然后在產(chǎn)品界面點(diǎn)擊發(fā)布才能使當(dāng)前物模型更改生效,每次更改物模型后都要這么操作
創(chuàng)建云端設(shè)備(獲取三元組)
首先點(diǎn)擊添加設(shè)備
基于 溫濕度檢測設(shè)備 這個(gè)產(chǎn)品添加一個(gè)設(shè)備
設(shè)備生成成功后可以查看設(shè)備的三元組,云端設(shè)備也就對應(yīng)著一個(gè)實(shí)際的物理設(shè)備。設(shè)備三元組可以唯一確定一個(gè)物理設(shè)備,三元組要留好,待會(huì)要用
硬件設(shè)備端開發(fā)
打開安裝好 haas插件的 vscode,在快速開始界面選擇創(chuàng)建項(xiàng)目
創(chuàng)建好項(xiàng)目后,找到HaaS官方花卉養(yǎng)殖系統(tǒng)的 代碼倉庫,將其中的代碼復(fù)制到自己的項(xiàng)目中去
最終如下圖所示
在main.py中將設(shè)備三元組信息改成剛剛創(chuàng)建的云端設(shè)備的三元組信息,并修改wifi名稱和密碼
點(diǎn)擊部署運(yùn)行,通過串口可以看到已經(jīng)可以讀取到溫濕度信息
在阿里云控制臺(tái),也可以看到溫濕度數(shù)據(jù)如下
進(jìn)階實(shí)驗(yàn)
前面實(shí)現(xiàn)了溫濕度數(shù)據(jù)檢測及上云,實(shí)現(xiàn)了硬件設(shè)備向云端發(fā)送數(shù)據(jù),下面要實(shí)現(xiàn)云端向硬件設(shè)備發(fā)送數(shù)據(jù),實(shí)現(xiàn)云端對硬件設(shè)備的控制。
下面要把RGB三色燈用起來,通過云端控制三色燈的亮滅。
云端物模型更改
首先在產(chǎn)品界面-功能定義-點(diǎn)擊編輯草稿,編輯物模型
添加三個(gè)物模型屬性,對應(yīng)RGB三個(gè)顏色的燈
下面是紅燈的物模型屬性定義
三色燈屬性定義完成后圖所示,點(diǎn)擊發(fā)布上線,完成物模型的更改
硬件設(shè)備端代碼更改
將board.json中代碼用下面的代碼覆蓋,增加了RGB燈的GPIO設(shè)置
{"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組件是連接阿里云物聯(lián)網(wǎng)平臺(tái)的組件 import network # Wi-Fi功能所在庫 import utime # 延時(shí)API所在組件 from driver import I2C # I2C總線驅(qū)動(dòng)庫 from driver import GPIO import sht3x # SHT3X-DIS溫濕度傳感器驅(qū)動(dòng)庫 import ujson # json庫 # 物聯(lián)網(wǎng)平臺(tái)連接標(biāo)志位 iot_connected = False# 空調(diào)和加濕器狀態(tài)變量 airconditioner = 0 humidifier = 0 airconditioner_value = 0 humidifier_value = 0# RGB狀態(tài)變量 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設(shè)置 wifiSsid = "改成你自己的" wifiPassword = "改成你自己的"wlan = None# 物聯(lián)網(wǎng)設(shè)備實(shí)例 device = Nonei2cObj = None humitureDev = None# 等待Wi-Fi成功連接到路由器 def get_wifi_status():global wlanwifi_connected = Falsewlan = network.WLAN(network.STA_IF) #創(chuàng)建WLAN對象wifi_connected = wlan.isconnected() # 獲取Wi-Fi連接路由器的狀態(tài)信息if not wifi_connected:wlan.active(True) #激活界面wlan.scan() #掃描接入點(diǎn)#print("start to connect ", wifiSsid)wlan.connect(wifiSsid, wifiPassword) # 連接到指定的路由器(路由器名稱為wifiSsid, 密碼為:wifiPassword)while True:wifi_connected = wlan.isconnected() # 獲取Wi-Fi連接路由器的狀態(tài)信息if wifi_connected: # Wi-Fi連接成功則退出while循環(huán)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'''# 如果需要同時(shí)獲取溫濕度信息,可以呼叫g(shù)etTempHumidity,實(shí)例代碼如下:humniture = humitureDev.getTempHumidity() # 獲取溫濕度傳感器測量到的溫濕度值temperature = humniture[0] # get_temp_humidity返回的字典中的第一個(gè)值為溫度值humidity = humniture[1] # get_temp_humidity返回的字典中的第二個(gè)值為相對濕度值'''temperature = humitureDev.getTemperature() # 獲取溫度測量結(jié)果# print("The temperature is: %.1f" % temperature)humidity = humitureDev.getHumidity() # 獲取相對濕度測量結(jié)果# print("The humidity is: %d" % humidity)return temperature, humidity # 返回讀取到的溫度值和相對濕度值# 物聯(lián)網(wǎng)平臺(tái)連接成功的回調(diào)函數(shù) def on_connect(data):global iot_connectediot_connected = True# 設(shè)置props 事件接收函數(shù)(當(dāng)云平臺(tái)向設(shè)備下發(fā)屬性時(shí)) 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狀態(tài)字段 注意要驗(yàn)證鍵存在 否則會(huì)拋出異常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("藍(lán)燈亮")else:print("藍(lán)燈滅")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) # 要將更改后的狀態(tài)同步上報(bào)到云平臺(tái)prop = ujson.dumps({'led_r': led_r_value,'led_g': led_g_value,'led_b': led_b_value,})upload_data = {'params': prop}# 上報(bào)空調(diào)和加濕器屬性到云端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}# 將三元組信息設(shè)置到iot組件中device = Device()# 設(shè)定連接到物聯(lián)網(wǎng)平臺(tái)的回調(diào)函數(shù),如果連接物聯(lián)網(wǎng)平臺(tái)成功,則調(diào)用on_connect函數(shù)device.on(Device.ON_CONNECT, on_connect)# 配置收到云端屬性控制指令的回調(diào)函數(shù),如果收到物聯(lián)網(wǎng)平臺(tái)發(fā)送的屬性控制消息,則調(diào)用on_props函數(shù)device.on(Device.ON_PROPS, on_props)# 啟動(dòng)連接阿里云物聯(lián)網(wǎng)平臺(tái)過程device.connect(key_info)# 等待設(shè)備成功連接到物聯(lián)網(wǎng)平臺(tái)while(True):if iot_connected:print('物聯(lián)網(wǎng)平臺(tái)連接成功')breakelse:print('sleep for 1 s')utime.sleep(1)print('sleep for 2s')utime.sleep(2)# 上傳溫度信息和濕度信息到物聯(lián)網(wǎng)平臺(tái) def upload_temperature_and_Humidity():global devicewhile True:data = get_temp_humi() # 讀取溫度信息和濕度信息# 生成上報(bào)到物聯(lián)網(wǎng)平臺(tái)的屬性值字串prop = ujson.dumps({'CurrentTemperature': data[0],'CurrentHumidity': data[1]})print('uploading data: ', prop)upload_data = {'params': prop}# 上傳溫度和濕度信息到物聯(lián)網(wǎng)平臺(tái)device.postProps(upload_data)utime.sleep(2)if __name__ == '__main__':# 硬件初始化i2cObj = I2C()i2cObj.open("sht3x") # 按照board.json中名為"sht3x"的設(shè)備節(jié)點(diǎn)的配置參數(shù)(主設(shè)備I2C端口號(hào),從設(shè)備地址,總線頻率等)初始化I2C類型設(shè)備對象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中l(wèi)ed_g節(jié)點(diǎn)定義的GPIO,對應(yīng)開發(fā)板上的紅燈led_g.open('led_g') # 使用board.json中l(wèi)ed_b節(jié)點(diǎn)定義的GPIO,對應(yīng)開發(fā)板上的綠燈led_b.open('led_b') # 使用board.json中l(wèi)ed_b節(jié)點(diǎn)定義的GPIO,對應(yīng)開發(fā)板上的藍(lán)燈# 請?zhí)鎿Q物聯(lián)網(wǎng)平臺(tái)申請到的產(chǎn)品和設(shè)備信息,可以參考文章:https://blog.csdn.net/HaaSTech/article/details/114360517get_wifi_status()connect_lk(productKey, deviceName, deviceSecret)upload_temperature_and_Humidity()i2cObj.close()然后點(diǎn)擊部署運(yùn)行,部署到硬件上
云端調(diào)試
在阿里云物聯(lián)網(wǎng)控制臺(tái)點(diǎn)擊-監(jiān)控運(yùn)維-在線調(diào)試-選擇要調(diào)試的設(shè)備,設(shè)置RGB燈的開啟和關(guān)閉,最后點(diǎn)擊設(shè)置
可以看到相應(yīng)的燈亮起來了
總結(jié)
本文實(shí)現(xiàn)了溫濕度檢測及數(shù)據(jù)上云,并且在官方示例的基礎(chǔ)上增加了云端控制設(shè)備端RGB燈的亮滅的功能。之后會(huì)在此基礎(chǔ)上采用阿里云IOT studio開發(fā)移動(dòng)端應(yīng)用程序,實(shí)現(xiàn)用手機(jī)可以查看硬件設(shè)備端數(shù)據(jù),從而構(gòu)成一個(gè)完整的物聯(lián)網(wǎng)應(yīng)用。
對于HaaS 我也有一些小建議,建議把固件開源,重視開發(fā)者社區(qū)的建設(shè),從而讓開發(fā)者可以通過更改固件支持需要的設(shè)備,如攝像頭,語音等,讓更多的人為HaaS添磚加瓦,促進(jìn)HaaS的發(fā)展。
總結(jié)
以上是生活随笔為你收集整理的HasS Python 温湿度检测系统及小程序实现 (一) 温湿度检测及数据上云的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 严援朝座右铭
- 下一篇: 菜鸟爬取中关村手机详情页参数及报价