,,,, ,,
(1.青島科技大學(xué) 機(jī)電工程學(xué)院,青島 266061;2.山東省高分子材料先進(jìn)制造技術(shù)重點(diǎn)實(shí)驗(yàn)室)
農(nóng)業(yè)生產(chǎn)環(huán)境復(fù)雜多變,傳統(tǒng)農(nóng)業(yè)生產(chǎn)過(guò)程對(duì)各項(xiàng)參數(shù)全憑經(jīng)驗(yàn)進(jìn)行模糊處理,農(nóng)作物的生長(zhǎng)環(huán)境參數(shù)無(wú)法實(shí)時(shí)監(jiān)測(cè)及追溯,不利于精準(zhǔn)農(nóng)業(yè)的推進(jìn)。盡管在實(shí)際監(jiān)測(cè)工作中已有很多環(huán)境參數(shù)監(jiān)測(cè)系統(tǒng),但此類(lèi)系統(tǒng)大多需要在各監(jiān)測(cè)節(jié)點(diǎn)之間組網(wǎng),將數(shù)據(jù)匯總至本地服務(wù)器后上傳廣域網(wǎng),需開(kāi)發(fā)配套的上位機(jī)軟件系統(tǒng)復(fù)雜,可拓展性差,不利于遠(yuǎn)程實(shí)時(shí)監(jiān)測(cè)。同時(shí),系統(tǒng)線路鋪設(shè)復(fù)雜,在濕度高、光照強(qiáng)的環(huán)境中使用極易使線路老化,縮短使用壽命[1-3]。為解決上述問(wèn)題,本文提出基于Arduino、ESP-01S和樂(lè)聯(lián)網(wǎng)的環(huán)境參數(shù)實(shí)時(shí)監(jiān)測(cè)設(shè)計(jì)方案,本方案將各監(jiān)測(cè)節(jié)點(diǎn)采集的環(huán)境參數(shù)通過(guò)數(shù)據(jù)透?jìng)髦苯由蟼鳂?lè)聯(lián)網(wǎng),結(jié)構(gòu)簡(jiǎn)單,擴(kuò)展性好。系統(tǒng)現(xiàn)已完成可靠性試驗(yàn),即將投入農(nóng)業(yè)環(huán)境參數(shù)的監(jiān)測(cè)中使用。
環(huán)境參數(shù)監(jiān)測(cè)系統(tǒng)按功能分為三部分:數(shù)據(jù)采集、數(shù)據(jù)記錄及云端上傳、數(shù)據(jù)實(shí)時(shí)監(jiān)測(cè)與導(dǎo)出,系統(tǒng)總體結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)總體結(jié)構(gòu)
① 數(shù)據(jù)采集。此部分包含溫濕度傳感器、光照強(qiáng)度傳感器及時(shí)鐘模塊,是系統(tǒng)的參數(shù)感知層,Arduino讀取傳感器傳回的電信號(hào)并將其轉(zhuǎn)換為環(huán)境參數(shù)。
② 數(shù)據(jù)記錄及實(shí)時(shí)上傳。此部分實(shí)現(xiàn)了數(shù)據(jù)存儲(chǔ)、轉(zhuǎn)發(fā),是本系統(tǒng)的核心。系統(tǒng)根據(jù)時(shí)鐘模塊提供的時(shí)鐘,每?jī)煞昼娚蟼饕淮螖?shù)據(jù)至樂(lè)聯(lián)網(wǎng)服務(wù)器,每30 min系統(tǒng)存儲(chǔ)一次數(shù)據(jù)至Micro SD卡。
③ 數(shù)據(jù)實(shí)時(shí)監(jiān)測(cè)與報(bào)警。管理員可通過(guò)觀察監(jiān)測(cè)系統(tǒng)的LCD或通過(guò)手機(jī)等互聯(lián)網(wǎng)設(shè)備獲取實(shí)時(shí)數(shù)據(jù)。樂(lè)聯(lián)網(wǎng)提供了參數(shù)超差提醒功能,用戶可以對(duì)特別關(guān)注的參數(shù)定義報(bào)警區(qū)間,一旦檢測(cè)到該參數(shù)超差,樂(lè)聯(lián)網(wǎng)會(huì)自動(dòng)發(fā)送短信或微信消息通知用戶。
① Arduino UNO R3。
② ESP-01S WiFi模塊。
③ DHT22溫濕度傳感器。
④ GY-30 光照強(qiáng)度傳感器。
⑤ LCD5110。
⑥ DS3231 時(shí)鐘模塊。
⑦ Micro SD卡模塊。
⑧ AMS1117-3.3 V降壓模塊。
硬件電路連接圖如圖2所示。
圖2 系統(tǒng)硬件構(gòu)成及連接
本系統(tǒng)的控制器選用Arduino UNO R3。 Arduino是一種開(kāi)源硬件,用戶可從開(kāi)源網(wǎng)站上獲取豐富的第三方庫(kù)和示例程序,實(shí)現(xiàn)快速開(kāi)發(fā)。Arduino UNO的微控制器核心是ATmega328,該處理器核心有14個(gè)數(shù)字輸入/輸出端口,其中6個(gè)可作為PWM輸出,6個(gè)模擬輸入端口[4]。Arduino支持標(biāo)準(zhǔn)串口通信、SPI通信以及I2C通信,這使Arduino傳感器的選擇范圍大大增加。
ESP-01S是一款低功耗UART-WiFi模組,用戶可通過(guò)AT指令將設(shè)備接入互聯(lián)網(wǎng)。該模塊使用ESP8266微型MCU作為核心芯片,模塊集成有板載天線,支持IEEE802.11 b/g/n協(xié)議,完整的 TCP/IP協(xié)議棧。Arduino通過(guò)串口與ESP-01S通信,波特率為115 200,能高效地將數(shù)據(jù)發(fā)送至互聯(lián)網(wǎng)。由于ESP-01S的工作電壓為3.3 V,本系統(tǒng)使用AMS1117-3.3 V將Arduino輸出的5 V電源降壓后為模塊供電。ESP-01S接入Arduino前,使用串口調(diào)試工具對(duì)其進(jìn)行工作模式配置:
① 將ESP-01S預(yù)設(shè)為SoftAP+Station模式,并將此配置保存到Flash。管理員如需變更WiFi名稱密碼,只需用手機(jī)接入ESP-01S發(fā)射的WiFi熱點(diǎn)進(jìn)行配置,無(wú)需再次編程燒錄,配網(wǎng)界面如圖3所示。
圖3 網(wǎng)絡(luò)配置界面
② 將ESP-01S與樂(lè)聯(lián)建立TCP透?jìng)?。透?jìng)骷赐该鱾魉?,整個(gè)傳輸過(guò)程中不對(duì)數(shù)據(jù)進(jìn)行二次加工,即不加密、不分組、不編碼等,信息原封不動(dòng)地到達(dá)數(shù)據(jù)接收端。ESP8266芯片提供了保存透?jìng)鞯紽lash指令,將透?jìng)髂J郊敖⒌腡CP連接保存在Flash區(qū)域,重新上電時(shí)自動(dòng)建立與樂(lè)聯(lián)網(wǎng)的TCP透?jìng)鬟B接。
本系統(tǒng)選用LCD5110作為參數(shù)實(shí)時(shí)顯示單元,其芯片核心為Philips PCD8544。PCD8544是低功耗CMOS LCD控制驅(qū)動(dòng)器,芯片上集成所有的顯示功能,通過(guò)SPI總線與Arduino通信,傳輸速度快。LCD5110內(nèi)置背光,擁有52×52像素分辨率,可顯示6行西文字符,單屏即可顯示所有信息[5-6]。該屏幕驅(qū)動(dòng)電壓位寬,耗電量低,價(jià)格低廉,適合作為本系統(tǒng)的顯示器。
DHT22溫濕度傳感器集成了一個(gè)NTC測(cè)溫元件和一個(gè)電容式感濕元件,與8位單片機(jī)連接,該傳感器具有響應(yīng)速度快、性價(jià)比高、抗干擾能力強(qiáng)等優(yōu)點(diǎn)。傳感器采集數(shù)據(jù)過(guò)程中調(diào)用內(nèi)部?jī)?chǔ)存的校準(zhǔn)系數(shù)進(jìn)行校正,測(cè)量精度高。傳感器采用單總線輸出,與Arduino連接簡(jiǎn)單、傳輸距離遠(yuǎn)。
GY-30數(shù)字光強(qiáng)傳感器通過(guò)I2C總線接入Arduino。I2C總線是一種多主機(jī)總線,可以靈活拓展傳感器數(shù)量,如需增加傳感器,將從端設(shè)備時(shí)鐘線、數(shù)據(jù)線連接在一起,通過(guò)訪問(wèn)不同的地址即可讀取目標(biāo)傳感器[7]。GY-30擁有接近視覺(jué)的光譜靈敏度特性,測(cè)量范圍為1~65 535 lx,受紅外線影響小。GY-30提供了三種測(cè)量模式,分別為高分辨率模式1、高分辨率模式2和低分辨率模式。本系統(tǒng)采用高分辨率模式2,此模式下采集的數(shù)據(jù)可抑制部分噪聲,數(shù)據(jù)采集精度高。
該模塊與Arduino通信方式為SPI總線通信,MISO、MOSI、SCK為SPI總線。通過(guò)文件系統(tǒng)及SPI接口驅(qū)動(dòng)程序,Arduino即可完成對(duì)Micro SD卡的文件的讀寫(xiě)。該模塊內(nèi)置電平轉(zhuǎn)換電路,接口電平支持5 V和3.3 V。 Arduino IDE提供了SD卡讀寫(xiě)庫(kù),用戶可方便的在SD卡上創(chuàng)建、讀取、更新、刪除文件。本系統(tǒng)設(shè)定的數(shù)據(jù)存儲(chǔ)間隔為30 min,存儲(chǔ)格式為逗號(hào)分隔符格式(Comma-Separated Values, CSV),用此格式存儲(chǔ)數(shù)據(jù),可直接用EXCEL打開(kāi)。
DS3231是高精度的I2C總線實(shí)時(shí)時(shí)鐘,工作溫度寬,內(nèi)部集成的溫補(bǔ)晶振和晶體使得DS3231的計(jì)時(shí)精度高達(dá)±2分鐘/年。此模塊內(nèi)置的電池可以使時(shí)鐘在斷電情況下仍保持運(yùn)行,是系統(tǒng)理想的時(shí)鐘單元。
系統(tǒng)上電后首先初始化各傳感器、時(shí)鐘、各總線及串口。同時(shí)ESP-01S自動(dòng)與樂(lè)聯(lián)平臺(tái)建立透?jìng)鬟B接,WiFi接入點(diǎn)信息及透?jìng)鹘⒚畲鎯?chǔ)于ESP-01S Flash中,無(wú)需Arduino再對(duì)其發(fā)送指令控制,節(jié)省了Arduino的內(nèi)存開(kāi)銷(xiāo),提高了程序循環(huán)效率。程序采用輪詢方式判斷是否需要上傳數(shù)據(jù)及記錄數(shù)據(jù)到Micro SD卡。程序流程圖如圖4所示。
圖4 程序流程圖
本系統(tǒng)有兩個(gè)關(guān)鍵子程序:
① 向服務(wù)器發(fā)送數(shù)據(jù)。我們定義一個(gè)函數(shù)PostData()完成數(shù)據(jù)推送。其中,全局變量temp、humi、light分別存儲(chǔ)當(dāng)前溫度、濕度及光照強(qiáng)度數(shù)值。在數(shù)據(jù)包透?jìng)鬟^(guò)程中,要使用大量字符串,但Arduino UNO只有2 KB主存儲(chǔ)器(SRAM)空間,字符串使用過(guò)多導(dǎo)致系統(tǒng)動(dòng)態(tài)內(nèi)存不足,運(yùn)行不穩(wěn)定,本程序?qū)ψ址鎯?chǔ)進(jìn)行了優(yōu)化,將字符串存儲(chǔ)于Flash中,程序執(zhí)行時(shí)自動(dòng)從Flash中調(diào)用字符串,大大節(jié)省了內(nèi)存空間[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卡中存儲(chǔ)當(dāng)前各參數(shù)及時(shí)間。我們編寫(xiě)了函數(shù)dataLog()來(lái)完成數(shù)據(jù)存儲(chǔ),每天新建一個(gè)文件存儲(chǔ)當(dāng)天數(shù)據(jù),以日期作為文件名。程序首先改變標(biāo)志位recordFlag,避免了同一分鐘內(nèi)數(shù)據(jù)記錄多次,隨后使用逗號(hào)分隔符格式向文件寫(xiě)入表頭,最后寫(xiě)入各項(xiàng)參數(shù)。源程序如下:
void dataLog() {
recordFlag = tm.minute();
pinMode(CS_PIN, OUTPUT);
StringlogFileName;
logFileName = String(tm.month()) + "-" + String(tm.day()) + ".csv";
SD.begin(CS_PIN);
//向新創(chuàng)建的文件寫(xiě)入表頭
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();
}
數(shù)據(jù)實(shí)時(shí)監(jiān)測(cè):經(jīng)測(cè)試,環(huán)境參數(shù)上傳穩(wěn)定,無(wú)丟包。使用電腦或微信訪問(wèn)樂(lè)聯(lián)網(wǎng)即可查看各參數(shù)實(shí)時(shí)數(shù)據(jù)、歷史走勢(shì)、數(shù)據(jù)分布等,圖5給出樂(lè)聯(lián)平臺(tái)微信端實(shí)時(shí)數(shù)據(jù)查詢界面。
圖5 實(shí)時(shí)數(shù)據(jù)查詢
歷史數(shù)據(jù)導(dǎo)出:管理員可登陸樂(lè)聯(lián)平臺(tái)進(jìn)入下載歷史數(shù)據(jù)導(dǎo)出界面,選擇時(shí)間段導(dǎo)出數(shù)據(jù),也可使用讀卡器讀取本地的Micro SD卡導(dǎo)出歷史數(shù)據(jù)。本系統(tǒng)存儲(chǔ)的數(shù)據(jù)可直接在Excel中操作,管理員可利用Excel高效地對(duì)采集的環(huán)境參數(shù)進(jìn)行統(tǒng)計(jì)學(xué)分析,如圖6所示。
圖6 導(dǎo)出數(shù)據(jù)并分析
數(shù)據(jù)采集精度:本系統(tǒng)測(cè)得的環(huán)境參數(shù)值與溫濕度計(jì)、光照度計(jì)測(cè)試結(jié)果非常近似,達(dá)到了預(yù)期要求,精度完全滿足農(nóng)業(yè)監(jiān)測(cè)需求。
參考文獻(xiàn)
[1] 李巖. 基于Arduino與LabVIEW的農(nóng)作物生長(zhǎng)環(huán)境檢測(cè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 滁州:安徽科技學(xué)院,2017.
[2] 毛敏, 馬艷. 基于Arduino和Labview的蔬菜大棚溫濕度監(jiān)測(cè)系統(tǒng)[J]. 中國(guó)儀器儀表,2017(9):65-68.
[3] 朱曉雷. 基于單片機(jī)的溫室環(huán)境數(shù)據(jù)監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)[D]. 呼和浩特:內(nèi)蒙古農(nóng)業(yè)大學(xué),2015.
[4] 張亮. 輕松玩轉(zhuǎn)Arduino[M]. 北京:電子工業(yè)出版社,2016.
[5] 蒙克. Arduino編程指南:75個(gè)智能硬件程序設(shè)計(jì)技巧[M].張家進(jìn),譯. 北京:人民郵電出版社,2016.
[6] 宋楠,韓廣義. Arduino開(kāi)發(fā)從零開(kāi)始學(xué)—學(xué)電子的都玩這個(gè)[M]. 北京:清華大學(xué)出版社,2014.
[7] 馬格里斯. Arduino權(quán)威指南[M].2版.楊云坤,譯. 北京:人民郵電出版社,2015.
[8] 趙英杰. 完美圖解Arduino互動(dòng)設(shè)計(jì)入門(mén)[M]. 北京:科學(xué)出版社,2014.