冉彥中,唐明祥,楊可揚,王一煒,曹婧華
(吉林大學 a.公共計算機教學與研究中心; b.植物科學院, 長春 130062)
農業物聯網[1-2]通過對農作物生命特征、生長環境從宏觀到微觀的實時監測、跟蹤、控制,提高對農業動植物生命體本質的認知能力、農業復雜系統的調控能力和農業突發事件的處理能力,達到合理使用農業資源、降低生產成本、改善生態環境、提高農產品產量和品質的目的。對于農業種植,溫、光、水、肥、氣是最關鍵的5個因素,采用溫度精準控制、營養液精準灌溉、智能控制系統等設備和系統能保證環境始終處于適宜植物生長的狀態。
種植區內設有傳感器,可實時檢測作物的生長狀態,并反饋到中央控制室中,通過實際觀測和電腦分析就能進行適宜的環境調控。農業物聯網系統用來模擬現代化植物工廠,可快速了解現代科技及其在農業中的應用。
系統傳感器層主要由土壤濕度傳感器、空氣溫濕度傳感器、光照傳感器、CO2傳感器等各種傳感器以及arduino單片機、raspberry樹莓派卡片電腦、微型攝像頭等組成。網絡層由ENC28j60網絡模塊、路由器、串口通信等組成。應用層由Apche2服務器提供的www服務、數據庫mysql、網頁php以及控制遠程拍照的python文件等組成。農業物聯網結構如圖1所示。

圖1 農業物聯網結構
本系統主要包括:① 滴灌子系統,可根據土壤濕度、水分情況實現遠程控制或自動實時滴灌;② 光照子系統,可根據光照情況,實現開燈自動補光;③ 通風子系統,可根據空氣溫濕度,實現自動排風換氣;④ 監控子系統,用樹莓派攝像頭監控農作物生長情況。
Arduino[3-5]是源于意大利的開源硬件開發平臺,基于該平臺可快速搭建出具有各種實用功能的電子電路。Arduino單片機是采用USB接口的核心電路板,與電腦連接,其處理器核心是ATmega328,包括14個數字輸入輸出IO(其中6個可提供PWM輸出)、6個模擬輸入IO、1個16 MHz晶體振蕩器、1個電源插座和1個復位按鍵。經過AD采樣對模擬電壓數字化,以IIC/串口通信的形式傳遞給Arduino單片機,在Arduino IDE環境里編寫程序進行編譯,然后下載到Arduino單片機里,以保證其系統工作。Arduino的硬件、軟件都是開源的,不但可以連接傳感器,還可以連接執行器、控制器。基于這些特點,選用該單片機作為前端數據采集的處理器。
Raspberry樹莓派作為一個移動平臺,是基于ARM的微型電腦主板,以SD/MicroSD卡為內存硬盤,卡片主板周圍有1/2/4個USB接口和1個10/100 以太網接口,可連接鍵盤、鼠標和網線,同時擁有視頻模擬信號的電視輸出接口和HDMI高清視頻輸出接口,但沒有輸出的顯示器,可以通過連接在電視屏幕或計算機的顯示器上進行設置。以上部件全部整合在一塊主板上,具備PC的基本功能。其上裝有Linux操作系統、python編程環境,也可以安裝當前流行的Tensorflow深度學習框架,搭建人工智能學習的環境,作為移動式智能終端實現對象檢測、物體識別等功能或作為網絡節點充當網絡服務器進行網絡存儲。
網絡控制器ENC28J60在其內部集成了MAC層和PHY層,支持10 Mbps的全雙工網絡通信。ENC28J60在主機之間或主機與從機之間采用SPI[6-7]串行通信,訪問方式采用瀏覽器訪問,故ENC28J60網絡模塊非常適合用于小型嵌入式設備,是嵌入式網絡系統的首選芯片。主控制器與網絡適配器之間通過中斷的方式進行通信,完成數據的發送與接收。
介紹了3種主要的電子設備的特點,并給出了系統的電路設計圖[8-11],如圖2所示。
圖2中,使用光照、土壤濕度等傳感器連接單片機Arduino的A0、A1、A2、A3等模擬量接口,空氣溫、濕度傳感器連接數字IO口,分別對環境數據的中光照強度、土壤濕度、空氣溫濕度等進行采集。經過AD采樣對模擬電壓數字化,以IIC/串口通信的形式傳遞給Arduino單片機后,單片機以USB串口的形式將數據轉發給Raspberry Pi3上的mysql數據庫進行存儲。另外,所采集的數據通過連接的ENC286J60網絡模塊,在其上設立供網絡用戶訪問的Web站點,且連接到路由器上的信號通過有線或無線方式傳輸,在局域網或互聯網上能實時看到環境的數據。Arduino單片機里編寫固化程序,可以根據閾值自動補光、通風、開啟水泵等,即程序向Arduino的數字IO口3、4、5、6等寫HIGH、LOW電平控制繼電器的閉合,從而控制負載,也可以通過網絡訪問web站點網頁手動控制負載設備。控制系統具體實物如圖3所示。

圖2 農業物聯網系統電路

圖3 控制系統具體實物
軟件開發環境采用arduinoIDE環境。raspberry樹莓派中采用PHP編寫網頁,視頻流的控制采用python編寫。軟件系統里數據流向主要有兩條路徑:各個傳感器采集的數據匯總到arduino后,一是通過USB接口傳給raspberry,數據存儲于數據庫,以網頁的形式供用戶瀏覽,樹莓派上的微型攝像頭實時抓拍作物照片或視頻流,通過網絡遠程觀看作物生長狀態;二是連接到ENC28j60網絡模塊,在其上面建立了一個Web站點,通過路由器以及免費的物聯網平臺進行域名解析,可以遠程進行負載設備的開啟或關閉以及實時顯示生長環境的數據。手機端采用App inventor的編程環境。
根據DHT11芯片設計的獨特結構設計傳感器讀取算法,數據采集算法如圖4所示。

圖4 數據采集算法
DHT11的Data數據引腳置高或低操作,準確延時后等待傳感器相應,之后對數據進行移位操作,最終讀取傳感器數據。通過不斷遍歷該流程分別讀取傳感器中環境的溫度整數值、濕度整數值,最終釋放總線。還設計了土壤濕度、光照強度等采集算法設計。
DHT11[12-14]溫濕度傳感器數據采集實現部分代碼如下:
#include
//引用庫文件
#include "DHT11.h"
//引用庫文件
int ReceiveByte=0;
//申請整形變量
DHT11 myDHT11(7);
//數字IO口7輸入
void setup()
{
Serial.begin(9600);
//設置通訊的波特率為9600
Serial.println("try to try!");
//發送的內容
}
void loop()
myDHT11.DHT11_Read();
//讀取溫濕度值
{Serial.print(99,DEC);
//發送識別碼
Serial.println(myDHT11.TEM_
Buffer_Int);
delay(1000);
//延時1m
Serial.print(98,DEC);
Serial.println(myDHT11.HUMI_Buff
er_Int);
break;
}
……
實測濕度在一定時間內幾乎無變化,因此僅畫出了溫度變化的曲線,如圖5所示。

圖5 溫度變化曲線
ENC28j60[15-17]是帶有SPI接口的獨立以太網網絡設備,它集成了MAC、TPHY層,其速度可達10 Mb/s,且兼容IEEE 802.3。在使用ENC28j60時,采用SPI通信協議。SPI(serial peripheral interface)工作方式采取主從模式,通常1個主設備可以連接1個或多個從設備。MISO引腳:主設備數據輸入,從設備數據輸出;MOSI引腳:主設備數據輸出,從設備數據輸入;SCLK引腳:時鐘信號引腳,其信號由主設備產生;SS引腳:從設備EN信號,由主設備控制。這個信號可以是SPI外設的一部分,也可用GPIO引腳實現。在以太網網絡中很多MCU集成了MAC控制器,MAC控制器作為鏈路層協議控制器連接外部以太網PHY(端口物理層),以太網中MAC控制器利用MII訪問PHY,用RJ-45接口外接水晶頭,接入網線連接到外網中就可完成數據交換。MAC即media access control,是媒體訪問控制子層協議。MII是媒體獨立接口,它是IEEE-802.3定義的以太網行業標準,包括1個數據接口以及1個AC和PHY之間的管理接口,PHY是物理接口收發器。ENC286j60結構如圖6所示。Arduino與ENC286j60連接引腳對應接線如表1所示。

圖6 ENC28j60結構

ENC28J60模塊ARDUINO單片機VCC 5 V/3.3 VGND GNDRESETRESETSS10MOSI 11MISO12SCK13
利用ENC28J60就可以做簡單Web服務器,提供www服務,網頁的編寫使用HTML語言,在ArduinoIDE環境里采用了類似C語言編寫程序。后面的示例采用C和Html混合編程,然后編譯、上傳到單片機,既可讀取傳感器的數據,又可使用瀏覽器訪問。HTTP協議是文本的,可以用Arduino的字符串函數管理。在局域網內瀏覽器地址欄輸入192.168.1.66就可以訪問程序的頁面,實時顯示環境的溫、濕度數據。若外網訪問,則在路由器上的路由表中添加該IP等有關設置:
#include
//引入頭文件庫
static byte mymac[]={ 0x74,0x69,0x69,0x2D,0x30,0x31 };//16進制MAC地址
static byte myip[]={ 192,168,1,66}; //自設www網站地址IP
static byte gwip[]={ 192,168,1,1 };
//網關地址
byte Ethernet::buffer[500]; //緩沖區大小
BufferFiller bfill;
……
static void ReadDHT11()
{
h=dht.readHumidity(); //
調用函數提取濕度值
t=dht.readTemperature();
//調用函數提取溫度值
}
static word homePage() {
//ReadDHT11();
bfill=ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK "
//在arduino里寫的html頁面
"Content-Type:text/html "
"Pragma:no-cache "
" "
//網頁刷新
"
//網頁上顯示溫度、濕度值,每隔一定時間刷新
return bfill.position();
}
Raspberry Pi3采用LAMP(Linux、Apache、MySQL及php)架構,它是Linux,Apache,MySQL和PHP的縮寫,可自動采集環境中的圖像數據、視頻數據,并將視頻按照一定的格式編碼存儲。在Raspberry Pi3上的操作系統上搭建VLC服務器,用它發布視頻,將實時視頻以網絡串流的方式發送到網絡上。在臺式電腦或手機終端設備上安裝VLC播放器,通過捕獲網絡中的視頻流,進行解碼后在手機上就可實時播放現場環境的視頻。要實現此功能還要在樹莓派上設置IP,通過TCP/IP協議、RTP/RTCP等協議將采集回來的視頻通過H.264編碼,同時采用RTCP協議基于UDP面向無連接網絡方式實現。該IP要添加到路由器的路由表上,在其命令行下輸入:
raspivid -o --t 0 -w 640 -h 360 -fps 25|cvlc -vvv stream:///dev/stdin --sout ′#standard{access=http,mux=ts,dst=:8090}′:demux=h264
開啟服務,實現視頻流傳遞。
系統中樹莓派python編程[18-20]定時抓取環境現場圖片的python代碼如下:
from picamera import PiCamera
from time import sleep
camera=PiCamera()
camera.start_preview()
for i in range(6):
sleep(5)camera.capture(′/home/pi/image%s.jpg′%i)//單張圖片存放
camera.stop_preview()
這個python文件在linux系統中以一個定時任務開啟執行。
捕獲環境現場視頻流的python代碼,
from picamera import PiCamera
from time import sleep
camera=PiCamera()
camera.start_preview()
camera.start_recording(′/home/pi/video.h264′)
//視頻文件存放
sleep(10)
camera.stop_recording()
camera.stop_preview()
手機端采用App inventor[21]編程環境。設計的控制負載設備APP界面如圖7所示。可以實現遠程開關燈、風扇、水泵、天窗等功能。其原理是手機聯網后,操作按鈕向單片機發送命令字符,單片機里的程序接收到字符后做出判斷,控制數字IO口高低電平輸出,從而控制繼電器。

圖7 控制APP
本文介紹了一種實現農業物聯網的方案,便于動手實踐,幫助了解農業互聯網的架構以及掌握具體的編程實現細節,其內容涉及傳感器、通信、數據庫、網絡、計算機等多學科領域方面的知識。下一步,系統將增加變頻器微調水流、根據空氣情況打開天窗一定角度等功能。還可引入人工智能模塊,根據拍攝的照片進行圖像識別,自動識別作物屬于哪個生長期或判斷是否有病蟲害,為決策提供科學依據。目前,該項目已得到初步應用。