林冬婷,張澤龍,張彬,薛秀云,姚壯潤,韓若桐
(華南農(nóng)業(yè)大學(xué)電子工程學(xué)院,廣州510642)
近幾年來,隨著我國農(nóng)業(yè)種植結(jié)構(gòu)的調(diào)整和不斷完善,果樹的種植面積也在日益擴大[1]。在果園管理的過程中,實時有效地采集果園的光照、溫度、濕度等環(huán)境因子,對果樹的生長發(fā)育和果園的生長管理有著重要的影響。傳統(tǒng)的人工采集數(shù)據(jù),需要投入大量的人力資源和時間,到園區(qū)內(nèi)手工采集,然后數(shù)據(jù)經(jīng)過整理進行傳遞,不僅費時費力,采集到的數(shù)據(jù)還存在滯后性,管理者不能及時掌握果園環(huán)境情況,會影響果樹的正常生長[2]。果園信息單純依靠人工采集難度大,效率低,成本高難以實現(xiàn)長期有效的監(jiān)測管理,更難以實現(xiàn)果園智能化精細(xì)管理。因此建立果園環(huán)境信息遠程實時監(jiān)測系統(tǒng),及時有效地獲取果園環(huán)境信息,對提高果園產(chǎn)量和果品品質(zhì)均有重要的作用[3]。
為了實現(xiàn)果園環(huán)境信息的實時監(jiān)測,本設(shè)計基于STM32 微處理器,結(jié)合濕度傳感器FC-28、溫度傳感器DS18B2,光照傳感器BH1705,實現(xiàn)果園環(huán)境信息的采集與處理,通過Wi-Fi 芯片ESP8266 與網(wǎng)絡(luò)服務(wù)器實現(xiàn)數(shù)據(jù)的轉(zhuǎn)接,最后通過電腦Web 網(wǎng)頁的設(shè)計和手機微信小程序遠程、實時地得到果園的濕度、溫度和光照等環(huán)境信息。
本系統(tǒng)主要由信息采集、網(wǎng)絡(luò)通信、服務(wù)器、客戶端組成。信息采集部分由土壤濕度傳感器,光照傳感器、溫度傳感器采集果園信息,交由主控芯片STM32處理轉(zhuǎn)換,并通過ESP8266 由Wi-Fi 路由器將數(shù)據(jù)上傳至網(wǎng)絡(luò)服務(wù)器,用戶可以通過手機訪問Web 網(wǎng)頁遠程、實時查看果園的土壤濕度、環(huán)境溫度、光照強度等信息,系統(tǒng)整個框架如圖1 所示。
(1)信息采集硬件設(shè)計
該系統(tǒng)信息采集硬件部分由STM32 微處理器、土壤濕度傳感器、溫度傳感器、光照強度傳感器組成,系統(tǒng)信息采集電路圖如圖2 所示。
土壤濕度傳感器FC-28 是利用土壤濕度不一樣時導(dǎo)致傳感器的電阻值發(fā)生變化,由此得出土壤的濕度[4]。當(dāng)土壤濕度很低時,電阻非常大,模擬信號AQ 輸出值就比較大。反之,當(dāng)土壤濕度很高時,則電阻非常小,模擬信號AQ 輸出值就比較小[5]。
圖1 系統(tǒng)總體框架圖
圖2 系統(tǒng)信息采集電路圖
Dallas 半導(dǎo)體公司的數(shù)字化溫度傳感器DS1820是世界上第一片支持“一線總線”接口的溫度傳感器。DS18B20 數(shù)字溫度傳感器提供9-Bit 到12-Bit 的攝氏溫度測量精度。DS18B20 在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20 的雙向通信。
光照傳感器模塊采用由半導(dǎo)體制造商ROHM 開發(fā)的BH1705 芯片。芯片工作電壓3.3V,內(nèi)置16 位AD 轉(zhuǎn)換器,使用I2C 總線接口進行數(shù)據(jù)通信,實現(xiàn)高精度的光照強度值的直接輸出。
STM32 是整個系統(tǒng)信息采集的核心部分。土壤濕度傳感器、溫度傳感器、光照強度傳感器所采集到的果園信息數(shù)據(jù)會發(fā)送到主控芯片STM32,由STM32 進行數(shù)據(jù)轉(zhuǎn)換,再把轉(zhuǎn)換后的數(shù)據(jù)發(fā)送給Wi-Fi 芯片ESP8266。
在設(shè)備上電之后,開始配置時鐘和引腳進行初始化。光照強度傳感器使用I2C 通信協(xié)議,直接操作STM32 的I/O 口進行模擬I2C 操作。土壤濕度傳感器輸出模擬信號,通過STM32 內(nèi)置ADC1 進行讀取。溫度傳感器使用單線通信,在STM32 發(fā)指令時將引腳配置成推挽輸出模式,在接收數(shù)據(jù)時引腳配置成浮空輸入模式。STM32 的UART2 與ESP8266 的UART0 相連進行串口通信,STM32 把要上傳到Web 服務(wù)器的數(shù)據(jù)通過串口通信交給ESP8266,由它通過Wi-Fi 上傳至網(wǎng)絡(luò)服務(wù)器。同樣地,當(dāng)服務(wù)器要向STM32 發(fā)送指令時先把指令信號發(fā)送給ESP8266,再由它通過串口通信發(fā)送給STM32。ESP8266 通過串口發(fā)出數(shù)據(jù)就會觸發(fā)STM32 的中斷函數(shù),STM32 接收數(shù)據(jù)保存并設(shè)置接收標(biāo)志位。STM32 引腳配置如表1 所示。
表1 STM32 引腳配置表
(2)信息采集軟件設(shè)計
程序在初始化后就進入循環(huán),若接收標(biāo)志位被設(shè)置,則會對所接收數(shù)據(jù)進行解析,若數(shù)據(jù)中包括控制器的指令則會執(zhí)行相對應(yīng)的指令并上傳當(dāng)前控制器的狀態(tài),若不含指令則不做操作,最后清除接收標(biāo)志并繼續(xù)下一個循環(huán)周期。若在循環(huán)周期里接收標(biāo)志位沒被設(shè)置,則會啟動傳感器采集數(shù)據(jù)并把采集到的數(shù)據(jù)轉(zhuǎn)換,STM32 把轉(zhuǎn)換后的數(shù)據(jù)發(fā)送到UART2,即把所需要上傳的數(shù)據(jù)交給ESP8266。STM32 控制系統(tǒng)軟件程序流程圖如圖3 所示。
(1)WebSocket 協(xié)議
HTTP 協(xié)議是由客戶端向服務(wù)器發(fā)出請求,服務(wù)器接收請求后做響應(yīng)。Web 網(wǎng)頁客戶端要實時得到果園信息,就必須不斷地在每一段時間(如500ms)發(fā)出GET 請求,得到服務(wù)器響應(yīng)后刷新頁面,即HTTP 輪詢。果園信息數(shù)據(jù)同樣通過類似HTTP 輪詢的方式,不斷地向服務(wù)器發(fā)出POST 請求,將最新的果園信息數(shù)據(jù)上傳到服務(wù)器。
圖3 STM32控制系統(tǒng)軟件程序流程圖
Web 網(wǎng)頁的實時更新數(shù)據(jù)與設(shè)備上傳果園信息數(shù)據(jù)都是不斷地向服務(wù)器發(fā)出HTTP 請求,導(dǎo)致占用大量網(wǎng)絡(luò)資源,而且難以實現(xiàn)擴展部分的實時遠程控制。若使用HTTP 輪詢來實現(xiàn)擴展部分的實時遠程控制,設(shè)備除了發(fā)出POST 請求將果園信息數(shù)據(jù)上傳至服務(wù)器,還要再發(fā)出GET 請求得到用戶所發(fā)出的控制指令。
HTTP 輪詢已經(jīng)不能滿足現(xiàn)本系統(tǒng)擴展部分對實時遠程控制的要求,故使用全雙工通信的WebSocket協(xié)議。WebSocket 協(xié)議最大的特點是可以由服務(wù)器主動向客戶端發(fā)出數(shù)據(jù),建立WebSocket 協(xié)議連接后,服務(wù)器主動向Web 網(wǎng)頁發(fā)送需要更新的數(shù)據(jù)而無需由瀏覽器不斷地發(fā)出HTTP 請求,有效節(jié)省網(wǎng)絡(luò)資源。另一方面,擴展部分的實時遠程控制所需時間不再受限于HTTP 輪詢的時間間隔設(shè)定,更快地實現(xiàn)遠程控制這個擴展功能。
(2)ESP8266
ESP8266 是現(xiàn)市場上的主流低成本IOT 芯片,內(nèi)置32 位CPU,能夠獨立運行,也可以作為從機與其他MCU 一起運行。ESP8266 支持softAP 模式、station 模式及softAP 和station 共存的模式。在本設(shè)計中,STM32 把果園信息數(shù)據(jù)處理后通過串口發(fā)送給ESP8266,由ESP8266 與路由器進行Wi-Fi 通信,把數(shù)據(jù)上傳至服務(wù)器中。ESP8266 充當(dāng)一個橋梁,一端以WebSocket 協(xié)議與服務(wù)器進行通信,另一端以串口通信與STM32 進行通信,將STM32 與服務(wù)器連接起來,如圖4 所示。
圖4 ESP8266的作用
(1)NodeJS
NodeJS 是一個基于ChromeV8 引擎的JavaScript執(zhí)行平臺,常用于快速構(gòu)建小型網(wǎng)站。借助事件驅(qū)動,異步非阻塞I/O 等特性,十分適合數(shù)據(jù)密集型,I/O 密集型的應(yīng)用場景。
服務(wù)器使用騰訊云主機CentOS 系統(tǒng),以NodeJS作為后端語言搭建服務(wù)器。一方面,它可以把數(shù)據(jù)以網(wǎng)頁的形式顯現(xiàn)出來即建立HTTP 服務(wù)器。另一方面,它必須支持WebSocket 的連接進行數(shù)據(jù)交換即建立WebSocket 服務(wù)器。
在配置好云服務(wù)器之后,使用putty 遠程登陸,控制服務(wù)器。在服務(wù)器上安裝完NodeJS 之后,因為國內(nèi)網(wǎng)絡(luò)的限制,不能使用npm 來安裝模塊,故還需要安裝國內(nèi)鏡像版本cnpm 來代替使用。使用cnpm 可以簡單快速地安裝其他模塊如Express、mongoose、ws、pm2等模塊。
在基礎(chǔ)的應(yīng)用程序框架之上還編寫了兩個主要腳本,與WebSocket 相關(guān)的myWebsocket.js、所有文件共用函數(shù)的user.js。myWebsocket.js 主要調(diào)用ws 模塊來編寫WebSocket 相關(guān)代碼。在編寫代碼時應(yīng)該在本地使用編輯器寫好,再通過WinSCP 上傳到服務(wù)器,否則在服務(wù)器上使用vim 來編寫會相對麻煩。調(diào)試期間可在服務(wù)器上用Telnet 進行模擬,用tcpdump 進行抓包分析。
bin 啟動文件里引用了myWebsocket.js 的Web-Socket 服務(wù)器的創(chuàng)建,讓W(xué)ebSocket 服務(wù)器共同綁定到80 端口。app.js 分配了路由文件,包括index.js、upload.js、deviceStatus.js。index.js 用于瀏覽器訪問主頁時,從數(shù)據(jù)庫里獲取數(shù)據(jù)然后渲染index.ejs 生成網(wǎng)頁。upload.js 用于給用戶通過HTTP 協(xié)議獲取或上傳數(shù)據(jù),遵守RESTful 風(fēng)格,通過POST 上傳數(shù)據(jù)。deviceStatus.js,通過GET 來獲取保存在數(shù)據(jù)庫里當(dāng)前設(shè)備的數(shù)據(jù)。在實際調(diào)試時可以使用Linux 命令curl 來進行模擬或在Windows 下使用Postman 進行獲取與上傳的動作,以觀察實際情況。
myWebsocket.js 腳本文件實現(xiàn)了WebSocket 服務(wù)器的創(chuàng)建、WebSocket 廣播、通過WebSocket 給數(shù)據(jù)庫上傳數(shù)據(jù)以及從數(shù)據(jù)庫獲取數(shù)據(jù)四個功能。user.js 腳本使用了mongoose 模塊對數(shù)據(jù)庫進行操作,包括創(chuàng)建連接、創(chuàng)建集合、創(chuàng)建與讀取文檔。由于保存數(shù)據(jù)還需要準(zhǔn)確的當(dāng)?shù)貢r間,所以還使用了moment 模塊來獲得當(dāng)?shù)貢r間。
(2)Express 框架
Web 網(wǎng)頁部分使用NodeJS 官方推薦使用的輕量級Web 框架Express 來搭建。Express 4.x 版本使用生成器,能快速創(chuàng)建應(yīng)用程序框架,框架主要文件如表2所示。
表2 框架各文件的作用描述
(3)MongoDB
MongoDB 是一個基于分布式文件存儲、非關(guān)系型(NoSQL)的開源數(shù)據(jù)庫系統(tǒng)。可以直接存儲JSON 格式的數(shù)據(jù)以及使用JavaScript 函數(shù)進行操作。MongoDB 將數(shù)據(jù)存儲為一個文檔,文檔名為其_id 的值,數(shù)據(jù)結(jié)構(gòu)由鍵值對組成。
MongoDB 的數(shù)據(jù)是以“數(shù)據(jù)庫-集合-文檔”的形式保存,數(shù)據(jù)庫方面的設(shè)計基本要求是能讀寫當(dāng)前設(shè)備的狀態(tài),每當(dāng)果園信息采集系統(tǒng)上傳數(shù)據(jù)至服務(wù)器,都會更新數(shù)據(jù)庫stm32_nodejs 下的集合status 里的文檔_id:1 內(nèi)容,儲存形式如圖5 所示。
(1)Web 網(wǎng)頁
Web 網(wǎng)頁使用HTML 與JavaScript 編寫,并使用了WeUI 樣式庫美化網(wǎng)頁的頁面,網(wǎng)頁的程序流程圖如圖6 所示。EJS 模板會先根據(jù)Mongo 數(shù)據(jù)庫里的最新果園信息數(shù)據(jù)進行頁面初始化,然后向服務(wù)器發(fā)起Web-Socket 連接請求,HTTP 通過協(xié)議轉(zhuǎn)換請求(Upgrade)轉(zhuǎn)為WebSocket 協(xié)議。Web 網(wǎng)頁實際效果如圖7所示。
圖5 數(shù)據(jù)的儲存形式
圖6 Web網(wǎng)頁程序流程圖
圖7 頁面實際效果圖
(2)擴展功能
①微信小程序
微信小程序客戶端使用wxml 進行頁面布局,結(jié)合JS 代碼具體操作。微信小程序的網(wǎng)絡(luò)請求必須是HTTPS 協(xié)議,所以先申請SSL 安全證書,并使用反向代理服務(wù)器Nginx 安裝部署,將HTTPS 訪問跳轉(zhuǎn)至HTTP 服務(wù)器,如圖8 所示。進行了SSL 證書安裝部署之后,Web 網(wǎng)頁也可以通過HTTPS 協(xié)議來訪問Web頁面。
圖8 Nginx安裝部署SSL證書
微信小程序的程序流程圖如圖9 所示,小程序的頁面初始化之后,加載數(shù)據(jù)并刷新頁面,之后進入循環(huán),微信小程序每隔500ms 向服務(wù)器發(fā)出HTTPS 網(wǎng)絡(luò)請求,等接收到響應(yīng)時就刷新數(shù)據(jù),進入下一次循環(huán)。當(dāng)用戶點擊LED 開關(guān)按鈕時,就會向服務(wù)器發(fā)送開關(guān)控制指令,最后由服務(wù)器向硬件發(fā)送,當(dāng)硬件執(zhí)行后就會將當(dāng)前LED 的狀態(tài)發(fā)到服務(wù)器,即更新了數(shù)據(jù)庫里面的數(shù)據(jù)。微信小程序模擬實際效果圖如圖10 所示,界面實時刷新顯示果園的土壤濕度、溫度、以及光照強度等信息,此時開啟LED2,關(guān)閉LED1,模擬系統(tǒng)處于關(guān)閉狀態(tài)。
圖9 微信小程序的程序流程圖
圖10 微信小程序模擬實際效果圖
②數(shù)據(jù)可視化
數(shù)據(jù)可視化使用百度開源的可視化UI 庫Echart,一個純JavaScript 的圖表庫,可以流暢的運行在PC 移動設(shè)備上,兼容當(dāng)前絕大部分瀏覽器。底層依賴輕量級的Canvas 類庫ZRender,提供直觀、生動、可交互、可高度個性化定制的數(shù)據(jù)可視化圖表。本設(shè)計先初始化圖像,向已經(jīng)建立起的WebSocket 連接發(fā)出請求,得到過去一個小時的環(huán)境溫度、光照強度以及土壤濕度等果園信息數(shù)據(jù),利用得到的數(shù)據(jù)進行分析并設(shè)置所生成的可視化圖表類型,最后生成圖像顯示在Web 網(wǎng)頁界面上,程序流程如圖11 所示。
圖11 Echart程序流程圖
③實時遠程控制
為了滿足遠程控制對實時性的要求,果園信息采集部分的上傳數(shù)據(jù)已經(jīng)使用WebSocket 協(xié)議替代HTTP協(xié)議。為了模擬實時遠程控制,在本設(shè)計里添加兩個LED 燈以模擬開關(guān)控制,程序流程框架如圖12 所示。
圖12 實時遠程控制框架圖
實際效果如圖13 所示,在Web 網(wǎng)頁客戶端(微信小程序同理)點擊開啟LED1 后,網(wǎng)頁執(zhí)行JavaScript代碼通過WebSocket 協(xié)議向服務(wù)器發(fā)出控制指令,服務(wù)器馬上將控制指令保存到數(shù)據(jù)庫的當(dāng)前狀態(tài)以及歷史記錄,并通過WebSocket 廣播將控制指令發(fā)送至設(shè)備,設(shè)備接收到指令后執(zhí)行指令開啟LED1,并將當(dāng)前LED1 開啟、LED2 關(guān)閉的設(shè)備狀態(tài)以JSON 字符串格式發(fā)送到ESP8266,由ESP8266 通過WebSocket 協(xié)議上傳到服務(wù)器。當(dāng)服務(wù)器接收到設(shè)備狀態(tài)時,將設(shè)備狀態(tài)保存至數(shù)據(jù)庫的當(dāng)前狀態(tài)以及歷史記錄,并通過WebSocket 廣播發(fā)送至Web 網(wǎng)頁客戶端。Web 網(wǎng)頁客戶端從服務(wù)器取得最新設(shè)備狀態(tài)刷新頁面,LED1 顯示開啟狀態(tài)。
圖13 遠程控制實際效果圖
系統(tǒng)的環(huán)境信息誤差決定于本設(shè)計的硬件部分,主要受傳感器設(shè)備本身的精度所限制。系統(tǒng)數(shù)據(jù)上傳的傳輸速度與擴展部分的實時遠程控制受Wi-Fi 芯片的性能、當(dāng)前網(wǎng)絡(luò)狀況、云服務(wù)器性能三者的限制。測試現(xiàn)場如圖14 所示。
圖14 測試現(xiàn)場圖
土壤濕度儀EM50 作為參考儀器,土壤濕度精度可達0.01%,范圍為0%-50%,與本設(shè)計的采集值作對比,其測試數(shù)據(jù)如表3 所示。
表3 土壤濕度測試表
溫度測量計HTC-1 作為環(huán)境溫度的參考儀器,其溫度測量精度為±1℃,與本設(shè)計的采集值作對比,其測試數(shù)據(jù)如表4 所示。
表4 溫度測試表
光照測試儀器MS6612 作為光照強度的參考儀器,其測量范圍為0-20 萬LUX,精度達0.01。LUX 與本設(shè)計的采樣值作對比,其數(shù)據(jù)測試如表5 所。
表5 光照強度測試表
在實際測試時,土壤濕度的最大誤差達到25%,本系統(tǒng)的土壤濕度傳感器由于性能極差,并沒有明確的性能參數(shù),故出現(xiàn)大誤差屬于正常情況。解決辦法是根據(jù)實際應(yīng)用場景對土壤濕度的精度要求,改用其他價格相對昂貴的土壤濕度傳感器代替。
經(jīng)測試對比,溫度在25-30℃測試環(huán)境里采集精度為±0.5℃,數(shù)據(jù)正常。光照強度在2000-6000LUX 的測試環(huán)境里采集精度最大誤差為22%,光照強度的精度還待提高。
服務(wù)器壓力測試使用測試Web 服務(wù)器性能的開源工具http_load,服務(wù)器響應(yīng)時間如表6 所示,測試中響應(yīng)最大值9108ms,每秒響應(yīng)6.4 次。服務(wù)器性能主要受購買服務(wù)器時的性能配置影響,以及數(shù)據(jù)庫的響應(yīng)時間影響,性能優(yōu)化時重點在于數(shù)據(jù)庫的操作。
表6 服務(wù)器響應(yīng)時間測試表
本設(shè)計實現(xiàn)了基于STM32 的果園信息遠程監(jiān)測系統(tǒng),該系統(tǒng)利用微處理器STM32 與濕度傳感器、溫度傳感器、光照傳感器對果園環(huán)境溫度、光照強度和土壤濕度等信息進行采集與處理,上傳到服務(wù)器保存數(shù)據(jù),用戶可使用手機微信小程序或Web 網(wǎng)頁進行遠程實時查看果園信息。本系統(tǒng)在測試環(huán)境里,土壤濕度的最大誤差達到25%,溫度的采集精度為±0.5℃,光照強度的采集精度最大誤差為22%,在硬件設(shè)備性能條件下,該誤差在正常范圍內(nèi),后續(xù)將通過改進硬件設(shè)備提高精度。此系統(tǒng)可應(yīng)用于果園管理人員遠程監(jiān)測果樹生長環(huán)境信息,為及時迅速地采取有效的干預(yù)措施提供科學(xué)依據(jù)。