隨著城市化不斷擴大,城市的燈光秀越來越多,讓我們居住的城市生活變得五彩繽紛,燈火輝煌,讓城市顯得越來越繁華,但是,我們也會經常發現有些路邊的燈,在天很黑了不會自動打開,或者到清晨,天很亮了,馬路邊的燈也不會自動熄滅,只會在固定時間統一開關控制,這樣既不人性化也不環保,于是現在很多地方的路燈會根據周圍環境亮度自動開啟或關閉路邊燈光,那這樣的路燈就非常人性化,同時也非常環保,這才是真正的城市智慧路燈,
1、背景知識
本案例打造的智慧路燈控制系統是當檢測到周圍環境亮度變暗的時候,系統會自動打開燈,當周圍環境亮度變亮的時候,系統就會自動關閉燈,本智慧路燈控制系統默認設定一個亮度閾值,當亮度值超過閾值,關燈,當亮度值低于閾值,開燈,當然,這個閾值可以根據每個人對光的亮度感覺不同而調整,
硬體器材:
- ESP32開發一套
- 光敏電阻傳感器一個
- 連接線若干
硬體連線圖如下圖所示:

整個開發程序只需要2步:

2、物聯網平臺開發
對于第一次使用物聯網平臺的讀者,需要開通實體以使用物聯網平臺的功能,這里可以使用免費的公共實體進行開發,在物聯網平臺,左上角選擇“華東2-上海”,點擊“公共實體”,即可開通,
2.1、云端創建產品
- 創建產品
點擊“公共實體”,即可進入控制臺進行產品創建,然后,點擊創建產品按鈕,如下圖所示,

這里創建了一個名稱為“智慧路燈”的產品,

點擊確認,就可以在產品串列中出現智慧路燈,

查看產品詳情,

編輯草稿,選擇自定義功能,

如下圖設定對應產品的物模型,分別設定光強度電壓值和燈開關兩個模型,

在產品詳情中增加產品的功能,可以看到剛才設定的光強度電壓值和燈開關兩個功能屬性,點擊發布上線,

這樣,整個智慧路燈產品在物聯網平臺也創建好了,
- 設備管理
選中最左邊欄設備管理中的設備,然后添加設備,

選擇的產品為剛剛創建的智慧路燈,設備名設定為smartlight,點擊確認,

進入設備詳情,獲取設備三元組資訊,

將設備三元組資訊一鍵拷貝出來,在設備開發中會用到,

- 設備引擎
如何通過光感自適應控制燈的亮滅呢?可以在物聯網平臺上通過引擎規則實作,本課程使用的光敏電阻傳感器測的光強度電壓值越高,說明周圍的環境越暗;反之,測得的光強度電壓值越低,說明周圍的環境越亮,

當光強度電壓值大于1000,說明周圍的環境變暗,執行開燈的指令

當光強度電壓值小于1000,說明周圍的環境變亮,執行關燈的指令

規則引擎創建完成以后,啟動引擎即可,

3、設備端開發
在進行下一步之前請確保ESP32開發環境已經搭建完畢,詳情請參考esp32開發環境的說明,
3.1、創建解決方案
如下圖所示,打開VS Code之后在新建一個基于helloworld的python工程,設定好工程名稱(“light_smart”)及作業區路徑之后,硬體型別選擇ESP32,點擊立即創建,創建一個Python輕應用的解決方案,

將智慧路燈系統腳本的代碼復制后覆寫到剛剛創建的工程根目錄下,main.py里邊的內容如下圖所示:

Python腳本的詳細說明請參考腳本內嵌的文字注釋
- 修改路由器名稱及密碼
?? 修改light_smart工程里main.py中wifiSsid和wifiPassword的值為讀者實際要連接的路由器的名稱及密碼(請注意名稱和密碼都需要放在""符號中間),
# wifi連接的的ssid和pwd定義
wifiSsid = "請填寫您的路由器名稱"
wifiPassword = "請填寫您的路由器密碼"
?? 修改完成之后get_wifi_status函式中的wlan.connect(wifiSsid, wifiPassword) 陳述句就會連接讀者自己設定的路由器,
- 修改設備端三元組
?? 修改fq_time工程里main.py中productKey、deviceName和deviceSecret的值為上面物聯網平臺創建的物聯網設備的三元組資訊,復制即可:

# 物聯網平臺相關的key和serect定義
productKey = "產品密鑰"
deviceName = "設備名"
deviceSecret = "設備密鑰"
- 修改設備端上報光強度和下發開關識別符號
?? light_smart工程里main.py中下面的代碼實作的是上傳光強度值到云端的功能,以及云端下發對應的開關命令,其中Brightness便是光強度值上報時所用的識別符號,onoff為云端下發的開關識別符號,
def report_light_data(l_data):
# 生成上報到物聯網平臺的屬性值字串
prop = ujson.dumps({
'Brightness': l_data,
})
upload_data = {'params': prop}
# 上傳光強度資訊到物聯網平臺
device.postProps(upload_data)
?? 下面是采集光照資料的時候,采樣值是跨閾值1000就需要進行上報,
# 采集列印光照強度電壓值
def show_lightness():
global lightness,i_light,last_light,system_reset
i_light = int(lightness)
if system_reset == 1:
print("system first come")
system_reset = 0 # 系統第一次啟動
report_light_data(i_light)
elif (i_light >= 1000 and last_light < 1000) or (i_light < 1000 and last_light >= 1000):
report_light_data(i_light)
print("light has change")
else:
print('no need report')
if i_light < 10:
T_str = "亮度:" + str(round(i_light, 1))
elif i_light >= 10 and i_light < 100:
T_str = "亮度:" + str(round(i_light, 2))
elif i_light >= 100 and i_light < 1000:
T_str = "亮度:" + str(round(i_light, 3))
elif i_light >= 1000 and i_light < 10000:
T_str = "亮度:" + str(round(i_light, 4))
print(T_str)
last_light = i_light
?? 處理物聯網平臺過來的資料,
# 設定props 事件接收函式(當云平臺向設備下發屬性時)
def on_props(request):
global alarm_on, device
print(request)
payload = ujson.loads(request['params'])
# 獲取dict狀態欄位 注意要驗證鍵存在 否則會拋出例外
if "onoff" in payload.keys():
alarm_on = payload["onoff"]
if (alarm_on):
print("開燈")
ledOn()
else:
print("關燈")
ledOff()
# 要將更改后的狀態同步上報到云平臺
upload_data = {'params': ujson.dumps({
'onoff': alarm_on,
})
}
# 上報本地燈的狀態到云端
device.postProps(upload_data)
?? 確保Brightness和onoff兩個識別符號和物聯網產品的物模型中屬性識別符號是一樣的,如下圖所示:

3.2、運行結果
本地查看
推送此腳本到ESP32之后,設備上列印光強度值,同時將相關的光強度值上傳到云端,并且當光強度大于1000,打開LED燈;當光強度小于1000,關閉LED燈,如下日志所示:
>>> execfile("/data/pyamp/main.py")
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
('192.168.0.105', '255.255.255.0', '192.168.0.1', '192.168.0.1')
sleep for 1 s
establish tcp connection with server(host='a1zxKgAV78Z.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443])
tcp_connect: can only connect from state CLOSED
success to establish tcp, fd=54
物聯網平臺連接成功
sleep for 2s
photoresistor init finished
The lightness is: 571
system first come
亮度:571
The lightness is: 926
no need report
亮度:926
The lightness is: 577
no need report
亮度:577
到此,智慧路燈系統案例就已經完成了,如果想要學習智慧路燈案例更詳細的操作步驟,請參考“智慧路燈系統詳解”中的說明,
如果將光強度傳感器 改為 人體紅外傳感器,也可用于地下室哦,檢測到有人才開燈,人離開一段時間后熄滅只保留應急燈,就可以節省非常多的電能了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417146.html
標籤:AI
下一篇:pandas 高級
