林冬婷,張澤龍,張彬,薛秀云,姚壯潤,韓若桐
(華南農業大學電子工程學院,廣州510642)
近幾年來,隨著我國農業種植結構的調整和不斷完善,果樹的種植面積也在日益擴大[1]。在果園管理的過程中,實時有效地采集果園的光照、溫度、濕度等環境因子,對果樹的生長發育和果園的生長管理有著重要的影響。傳統的人工采集數據,需要投入大量的人力資源和時間,到園區內手工采集,然后數據經過整理進行傳遞,不僅費時費力,采集到的數據還存在滯后性,管理者不能及時掌握果園環境情況,會影響果樹的正常生長[2]。果園信息單純依靠人工采集難度大,效率低,成本高難以實現長期有效的監測管理,更難以實現果園智能化精細管理。因此建立果園環境信息遠程實時監測系統,及時有效地獲取果園環境信息,對提高果園產量和果品品質均有重要的作用[3]。
為了實現果園環境信息的實時監測,本設計基于STM32 微處理器,結合濕度傳感器FC-28、溫度傳感器DS18B2,光照傳感器BH1705,實現果園環境信息的采集與處理,通過Wi-Fi 芯片ESP8266 與網絡服務器實現數據的轉接,最后通過電腦Web 網頁的設計和手機微信小程序遠程、實時地得到果園的濕度、溫度和光照等環境信息。
本系統主要由信息采集、網絡通信、服務器、客戶端組成。信息采集部分由土壤濕度傳感器,光照傳感器、溫度傳感器采集果園信息,交由主控芯片STM32處理轉換,并通過ESP8266 由Wi-Fi 路由器將數據上傳至網絡服務器,用戶可以通過手機訪問Web 網頁遠程、實時查看果園的土壤濕度、環境溫度、光照強度等信息,系統整個框架如圖1 所示。
(1)信息采集硬件設計
該系統信息采集硬件部分由STM32 微處理器、土壤濕度傳感器、溫度傳感器、光照強度傳感器組成,系統信息采集電路圖如圖2 所示。
土壤濕度傳感器FC-28 是利用土壤濕度不一樣時導致傳感器的電阻值發生變化,由此得出土壤的濕度[4]。當土壤濕度很低時,電阻非常大,模擬信號AQ 輸出值就比較大。反之,當土壤濕度很高時,則電阻非常小,模擬信號AQ 輸出值就比較小[5]。

圖1 系統總體框架圖

圖2 系統信息采集電路圖
Dallas 半導體公司的數字化溫度傳感器DS1820是世界上第一片支持“一線總線”接口的溫度傳感器。DS18B20 數字溫度傳感器提供9-Bit 到12-Bit 的攝氏溫度測量精度。DS18B20 在與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20 的雙向通信。
光照傳感器模塊采用由半導體制造商ROHM 開發的BH1705 芯片。芯片工作電壓3.3V,內置16 位AD 轉換器,使用I2C 總線接口進行數據通信,實現高精度的光照強度值的直接輸出。
STM32 是整個系統信息采集的核心部分。土壤濕度傳感器、溫度傳感器、光照強度傳感器所采集到的果園信息數據會發送到主控芯片STM32,由STM32 進行數據轉換,再把轉換后的數據發送給Wi-Fi 芯片ESP8266。
在設備上電之后,開始配置時鐘和引腳進行初始化。光照強度傳感器使用I2C 通信協議,直接操作STM32 的I/O 口進行模擬I2C 操作。土壤濕度傳感器輸出模擬信號,通過STM32 內置ADC1 進行讀取。溫度傳感器使用單線通信,在STM32 發指令時將引腳配置成推挽輸出模式,在接收數據時引腳配置成浮空輸入模式。STM32 的UART2 與ESP8266 的UART0 相連進行串口通信,STM32 把要上傳到Web 服務器的數據通過串口通信交給ESP8266,由它通過Wi-Fi 上傳至網絡服務器。同樣地,當服務器要向STM32 發送指令時先把指令信號發送給ESP8266,再由它通過串口通信發送給STM32。ESP8266 通過串口發出數據就會觸發STM32 的中斷函數,STM32 接收數據保存并設置接收標志位。STM32 引腳配置如表1 所示。

表1 STM32 引腳配置表
(2)信息采集軟件設計
程序在初始化后就進入循環,若接收標志位被設置,則會對所接收數據進行解析,若數據中包括控制器的指令則會執行相對應的指令并上傳當前控制器的狀態,若不含指令則不做操作,最后清除接收標志并繼續下一個循環周期。若在循環周期里接收標志位沒被設置,則會啟動傳感器采集數據并把采集到的數據轉換,STM32 把轉換后的數據發送到UART2,即把所需要上傳的數據交給ESP8266。STM32 控制系統軟件程序流程圖如圖3 所示。
(1)WebSocket 協議
HTTP 協議是由客戶端向服務器發出請求,服務器接收請求后做響應。Web 網頁客戶端要實時得到果園信息,就必須不斷地在每一段時間(如500ms)發出GET 請求,得到服務器響應后刷新頁面,即HTTP 輪詢。果園信息數據同樣通過類似HTTP 輪詢的方式,不斷地向服務器發出POST 請求,將最新的果園信息數據上傳到服務器。

圖3 STM32控制系統軟件程序流程圖
Web 網頁的實時更新數據與設備上傳果園信息數據都是不斷地向服務器發出HTTP 請求,導致占用大量網絡資源,而且難以實現擴展部分的實時遠程控制。若使用HTTP 輪詢來實現擴展部分的實時遠程控制,設備除了發出POST 請求將果園信息數據上傳至服務器,還要再發出GET 請求得到用戶所發出的控制指令。
HTTP 輪詢已經不能滿足現本系統擴展部分對實時遠程控制的要求,故使用全雙工通信的WebSocket協議。WebSocket 協議最大的特點是可以由服務器主動向客戶端發出數據,建立WebSocket 協議連接后,服務器主動向Web 網頁發送需要更新的數據而無需由瀏覽器不斷地發出HTTP 請求,有效節省網絡資源。另一方面,擴展部分的實時遠程控制所需時間不再受限于HTTP 輪詢的時間間隔設定,更快地實現遠程控制這個擴展功能。
(2)ESP8266
ESP8266 是現市場上的主流低成本IOT 芯片,內置32 位CPU,能夠獨立運行,也可以作為從機與其他MCU 一起運行。ESP8266 支持softAP 模式、station 模式及softAP 和station 共存的模式。在本設計中,STM32 把果園信息數據處理后通過串口發送給ESP8266,由ESP8266 與路由器進行Wi-Fi 通信,把數據上傳至服務器中。ESP8266 充當一個橋梁,一端以WebSocket 協議與服務器進行通信,另一端以串口通信與STM32 進行通信,將STM32 與服務器連接起來,如圖4 所示。

圖4 ESP8266的作用
(1)NodeJS
NodeJS 是一個基于ChromeV8 引擎的JavaScript執行平臺,常用于快速構建小型網站。借助事件驅動,異步非阻塞I/O 等特性,十分適合數據密集型,I/O 密集型的應用場景。
服務器使用騰訊云主機CentOS 系統,以NodeJS作為后端語言搭建服務器。一方面,它可以把數據以網頁的形式顯現出來即建立HTTP 服務器。另一方面,它必須支持WebSocket 的連接進行數據交換即建立WebSocket 服務器。
在配置好云服務器之后,使用putty 遠程登陸,控制服務器。在服務器上安裝完NodeJS 之后,因為國內網絡的限制,不能使用npm 來安裝模塊,故還需要安裝國內鏡像版本cnpm 來代替使用。使用cnpm 可以簡單快速地安裝其他模塊如Express、mongoose、ws、pm2等模塊。
在基礎的應用程序框架之上還編寫了兩個主要腳本,與WebSocket 相關的myWebsocket.js、所有文件共用函數的user.js。myWebsocket.js 主要調用ws 模塊來編寫WebSocket 相關代碼。在編寫代碼時應該在本地使用編輯器寫好,再通過WinSCP 上傳到服務器,否則在服務器上使用vim 來編寫會相對麻煩。調試期間可在服務器上用Telnet 進行模擬,用tcpdump 進行抓包分析。
bin 啟動文件里引用了myWebsocket.js 的Web-Socket 服務器的創建,讓WebSocket 服務器共同綁定到80 端口。app.js 分配了路由文件,包括index.js、upload.js、deviceStatus.js。index.js 用于瀏覽器訪問主頁時,從數據庫里獲取數據然后渲染index.ejs 生成網頁。upload.js 用于給用戶通過HTTP 協議獲取或上傳數據,遵守RESTful 風格,通過POST 上傳數據。deviceStatus.js,通過GET 來獲取保存在數據庫里當前設備的數據。在實際調試時可以使用Linux 命令curl 來進行模擬或在Windows 下使用Postman 進行獲取與上傳的動作,以觀察實際情況。
myWebsocket.js 腳本文件實現了WebSocket 服務器的創建、WebSocket 廣播、通過WebSocket 給數據庫上傳數據以及從數據庫獲取數據四個功能。user.js 腳本使用了mongoose 模塊對數據庫進行操作,包括創建連接、創建集合、創建與讀取文檔。由于保存數據還需要準確的當地時間,所以還使用了moment 模塊來獲得當地時間。
(2)Express 框架
Web 網頁部分使用NodeJS 官方推薦使用的輕量級Web 框架Express 來搭建。Express 4.x 版本使用生成器,能快速創建應用程序框架,框架主要文件如表2所示。

表2 框架各文件的作用描述
(3)MongoDB
MongoDB 是一個基于分布式文件存儲、非關系型(NoSQL)的開源數據庫系統。可以直接存儲JSON 格式的數據以及使用JavaScript 函數進行操作。MongoDB 將數據存儲為一個文檔,文檔名為其_id 的值,數據結構由鍵值對組成。
MongoDB 的數據是以“數據庫-集合-文檔”的形式保存,數據庫方面的設計基本要求是能讀寫當前設備的狀態,每當果園信息采集系統上傳數據至服務器,都會更新數據庫stm32_nodejs 下的集合status 里的文檔_id:1 內容,儲存形式如圖5 所示。
(1)Web 網頁
Web 網頁使用HTML 與JavaScript 編寫,并使用了WeUI 樣式庫美化網頁的頁面,網頁的程序流程圖如圖6 所示。EJS 模板會先根據Mongo 數據庫里的最新果園信息數據進行頁面初始化,然后向服務器發起Web-Socket 連接請求,HTTP 通過協議轉換請求(Upgrade)轉為WebSocket 協議。Web 網頁實際效果如圖7所示。

圖5 數據的儲存形式

圖6 Web網頁程序流程圖

圖7 頁面實際效果圖
(2)擴展功能
①微信小程序
微信小程序客戶端使用wxml 進行頁面布局,結合JS 代碼具體操作。微信小程序的網絡請求必須是HTTPS 協議,所以先申請SSL 安全證書,并使用反向代理服務器Nginx 安裝部署,將HTTPS 訪問跳轉至HTTP 服務器,如圖8 所示。進行了SSL 證書安裝部署之后,Web 網頁也可以通過HTTPS 協議來訪問Web頁面。

圖8 Nginx安裝部署SSL證書
微信小程序的程序流程圖如圖9 所示,小程序的頁面初始化之后,加載數據并刷新頁面,之后進入循環,微信小程序每隔500ms 向服務器發出HTTPS 網絡請求,等接收到響應時就刷新數據,進入下一次循環。當用戶點擊LED 開關按鈕時,就會向服務器發送開關控制指令,最后由服務器向硬件發送,當硬件執行后就會將當前LED 的狀態發到服務器,即更新了數據庫里面的數據。微信小程序模擬實際效果圖如圖10 所示,界面實時刷新顯示果園的土壤濕度、溫度、以及光照強度等信息,此時開啟LED2,關閉LED1,模擬系統處于關閉狀態。

圖9 微信小程序的程序流程圖

圖10 微信小程序模擬實際效果圖
②數據可視化
數據可視化使用百度開源的可視化UI 庫Echart,一個純JavaScript 的圖表庫,可以流暢的運行在PC 移動設備上,兼容當前絕大部分瀏覽器。底層依賴輕量級的Canvas 類庫ZRender,提供直觀、生動、可交互、可高度個性化定制的數據可視化圖表。本設計先初始化圖像,向已經建立起的WebSocket 連接發出請求,得到過去一個小時的環境溫度、光照強度以及土壤濕度等果園信息數據,利用得到的數據進行分析并設置所生成的可視化圖表類型,最后生成圖像顯示在Web 網頁界面上,程序流程如圖11 所示。

圖11 Echart程序流程圖
③實時遠程控制
為了滿足遠程控制對實時性的要求,果園信息采集部分的上傳數據已經使用WebSocket 協議替代HTTP協議。為了模擬實時遠程控制,在本設計里添加兩個LED 燈以模擬開關控制,程序流程框架如圖12 所示。

圖12 實時遠程控制框架圖
實際效果如圖13 所示,在Web 網頁客戶端(微信小程序同理)點擊開啟LED1 后,網頁執行JavaScript代碼通過WebSocket 協議向服務器發出控制指令,服務器馬上將控制指令保存到數據庫的當前狀態以及歷史記錄,并通過WebSocket 廣播將控制指令發送至設備,設備接收到指令后執行指令開啟LED1,并將當前LED1 開啟、LED2 關閉的設備狀態以JSON 字符串格式發送到ESP8266,由ESP8266 通過WebSocket 協議上傳到服務器。當服務器接收到設備狀態時,將設備狀態保存至數據庫的當前狀態以及歷史記錄,并通過WebSocket 廣播發送至Web 網頁客戶端。Web 網頁客戶端從服務器取得最新設備狀態刷新頁面,LED1 顯示開啟狀態。

圖13 遠程控制實際效果圖
系統的環境信息誤差決定于本設計的硬件部分,主要受傳感器設備本身的精度所限制。系統數據上傳的傳輸速度與擴展部分的實時遠程控制受Wi-Fi 芯片的性能、當前網絡狀況、云服務器性能三者的限制。測試現場如圖14 所示。

圖14 測試現場圖
土壤濕度儀EM50 作為參考儀器,土壤濕度精度可達0.01%,范圍為0%-50%,與本設計的采集值作對比,其測試數據如表3 所示。

表3 土壤濕度測試表
溫度測量計HTC-1 作為環境溫度的參考儀器,其溫度測量精度為±1℃,與本設計的采集值作對比,其測試數據如表4 所示。

表4 溫度測試表
光照測試儀器MS6612 作為光照強度的參考儀器,其測量范圍為0-20 萬LUX,精度達0.01。LUX 與本設計的采樣值作對比,其數據測試如表5 所。

表5 光照強度測試表
在實際測試時,土壤濕度的最大誤差達到25%,本系統的土壤濕度傳感器由于性能極差,并沒有明確的性能參數,故出現大誤差屬于正常情況。解決辦法是根據實際應用場景對土壤濕度的精度要求,改用其他價格相對昂貴的土壤濕度傳感器代替。
經測試對比,溫度在25-30℃測試環境里采集精度為±0.5℃,數據正常。光照強度在2000-6000LUX 的測試環境里采集精度最大誤差為22%,光照強度的精度還待提高。
服務器壓力測試使用測試Web 服務器性能的開源工具http_load,服務器響應時間如表6 所示,測試中響應最大值9108ms,每秒響應6.4 次。服務器性能主要受購買服務器時的性能配置影響,以及數據庫的響應時間影響,性能優化時重點在于數據庫的操作。

表6 服務器響應時間測試表
本設計實現了基于STM32 的果園信息遠程監測系統,該系統利用微處理器STM32 與濕度傳感器、溫度傳感器、光照傳感器對果園環境溫度、光照強度和土壤濕度等信息進行采集與處理,上傳到服務器保存數據,用戶可使用手機微信小程序或Web 網頁進行遠程實時查看果園信息。本系統在測試環境里,土壤濕度的最大誤差達到25%,溫度的采集精度為±0.5℃,光照強度的采集精度最大誤差為22%,在硬件設備性能條件下,該誤差在正常范圍內,后續將通過改進硬件設備提高精度。此系統可應用于果園管理人員遠程監測果樹生長環境信息,為及時迅速地采取有效的干預措施提供科學依據。