簡介: 學習物聯網一段時間,做過若幹練習,但都是從練習角度出發。現在依據實際情況做了個實物,是以就有了這款智能花盆。實作根據土壤濕度進行澆水,以維持在合适水準。

主要功能:
1、收集環境資訊(土壤濕度,空氣溫濕度)上傳至阿裡物聯網平台。
2、當土壤濕度低于控制值下限時,自動澆水。
3、可以通過安卓應用,設定土壤濕度控制值範圍,以及手動澆水。
特點:
由于這次開發闆設計,加入藍牙子產品,以便配置終端的連網設定(WIFI),比過往做的練習(固定WIFI資訊),更具産品性。
這個想法是從家裡的小米攝像頭應用學習過來的,由于智能花盆是用WIFI網絡聯網,是以使用藍牙子產品進行WIFI網絡配置(SSID,PWD),開發更友善。
設計背景
土壤濕度受【灌澆程度,空氣溫濕度,日照時長,植物生長活躍度】等影響。傳統滴灌系統,即使通過定時澆灌,也不一定能夠給予植物最合适的土壤濕度環境。
設計加入土壤濕度傳感器,以擷取準确濕度,進行定量水澆灌,以確定土壤保持合适濕度。
開發闆設計
1. 系統架構示意圖
2. 智能花盆連接配接圖
3. 資料指令流向圖
說明:初次使用時,[使用者]通過[安卓終端]運作應用程式,啟動[藍牙裝置],與智能花盆的[藍牙子產品],進行配對。配對成功後,便可通過藍牙通訊,向智能花盆發送WIFI的SSID以及PWD。
采購物料清單
名稱 | 圖檔 | 數量 | 單價 | 總價 | 描述 |
---|---|---|---|---|---|
nodeMCU | | 1 | 14 | 14 | 微處理器 |
人體紅外感應 | | 1 | 3 | 3 | 傳感器 |
藍牙子產品 | | 1 | 7 | 7 | 通信子產品 |
觸摸傳感子產品 | | 2 | 1 | 2 | 傳感器 |
空氣溫濕子產品 | | 1 | 4 | 4 | 傳感器 |
面包闆 | | 3 | 2 | 6 | |
杜邦線 | | N | -- | -- | |
0.96'OLED顯示屏 | | 1 | 11 | 11 | 輸出子產品 |
電容式土壤濕度子產品 | | 1 | 8 | 8 | 傳感器 |
直流潛水泵 | | 1 | 3 | 3 | 執行裝置 |
自制花灑 | | 1 | -- | -- | 自制.。。。 執行裝置 |
單相繼電器 | | 1 | 4 | 4 | 執行裝置 |
薄荷 | | 1 | 4 | 4 | 堅強的薄荷一盆 |
合計 | 72 |
物聯網平台
建立物模型
上圖說明:屬性中的 土壤濕度以及空氣溫濕控限,是浮點型[上限]與[下限]組成的結構體。實際開發中,僅用到土壤濕度下限,以觸發澆水。
服務說明:
澆水服務:響應平台進行澆水,主要用于手動澆水。
裝置參數設定:響應平台進行參數設定,主要用于設定終端運作參數[土壤濕度下限,澆水量]
上傳資料:響應平台,即時進行環境資訊上傳。
事件說明:
澆水事件:停用了,改用澆水時終端更新屬性[澆水記錄],使用0,1區分手動與自動澆水。
代碼部分
代碼就不貼出來了,僅僅把需要引用的包以及注意事項的作個描述。
一、裝置終端開發
說明:使用ArduinoIDE 對nodeMCU 進行代碼編寫以及燒寫
引用包說明:均在庫管理器查詢即可
終端功能說明:
1、 藍牙通訊:
裝置與安卓應用APP比對,以及WIFI網絡配置
邏輯說明
● 先通過USB轉序列槽方法,對藍牙子產品進行初始化,比如
主從模式:主 波特率:9600
藍牙名稱:Smart_Pot 配對碼:8888
● 定義屬于自己一套的指令頭,指令關鍵字進行通信,以保障通信準确性,私密性。比如
指令頭:+SP:
指令關鍵字:ConnectIOT(連接配接終端)
SSID:(WIFI的 SSID内容頭) PWD:(WIFI的PWD内容頭)等等
● 連接配接成功後,終端會把燒錄好的三元組資訊向安卓終端發送并儲存,以確定應用與裝置之間 一對一的管理關系。
2、 WIFI聯網:
智能花盆通電啟動或重新開機後,自動聯網。
邏輯說明:
● 通過藍牙接收到的WIFI配網資訊(SSID,PWD)進行聯網,聯網成功後,ESP8266将自動保 存SSID以及PWD資訊,即使斷電亦不會丢失。
● 通過WIFI包提供的網絡狀态檢查指令,在WIFI斷網時進行重新連接配接,實作WIFI斷網重連。
3、 資料采集及上傳物聯網平台:空氣溫度,濕度,土壤濕度
每15分鐘,上傳資料至物聯網平台
邏輯說明:
● 空氣溫濕度直接改寫Arduino提供的示例即可。
● 土壤濕度傳感器,需要在純水以及空氣中進行一次濕度資料擷取濕度100%~0%的電壓範圍。
● 土壤濕度除了每15分鐘上傳一次外,在達到控制下限澆水時,馬上上傳一次,以擷取準确的下限觸發時間點。
4、 LED顯示屏:亮屏30秒後,自動關閉,作節能作用
當人靠近智能花盆時(1.5米左右),經由[人體紅外傳感器]感應,自動點亮螢幕。
資訊顯示内容:
環境資訊:土壤濕度(%),空氣溫度(℃),空氣濕度(%)
裝置狀态:WIFI網絡狀态(WIFI_OK),資料送出狀态(POSTed)
5、 觸摸按鍵
按鍵A:點亮螢幕
按鍵B:手動上傳資料
6、 澆水
自動執行:
當檢測到的實時土壤濕度低于控制下限時,自動按定義澆水量進行澆水。
邏輯說明:
● 每次自動澆水至少相隔15分鐘。避免澆水後土壤濕度未及時提升,在下一次濕度下限判斷時,造成連續觸發澆水。
● 實質控制範圍是大于 0 少于等于控制下限,因為有時接觸不良的時候,會出現測量土壤濕度為0,造成誤澆水,影響運作。考慮實際運作時,不可能出現土壤濕度為 0 的情況,是以作這個邏輯判斷。
手動執行:
響應來自平台的澆水服務調用。
7、 運作參數維護
響應來自平台的屬性修改
土壤濕度控制下限 以及 澆水量
邏輯說明:
對屬性修改完成後,通過 nodeMCU 的 SPIFFS 進行數值儲存持久化。以 確定智能花盆在斷電重新開機後,或者斷網時,仍然能以最後配置的屬性運作。
二、背景開發
1、在阿裡租用一台ECS雲伺服器。
2、使用ASP.NET MVC3 開發一個背景,通過TCP/IP以處理安卓終端與阿裡物聯網平台資料互動
相關的開發指引,阿裡這邊相當詳細,不作過多描述。
三、安卓開發
功能說明:
1、藍牙配置WIFI
a) 通過安卓裝置藍牙子產品與智能花盆藍牙子產品比對
邏輯說明:大抵邏輯在上面裝置終端已經說明,僅作簡單描述了
安卓掃描周邊藍牙裝置,并篩選出指定裝置名的清單。通過應用配對碼連接配接完成後,儲存來自終端裝置的三元組資訊。憑此三元組資訊與平台互動,以通路及控制終端裝置。完成應用與終端比對的工作。
連接配接藍牙時,安卓預設是彈出框,讓使用者輸入配對碼。但是這個配對碼是用于保護終端裝置藍牙通路安全性,是以需要進行代碼隐藏彈出框,并自動配對碼發送。
儲存本地的三元組資訊,目前是以明文儲存,進一步開發時,應該是需要加密儲存。
b) 發送需要連接配接WIFI網絡的SSID以及PWD
邏輯說明:大抵邏輯在上面裝置終端已經說明,僅作簡單描述了
安卓應用對終端裝置的操作,必須按定義的指令頭及指令關鍵字進行。
目前發送SSID以及PWD,都是需要手動填寫,其實是可以自動發送SSID以及PWD的,但是我未能找到這方面的代碼。
2、智能花盆控制端
a) 運作狀态顯示:定時重新整理由花盆每15分鐘上傳到平台的運作資料
土壤濕度 空氣溫度 空氣濕度
b) 運作參數設定:
● 土壤濕度下限 機關:百分比
● 澆水量 機關:秒
c) 更新環境資訊
邏輯說明
由安卓終端通過背景執行物聯網平台接口,調用智能花盆服務,即時上傳運作資料到物聯網平台
d) 澆水
邏輯說明
邏輯上同,僅調用智能花盆不同服務實作手動即時澆水。
四、整體運作(所在地:廣州)
代碼部分其實好早已經完成開發,但是為了擷取穩定資料,花了很長很長時間調試
上圖說明:整月的運作情況已經逐漸趨向穩定,其實從12月開始,已經在試運作收集資料,但是遇到大坑,後續會提到,直到1月才有令我産生信心的資料。
上圖說明:放大1月下半月資料,已經趨向穩定,檢測土壤濕度達下限時(60%),自動澆水,能看到土壤濕度拉高的情況。而1-21資料出現異常資料,是由于家裡出現停電造成沒法自動澆水,進而超過監控土壤濕度下限。
運作參數:土壤濕度下限:60% 澆水量:4.5秒
上圖說明:澆水記錄(0:自動澆水,1:手動澆水)
上圖說明:空氣溫度與空氣濕度曆史資料
總結
遇到的大坑:
一、關于傳感器:
這是第一大坑,千萬别選購左圖這邊土壤濕度傳感器,我已經玩壞3-4個,基本上2天就腐蝕掉引腳的金屬塗層,由于這種傳感器的問題,白花了我1個月的時候找原因,都快到要放棄這次設計的地步了,最後才發現是傳感器問題。後更換新款的傳感器,目前約1月餘,傳感器尚算穩定使用。
二、關于與阿裡物聯網互動資料,在ArudinoIDE對nodeMCU進行代碼燒寫時,當需要進行互動時,會出現異常。
最終在demo版塊的前輩文章中找到方法,十分感謝。
https://dev.iot.aliyun.com/demo/detail/169050
附上前輩文章連結
具體修改内容
AliyunMqttArduino庫依賴于Crypto庫和PubSubClient庫,用于MQTT連接配接
修改了PubSubClient庫的MQTT最大包長為256和心跳頻率為60s
三、關于LED顯示屏
網上大多Arduino應用LED案例,大多引用U8glib.h 包,但是實際燒錄到nodeMCU的時候,會報錯,直到我改用U8g2lib.h 包。
四、關于藍牙子產品
由于藍牙子產品,占用nodeMCU的RX/TX引腳,是以在代碼燒寫時,先不要給藍牙子產品上電,否則會出現燒寫不上的情況。
不足之處:
一、傳感器取值目前為瞬間值,應該記錄若幹值,去除最高,最底,取平均值為妥。
二、目前開發闆,使用杜邦線連接配接傳感器,偶爾會接觸不良,後續應該焊到闆子上。
三、上圖儲水罐應該加個水位傳感器,有助提示進行加水。
四、由于本人對園藝并不熟悉,沒法真正掌握植物的合适土壤濕度範圍。後續能對安卓進一步開發,通過拍照上傳至智能服務平台(Bai度AI -- 植物識别)進行植株識别,傳回植物名稱,以及大資料提供光照時長,溫度濕度建議等等,更完善系統。
未能解決問題:
當通過筆記本USB口給nodeMCU供電的時候,通電即運作。但是通過插座供電時,總是需要按一次nodeMCU上的RST按鈕才運作,向大家請教這個問題。
總結:
從穩定的運作資料能看到,自動澆水的間隔并沒有絕對固定,可以對比當天的空氣溫濕度,反應植物的生長旺盛情況對土壤濕度的影響,亦展現智能花盆基于實際土壤濕度進行澆水的實際性。
過往已經做過NB-IoT的練習,有空會造一個Arduino + 移遠BC26的版本。
最後的最後,至2020-2-1,智能花盆運作2個月,未曾人工澆水,薄荷~還活着。
本人首次發文分享,不足不完善之處,萬請指出,感謝。