吳鳳嬌,孫培欽,龍 燕,王 斌
(1. 西北農(nóng)林科技大學(xué)水利與建筑工程學(xué)院,陜西 楊凌 712100;2. 西安交通大學(xué)電氣工程學(xué)院, 陜西 西安 710049;3. 西北農(nóng)林科技大學(xué)機(jī)械與電子工程學(xué)院,陜西 楊凌 712100)
農(nóng)業(yè)一直是我國(guó)賴(lài)以生存的根基行業(yè),隨著目前世界水資源短缺,且我國(guó)人均水資源占有率過(guò)低、水資源利用率低,農(nóng)業(yè)用水面臨空前巨大的壓力[1,2]。節(jié)水灌溉從20世紀(jì)早期就已經(jīng)開(kāi)始發(fā)展,我國(guó)引入較晚,而且設(shè)備的發(fā)展步伐一直遠(yuǎn)遠(yuǎn)落后其他先進(jìn)國(guó)家[3]。目前,我國(guó)節(jié)水灌溉農(nóng)業(yè)不乏滴灌[4]、噴灌[5]等節(jié)水方式,甚至也有一些自動(dòng)化控制的灌溉設(shè)備,但都存在些許不足。如:沒(méi)有采用實(shí)時(shí)監(jiān)測(cè)土壤水分含量,僅進(jìn)行定時(shí)灌溉,造成水源浪費(fèi);農(nóng)田布線十分復(fù)雜且不穩(wěn)定,嚴(yán)重制約了設(shè)備的普及;大部分自動(dòng)化設(shè)備昂貴且操作復(fù)雜,不利于廣大農(nóng)民的使用和學(xué)習(xí)。
所以,節(jié)水灌溉技術(shù)的研究從未停止,特別是在利用無(wú)線ZigBee技術(shù)[6-8]與自動(dòng)灌溉[9,10]相結(jié)合的方面有了很大的進(jìn)步。然而,上述系統(tǒng)存在明顯不足:①無(wú)線數(shù)據(jù)傳輸距離短且信號(hào)易受干擾;②數(shù)據(jù)信號(hào)集中式處理,容易造成系統(tǒng)瓶頸,難以進(jìn)一步提高系統(tǒng)性能。這些因素較大地限制了研究成果在生產(chǎn)實(shí)際中的推廣應(yīng)用。本文是結(jié)合了研究學(xué)者們的寶貴經(jīng)驗(yàn)和發(fā)現(xiàn),并加以自我的研究和探索研制的一款專(zhuān)門(mén)針對(duì)普通農(nóng)民使用的基于C#和Access數(shù)據(jù)庫(kù)的無(wú)線精準(zhǔn)灌溉系統(tǒng)軟件?;趯?duì)CC2530功率放大和無(wú)線傳感器網(wǎng)絡(luò),系統(tǒng)分布式運(yùn)行,具有魯棒性強(qiáng)、易于擴(kuò)充和伸縮性良好等優(yōu)點(diǎn)。
系統(tǒng)的總體框圖如圖1所示。系統(tǒng)運(yùn)行首先由用戶在上位機(jī)界面輸入所需維持的土壤墑情范圍和監(jiān)控的溫度范圍,這些數(shù)據(jù)會(huì)經(jīng)由串口通信與無(wú)線CC2530模塊交互,兩塊無(wú)線CC2530完成上、下位機(jī)之間的數(shù)據(jù)通信。在下位機(jī)部分中,將所需監(jiān)測(cè)的土壤中布上土壤墑情傳感器MS10,其為一個(gè)輸出為電壓信號(hào)的傳感器。其輸出信號(hào)經(jīng)過(guò)單片機(jī)的AD模塊進(jìn)行采集,單片機(jī)將信號(hào)轉(zhuǎn)化后將該數(shù)值實(shí)時(shí)顯示在LCD1602屏幕上面。同時(shí),該數(shù)值會(huì)與此前上位機(jī)無(wú)線傳入下位機(jī)的數(shù)據(jù)進(jìn)行比較,并驅(qū)動(dòng)相應(yīng)的執(zhí)行機(jī)構(gòu)或者報(bào)警,以保證土壤墑情維持在一定范圍;另外,下位機(jī)采集到的數(shù)據(jù)會(huì)經(jīng)無(wú)線CC2530模塊傳到上位機(jī)界面中進(jìn)行顯示并儲(chǔ)存,方便用戶實(shí)時(shí)監(jiān)控和查看。
圖1 系統(tǒng)的總體框圖
基于C#和Access數(shù)據(jù)庫(kù)的無(wú)線精準(zhǔn)灌溉系統(tǒng)軟件流程圖如圖2所示。首先,用戶從電腦登錄上位機(jī)軟件并給下位機(jī)上電,整個(gè)系統(tǒng)為啟動(dòng)狀態(tài)。然后,用戶在上位機(jī)軟件的監(jiān)控主界面中打開(kāi)串口通道,并設(shè)置相應(yīng)的串口參數(shù),之后用戶將自己所需設(shè)定的上、下限值輸入相應(yīng)的文本框中,點(diǎn)擊確認(rèn)之后數(shù)據(jù)便會(huì)經(jīng)由串口和無(wú)線通信通道傳送至單片機(jī)中,單片機(jī)接收這些數(shù)據(jù)并存儲(chǔ)且顯示這些設(shè)定數(shù)據(jù)在LCD1602屏幕上。用戶若想使下位機(jī)開(kāi)始監(jiān)控,需從上位機(jī)軟件中的監(jiān)控主界面上按下開(kāi)啟監(jiān)控按鈕,下位機(jī)接收命令后開(kāi)啟定時(shí)采集并將采集到的數(shù)據(jù)實(shí)時(shí)顯示在LCD1602屏幕上。同時(shí),采集到的數(shù)據(jù)會(huì)與之前傳送至單片機(jī)中的設(shè)定數(shù)據(jù)進(jìn)行比較,從而判斷是否驅(qū)動(dòng)執(zhí)行機(jī)構(gòu)和報(bào)警裝置而且采集到的數(shù)據(jù)也會(huì)經(jīng)由串口和無(wú)線通信通道發(fā)送回上位機(jī)監(jiān)控主界面中供用戶觀察并儲(chǔ)存。
圖2 無(wú)線精準(zhǔn)灌溉系統(tǒng)軟件流程圖
若用戶想停止監(jiān)控或關(guān)閉系統(tǒng),可在上位機(jī)監(jiān)控主界面中點(diǎn)擊停止監(jiān)控,此時(shí)下位機(jī)便會(huì)停止,如圖3所示。若想繼續(xù)可再次點(diǎn)擊開(kāi)啟監(jiān)控即可,若不想則點(diǎn)擊退出系統(tǒng)即可關(guān)閉系統(tǒng)。
圖3 停止監(jiān)控流程圖
下位機(jī)中主要的關(guān)鍵程序部分是定時(shí)中斷采集和串口接收中斷函數(shù)。在定時(shí)中斷采集中分別涉及兩個(gè)部分,一部分是溫度傳感器的數(shù)據(jù)采集,另一部分是對(duì)土壤墑情傳感器MS10的AD數(shù)模轉(zhuǎn)換函數(shù),兩者的數(shù)據(jù)處理完之后,數(shù)據(jù)會(huì)儲(chǔ)存在兩個(gè)全局變量中并退出定時(shí)采集中斷,然后回至主函數(shù)進(jìn)行實(shí)時(shí)顯示和判斷比較數(shù)據(jù)以及發(fā)送回上位機(jī)主界面。下位機(jī)定時(shí)采集中斷函數(shù)以及串口接收中斷函數(shù)如下:
void exter1() interrupt 1 ∥定時(shí)采集中斷
{
ES=0; ∥關(guān)閉串口中斷
TR0=0;∥關(guān)閉定時(shí)器0
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;∥重裝初值
tt++;
if(tt==1000)∥設(shè)定2秒采集一次
{
ReadTemperature();∥采集溫度
Data_is_read=1; ∥溫度采集完成標(biāo)志
ISendByte(PCF8591,0x02);
ADC_Data=IRcvByte(PCF8591)*330/256; ∥AD數(shù)模轉(zhuǎn)換
tt=0;∥時(shí)間重新歸0
}
TR0=1;∥重新開(kāi)啟定時(shí)器0
ES=1;∥重新開(kāi)啟串行中斷
}
void ser() interrupt 4 ∥串行中斷函數(shù)
{
aa = SBUF; ∥aa存儲(chǔ)數(shù)據(jù)
RI=0; ∥清除接收中斷標(biāo)志
if(Uart_state) {Uart_state++;}
if(RF2530_state) {RF2530_state++;}
is_serial_onebit=1; ∥標(biāo)志接收了一個(gè)字節(jié)數(shù)據(jù)
}
上位機(jī)軟件為本文系統(tǒng)中的人機(jī)交互界面,整個(gè)軟件以C#語(yǔ)言為設(shè)計(jì)基礎(chǔ),輔助以Access數(shù)據(jù)庫(kù),完成例如對(duì)用戶注冊(cè)信息的管理、采集數(shù)據(jù)的儲(chǔ)存。本文的上位機(jī)軟件總共有五個(gè)界面構(gòu)成,分別為歡迎界面、登錄界面、管理員身份驗(yàn)證界面、新用戶注冊(cè)界面、系統(tǒng)監(jiān)測(cè)與控制主界面。
軟件歡迎界面如圖4所示,本界面的目的主要有兩個(gè)。一個(gè)是起到類(lèi)似“商標(biāo)”作用,注明設(shè)計(jì)者的名稱(chēng)和設(shè)計(jì)單位以及該軟件名稱(chēng);另一個(gè)作用主要帶著緩沖作用,避免像普通軟件在執(zhí)行的時(shí)候由于程序內(nèi)容過(guò)大而導(dǎo)致開(kāi)啟時(shí)等待過(guò)久,造成用戶電腦使用不便。
圖4 歡迎界面
用戶鼠標(biāo)點(diǎn)擊歡迎界面之后便會(huì)進(jìn)入如圖5所示的登錄界面。該登錄界面是利用C#與Access數(shù)據(jù)庫(kù)相結(jié)合制作的,可以準(zhǔn)確地驗(yàn)證該用戶是否為本軟件允許用戶,一旦驗(yàn)證成功便會(huì)進(jìn)入到系統(tǒng)監(jiān)測(cè)與控制主界面,否則將會(huì)跳出錯(cuò)誤提示框。同時(shí),在界面的左下方有注冊(cè)新用戶按鈕,若使用者為新用戶便可點(diǎn)擊該按鈕進(jìn)入到管理員身份驗(yàn)證界面。
圖5 登錄界面
管理員身份驗(yàn)證界面如圖6所示,起到的是一個(gè)“把關(guān)”的作用,為了防止非正常允許的工作人員私自亂注冊(cè)系統(tǒng)使用的賬號(hào),在系統(tǒng)安裝時(shí)會(huì)告知用戶一個(gè)管理員賬號(hào),使用者若需注冊(cè)新賬號(hào)則應(yīng)在管理員身份驗(yàn)證界面中輸入正確的管理員信息方可進(jìn)入到注冊(cè)界面,否則會(huì)跳出錯(cuò)誤提示框。
圖6 管理員身份驗(yàn)證界面
新用戶注冊(cè)界面如圖7所示。其主要由三個(gè)文本框?yàn)橹黧w構(gòu)建而成。這三個(gè)文本框分別為新用戶名,用戶密碼以及核對(duì)密碼三部分構(gòu)成。當(dāng)用戶在新用戶名文本框輸入完畢之后,可按下驗(yàn)證賬號(hào)按鈕,便可以實(shí)現(xiàn)對(duì)在Access數(shù)據(jù)庫(kù)內(nèi)存儲(chǔ)的之前注冊(cè)的用戶信息進(jìn)行核對(duì),若發(fā)現(xiàn)重復(fù)便跳出錯(cuò)誤提示框并清空新用戶名文本框,同時(shí)該按鈕還具有正則表達(dá)式驗(yàn)證功能,可以規(guī)范用戶的注冊(cè)用戶名,避免用戶名出現(xiàn)混亂。若三個(gè)文本框填寫(xiě)完畢,可點(diǎn)擊注冊(cè)按鈕,該按鈕同時(shí)也具備驗(yàn)證賬號(hào)規(guī)范用戶名格式及驗(yàn)證兩個(gè)密碼文本框是否一致的功能。現(xiàn)將該按鈕的事件如下所示:
private void NewUserRegister_Click(object sender, EventArgs e)
{
if (!zhuce_pbyj()) ∥判斷文本框是否為空
{ return;}
∥驗(yàn)證用戶名格式
string Regextest = @"^[a-zA-Z0-9]{7,15}$";
if (!Regex.IsMatch(textBox1.Text, Regextest))
{
MessageBox.Show("請(qǐng)輸入由字母和數(shù)字組成的賬號(hào),數(shù)目在8個(gè)到16字節(jié)之間!", "格式錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; }∥格式不正確跳出提示框
if (!UserRepeat())∥如果用戶名重復(fù)
{return; }
∥驗(yàn)證密碼格式
if (!Regex.IsMatch(textBox2.Text, Regextest))
{
MessageBox.Show("請(qǐng)輸入由字母和數(shù)字組成的密碼,數(shù)目在8個(gè)到16字節(jié)之間!", "格式錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; }
if (!PasswordRight())
{return;}
name = this.textBox1.Text;
pwd = this.textBox2.Text;
string CommandString = string.Format("INSERT INTO [UserList]([UserName],[Password]) values('{0}','{1}')", name, pwd);
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=login_data.accdb");
conn.Open();
OleDbCommand cmd = new OleDbCommand(CommandString, conn);
if (cmd.ExecuteNonQuery() != 0)
{
MessageBox.Show(" 注冊(cè)成功!","恭喜",MessageBoxButtons.OK);
this.Dispose();
Register register = new Register();
register.Show();
}
else
{MessageBox.Show("注冊(cè)失敗");}
conn.Close();
return;
}
圖7 新用戶注冊(cè)界面
用戶在登錄界面登錄成功之后,便可以進(jìn)入到系統(tǒng)監(jiān)測(cè)與控制主界面,如圖8所示。整個(gè)主界面分為四大塊:菜單欄、監(jiān)控信息、串口設(shè)置、控制設(shè)置臺(tái),現(xiàn)將其一一簡(jiǎn)單介紹。在菜單欄中共設(shè)置6個(gè)功能性按鈕:
(1)開(kāi)啟監(jiān)控和停止監(jiān)控用于上位機(jī)無(wú)線遙控下位機(jī)的定時(shí)采集開(kāi)啟或停止;
(2)輸出數(shù)據(jù)可直接開(kāi)啟數(shù)據(jù)存儲(chǔ)所在的數(shù)據(jù)庫(kù);
(3)使用說(shuō)明主要是介紹界面的使用方法;
(4)切換用戶是跳回登錄界面更換用戶;
(5)退出系統(tǒng)即退出該軟件。
監(jiān)控信息欄用來(lái)實(shí)時(shí)顯示下位機(jī)通過(guò)傳感器采集到的數(shù)據(jù),便于觀察和判斷。串口設(shè)置欄用來(lái)提供用戶設(shè)置通信串口的具體參數(shù)。控制設(shè)置臺(tái)提供用戶輸入所需的大氣溫度、土壤墑情上、下限并且可人為控制電磁閥的開(kāi)、關(guān)。
菜單欄的開(kāi)啟監(jiān)控按鈕和關(guān)閉監(jiān)控按鈕程序如下所示:
∥************該函數(shù)用來(lái)開(kāi)啟監(jiān)控
private void OpenSystem_Button_Click(object sender, EventArgs e)
{
if (sp.IsOpen == false)∥驗(yàn)證串口開(kāi)啟?
{
MessageBox.Show("請(qǐng)打開(kāi)串口", "田間精準(zhǔn)灌溉測(cè)控系統(tǒng)", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;}
if (button5.Enabled == true || button8.Enabled == true)
{
MessageBox.Show("請(qǐng)?jiān)O(shè)置所需要的參數(shù)", "田間精準(zhǔn)灌溉測(cè)控系統(tǒng)", MessageBoxButtons.OK,MessageBoxIcon.Warning);
return;}
if (OpenCloseSystem == false)
{
string OpenStr1 = CombinStr('#', '&');∥發(fā)送控制單片機(jī)開(kāi)啟監(jiān)控的數(shù)據(jù)
SendCommand(OpenStr1 + '$');
groupBox4.Enabled = false; ∥關(guān)掉串口的設(shè)置界面,除非停止監(jiān)控方能重能打開(kāi)
groupBox6.Enabled = false;
groupBox7.Enabled = false;∥關(guān)掉溫度和土壤上限的控制
OpenSystem_Button.Enabled = false;
CloseSystem.Enabled = true;
OpenCloseSystem = true;
ReceiveInit();∥初始化接收部分的程序
return;}
}
∥*****該函數(shù)用來(lái)關(guān)閉監(jiān)控********
private void CloseSystem_Click(object sender, EventArgs e)
{
if(OpenCloseSystem == true)
{
string CloseStr1 = CombinStr('#', '*');∥發(fā)送控制單片機(jī)開(kāi)啟監(jiān)控的數(shù)據(jù)
SendCommand(CloseStr1 + '$');
sp.Close();∥關(guān)閉串口
OpenClose_SerialPorts.Text = "開(kāi)啟";
groupBox4.Enabled = true; ∥開(kāi)啟串口的設(shè)置界面,除非停止監(jiān)控方能重能打開(kāi)
groupBox6.Enabled = true;
groupBox7.Enabled = true;∥開(kāi)啟溫度和土壤上限的控制
OpenSystem_Button.Enabled = true;
CloseSystem.Enabled = false;
OpenCloseSystem = false;}
return;
}
圖8 系統(tǒng)監(jiān)測(cè)與控制主界面
本系統(tǒng)設(shè)計(jì)主要目的為的是構(gòu)建一個(gè)用于控制土壤墑情值能在一定范圍內(nèi)時(shí)同時(shí)具有大氣溫度檢測(cè)功能的簡(jiǎn)易灌溉控制器,并且通過(guò)大功率無(wú)線CC2530模塊實(shí)現(xiàn)無(wú)線數(shù)據(jù)傳輸,節(jié)約布線成本同時(shí)提高環(huán)境的適應(yīng)能力?;贑#和Access數(shù)據(jù)庫(kù)設(shè)計(jì)的無(wú)線精準(zhǔn)灌溉系統(tǒng)實(shí)現(xiàn)了該所需功能。其利用串口通信和無(wú)線通信構(gòu)建了一個(gè)上位機(jī)與下位機(jī)通信的橋梁,使上、下位機(jī)之間的數(shù)據(jù)能夠互通有無(wú)。而且作為人機(jī)交互界面的上位機(jī)軟件的功能也十分實(shí)用豐富,包括了:歡迎界面、登錄界面、管理員身份驗(yàn)證界面、新用戶注冊(cè)界面以及系統(tǒng)監(jiān)測(cè)與控制主界面。設(shè)計(jì)的無(wú)線精準(zhǔn)灌溉系統(tǒng)中上位機(jī)界面友好,操作簡(jiǎn)單,運(yùn)行穩(wěn)定,為無(wú)線精準(zhǔn)灌溉系統(tǒng)的設(shè)計(jì)提供了參考。
參考文獻(xiàn):
[1] 中華人民共和國(guó)水利部. 2012全國(guó)水利發(fā)展統(tǒng)計(jì)公報(bào)[M]. 北京: 中國(guó)水利水電出版社, 2013:13.
[2] 佟金萍, 馬劍峰, 王慧敏,等. 農(nóng)業(yè)用水效率與技術(shù)進(jìn)步: 基于中國(guó)農(nóng)業(yè)面板數(shù)據(jù)的實(shí)證研究[J]. 資源科學(xué), 2014,36(9):1 765-1 772.
[3] 金宏智, 嚴(yán)海軍, 錢(qián)一超. 國(guó)外節(jié)水灌溉工程技術(shù)發(fā)展分析[J]. 農(nóng)業(yè)機(jī)械學(xué)報(bào), 2010,41:59-63.
[4] 郭 霖, 白 丹, 王新端, 等. 雙向?qū)_流滴灌灌水器水力性能與消能效果[J]. 農(nóng)業(yè)工程學(xué)報(bào), 2016,32(17):77-82.
[5] 劉柯楠, 吳普特, 朱德蘭, 等. 太陽(yáng)能驅(qū)動(dòng)噴灌機(jī)組行走動(dòng)力和光伏功率匹配設(shè)計(jì)與試驗(yàn)[J]. 農(nóng)業(yè)工程學(xué)報(bào), 2017,33(16):96-103.
[6] 紀(jì)建偉, 丁 皓, 李征明, 等. 基于無(wú)線傳輸?shù)牡咎锕喔缺O(jiān)控系統(tǒng)[J]. 農(nóng)業(yè)工程學(xué)報(bào), 2013,29(1):52-58.
[7] 張?jiān)隽? 郁曉慶. 土壤水分無(wú)線傳感器網(wǎng)絡(luò)節(jié)點(diǎn)設(shè)計(jì)與測(cè)試[J]. 中國(guó)農(nóng)村水利水電, 2012,(12):5-8.
[8] 于海業(yè), 羅 瀚, 任 順, 等. ZigBee技術(shù)在精準(zhǔn)農(nóng)業(yè)上的應(yīng)用進(jìn)展與展望[J]. 農(nóng)機(jī)化研究, 2012,(8):1-6.
[9] 劉 濤, 趙計(jì)生. 基于ZigBee技術(shù)的農(nóng)田自動(dòng)節(jié)水灌溉系統(tǒng)[J]. 測(cè)控技術(shù), 2008,27(2):95-99.
[10] 張亞鋒. 基于ZigBee技術(shù)的農(nóng)田土壤溫濕度監(jiān)測(cè)系統(tǒng)設(shè)計(jì)[J]. 節(jié)水灌溉, 2014,(9):80-83.