,,,, ,,
(1.青島科技大學 機電工程學院,青島 266061;2.山東省高分子材料先進制造技術重點實驗室)
農業生產環境復雜多變,傳統農業生產過程對各項參數全憑經驗進行模糊處理,農作物的生長環境參數無法實時監測及追溯,不利于精準農業的推進。盡管在實際監測工作中已有很多環境參數監測系統,但此類系統大多需要在各監測節點之間組網,將數據匯總至本地服務器后上傳廣域網,需開發配套的上位機軟件系統復雜,可拓展性差,不利于遠程實時監測。同時,系統線路鋪設復雜,在濕度高、光照強的環境中使用極易使線路老化,縮短使用壽命[1-3]。為解決上述問題,本文提出基于Arduino、ESP-01S和樂聯網的環境參數實時監測設計方案,本方案將各監測節點采集的環境參數通過數據透傳直接上傳樂聯網,結構簡單,擴展性好。系統現已完成可靠性試驗,即將投入農業環境參數的監測中使用。
環境參數監測系統按功能分為三部分:數據采集、數據記錄及云端上傳、數據實時監測與導出,系統總體結構如圖1所示。

圖1 系統總體結構
① 數據采集。此部分包含溫濕度傳感器、光照強度傳感器及時鐘模塊,是系統的參數感知層,Arduino讀取傳感器傳回的電信號并將其轉換為環境參數。
② 數據記錄及實時上傳。此部分實現了數據存儲、轉發,是本系統的核心。系統根據時鐘模塊提供的時鐘,每兩分鐘上傳一次數據至樂聯網服務器,每30 min系統存儲一次數據至Micro SD卡。
③ 數據實時監測與報警。管理員可通過觀察監測系統的LCD或通過手機等互聯網設備獲取實時數據。樂聯網提供了參數超差提醒功能,用戶可以對特別關注的參數定義報警區間,一旦檢測到該參數超差,樂聯網會自動發送短信或微信消息通知用戶。
① Arduino UNO R3。
② ESP-01S WiFi模塊。
③ DHT22溫濕度傳感器。
④ GY-30 光照強度傳感器。
⑤ LCD5110。
⑥ DS3231 時鐘模塊。
⑦ Micro SD卡模塊。
⑧ AMS1117-3.3 V降壓模塊。
硬件電路連接圖如圖2所示。

圖2 系統硬件構成及連接
本系統的控制器選用Arduino UNO R3。 Arduino是一種開源硬件,用戶可從開源網站上獲取豐富的第三方庫和示例程序,實現快速開發。Arduino UNO的微控制器核心是ATmega328,該處理器核心有14個數字輸入/輸出端口,其中6個可作為PWM輸出,6個模擬輸入端口[4]。Arduino支持標準串口通信、SPI通信以及I2C通信,這使Arduino傳感器的選擇范圍大大增加。
ESP-01S是一款低功耗UART-WiFi模組,用戶可通過AT指令將設備接入互聯網。該模塊使用ESP8266微型MCU作為核心芯片,模塊集成有板載天線,支持IEEE802.11 b/g/n協議,完整的 TCP/IP協議棧。Arduino通過串口與ESP-01S通信,波特率為115 200,能高效地將數據發送至互聯網。由于ESP-01S的工作電壓為3.3 V,本系統使用AMS1117-3.3 V將Arduino輸出的5 V電源降壓后為模塊供電。ESP-01S接入Arduino前,使用串口調試工具對其進行工作模式配置:
① 將ESP-01S預設為SoftAP+Station模式,并將此配置保存到Flash。管理員如需變更WiFi名稱密碼,只需用手機接入ESP-01S發射的WiFi熱點進行配置,無需再次編程燒錄,配網界面如圖3所示。

圖3 網絡配置界面
② 將ESP-01S與樂聯建立TCP透傳。透傳即透明傳送,整個傳輸過程中不對數據進行二次加工,即不加密、不分組、不編碼等,信息原封不動地到達數據接收端。ESP8266芯片提供了保存透傳到Flash指令,將透傳模式及建立的TCP連接保存在Flash區域,重新上電時自動建立與樂聯網的TCP透傳連接。
本系統選用LCD5110作為參數實時顯示單元,其芯片核心為Philips PCD8544。PCD8544是低功耗CMOS LCD控制驅動器,芯片上集成所有的顯示功能,通過SPI總線與Arduino通信,傳輸速度快。LCD5110內置背光,擁有52×52像素分辨率,可顯示6行西文字符,單屏即可顯示所有信息[5-6]。該屏幕驅動電壓位寬,耗電量低,價格低廉,適合作為本系統的顯示器。
DHT22溫濕度傳感器集成了一個NTC測溫元件和一個電容式感濕元件,與8位單片機連接,該傳感器具有響應速度快、性價比高、抗干擾能力強等優點。傳感器采集數據過程中調用內部儲存的校準系數進行校正,測量精度高。傳感器采用單總線輸出,與Arduino連接簡單、傳輸距離遠。
GY-30數字光強傳感器通過I2C總線接入Arduino。I2C總線是一種多主機總線,可以靈活拓展傳感器數量,如需增加傳感器,將從端設備時鐘線、數據線連接在一起,通過訪問不同的地址即可讀取目標傳感器[7]。GY-30擁有接近視覺的光譜靈敏度特性,測量范圍為1~65 535 lx,受紅外線影響小。GY-30提供了三種測量模式,分別為高分辨率模式1、高分辨率模式2和低分辨率模式。本系統采用高分辨率模式2,此模式下采集的數據可抑制部分噪聲,數據采集精度高。
該模塊與Arduino通信方式為SPI總線通信,MISO、MOSI、SCK為SPI總線。通過文件系統及SPI接口驅動程序,Arduino即可完成對Micro SD卡的文件的讀寫。該模塊內置電平轉換電路,接口電平支持5 V和3.3 V。 Arduino IDE提供了SD卡讀寫庫,用戶可方便的在SD卡上創建、讀取、更新、刪除文件。本系統設定的數據存儲間隔為30 min,存儲格式為逗號分隔符格式(Comma-Separated Values, CSV),用此格式存儲數據,可直接用EXCEL打開。
DS3231是高精度的I2C總線實時時鐘,工作溫度寬,內部集成的溫補晶振和晶體使得DS3231的計時精度高達±2分鐘/年。此模塊內置的電池可以使時鐘在斷電情況下仍保持運行,是系統理想的時鐘單元。
系統上電后首先初始化各傳感器、時鐘、各總線及串口。同時ESP-01S自動與樂聯平臺建立透傳連接,WiFi接入點信息及透傳建立命令存儲于ESP-01S Flash中,無需Arduino再對其發送指令控制,節省了Arduino的內存開銷,提高了程序循環效率。程序采用輪詢方式判斷是否需要上傳數據及記錄數據到Micro SD卡。程序流程圖如圖4所示。

圖4 程序流程圖
本系統有兩個關鍵子程序:
① 向服務器發送數據。我們定義一個函數PostData()完成數據推送。其中,全局變量temp、humi、light分別存儲當前溫度、濕度及光照強度數值。在數據包透傳過程中,要使用大量字符串,但Arduino UNO只有2 KB主存儲器(SRAM)空間,字符串使用過多導致系統動態內存不足,運行不穩定,本程序對字符串存儲進行了優化,將字符串存儲于Flash中,程序執行時自動從Flash中調用字符串,大大節省了內存空間[8]。源程序如下所示:
void PostData() {
Serial.print(F("{"method":"update","gatewayNo":"01","userkey":"af5c50f620"}&^! "));
Serial.print(F("{"method":"upload","data":[{"Name":"TEMP","Value":""));
Serial.print(temp);
Serial.print(F(""},{"Name":"HUMI","Value":""));
Serial.print(humi);
Serial.print(F(""},{"Name":"LIGHT","Value":""));
Serial.print(light);
Serial.print(F(""}]}&^! "));
}
② 向Micro SD卡中存儲當前各參數及時間。我們編寫了函數dataLog()來完成數據存儲,每天新建一個文件存儲當天數據,以日期作為文件名。程序首先改變標志位recordFlag,避免了同一分鐘內數據記錄多次,隨后使用逗號分隔符格式向文件寫入表頭,最后寫入各項參數。源程序如下:
void dataLog() {
recordFlag = tm.minute();
pinMode(CS_PIN, OUTPUT);
StringlogFileName;
logFileName = String(tm.month()) + "-" + String(tm.day()) + ".csv";
SD.begin(CS_PIN);
//向新創建的文件寫入表頭
if (SD.exists(logFileName) == 0 ) {
FiledataFile = SD.open(logFileName,FILE_WRITE);
dataFile.print("DATE");
dataFile.print(F(","));
dataFile.print("Time");
dataFile.print(F(","));
dataFile.print("Humidity");
dataFile.print(F(","));
dataFile.print("Temperature");
dataFile.print(F(","));
dataFile.println("Illuminance");
dataFile.close();}
FiledataFile = SD.open(logFileName, FILE_WRITE);
dataFile.print(sDate);
dataFile.print(F(","));
sTime=String(tm.hour())+":"+String(tm.minute());
dataFile.print(sTime);
dataFile.print(F(","));
dataFile.print(humi);
dataFile.print(F(","));
dataFile.print(temp);
dataFile.print(F(","));
dataFile.println(light);
dataFile.close();
}
數據實時監測:經測試,環境參數上傳穩定,無丟包。使用電腦或微信訪問樂聯網即可查看各參數實時數據、歷史走勢、數據分布等,圖5給出樂聯平臺微信端實時數據查詢界面。

圖5 實時數據查詢
歷史數據導出:管理員可登陸樂聯平臺進入下載歷史數據導出界面,選擇時間段導出數據,也可使用讀卡器讀取本地的Micro SD卡導出歷史數據。本系統存儲的數據可直接在Excel中操作,管理員可利用Excel高效地對采集的環境參數進行統計學分析,如圖6所示。

圖6 導出數據并分析
數據采集精度:本系統測得的環境參數值與溫濕度計、光照度計測試結果非常近似,達到了預期要求,精度完全滿足農業監測需求。

參考文獻
[1] 李巖. 基于Arduino與LabVIEW的農作物生長環境檢測系統的設計與實現[D]. 滁州:安徽科技學院,2017.
[2] 毛敏, 馬艷. 基于Arduino和Labview的蔬菜大棚溫濕度監測系統[J]. 中國儀器儀表,2017(9):65-68.
[3] 朱曉雷. 基于單片機的溫室環境數據監測系統的設計[D]. 呼和浩特:內蒙古農業大學,2015.
[4] 張亮. 輕松玩轉Arduino[M]. 北京:電子工業出版社,2016.
[5] 蒙克. Arduino編程指南:75個智能硬件程序設計技巧[M].張家進,譯. 北京:人民郵電出版社,2016.
[6] 宋楠,韓廣義. Arduino開發從零開始學—學電子的都玩這個[M]. 北京:清華大學出版社,2014.
[7] 馬格里斯. Arduino權威指南[M].2版.楊云坤,譯. 北京:人民郵電出版社,2015.
[8] 趙英杰. 完美圖解Arduino互動設計入門[M]. 北京:科學出版社,2014.