摘 要
溫度和濕度是保證農(nóng)作物良好生長(zhǎng)的兩個(gè)重要的因素,因此檢測(cè)溫濕度就顯得尤為重要。傳統(tǒng)的檢測(cè)溫濕度是通過儀器儀表到溫室大棚內(nèi)檢測(cè)、記錄,然后再通過相應(yīng)的設(shè)備來調(diào)整溫濕度。若可通過組建無線網(wǎng)絡(luò)來檢測(cè)溫濕度,既可避免傳統(tǒng)有線傳輸?shù)牟季復(fù)雜、出現(xiàn)故障很難檢查等問題,又減小了成本,使得檢測(cè)溫濕度更加方便。
本文主要設(shè)計(jì)研究了基于ZigBee的溫室大棚的溫濕度檢測(cè)系統(tǒng),在溫室大棚中,傳感器節(jié)點(diǎn)比較多,所以該無線網(wǎng)絡(luò)系統(tǒng)采用的傳感器節(jié)點(diǎn)設(shè)計(jì)方案是SOC解決方案,即主控芯片CC2530和溫濕度傳感器DHT11的結(jié)合,真正實(shí)現(xiàn)了成本低,功耗小,穩(wěn)定性好的特點(diǎn)。
軟件的編程采用的是IAR集成開發(fā)環(huán)境,軟件設(shè)計(jì)主要分為三個(gè)部分,傳感器節(jié)點(diǎn)的采集程序、協(xié)調(diào)器的組網(wǎng)程序、上位機(jī)的界面編程,此外還有一些串口通信程序等。在ZigBee的協(xié)議棧移植,協(xié)調(diào)器建立網(wǎng)絡(luò)后,終端節(jié)點(diǎn)都加入網(wǎng)絡(luò)。首先終端節(jié)點(diǎn)采集溫蕊度數(shù)據(jù))然后通過ZigBee協(xié)議把數(shù)據(jù)發(fā)送給協(xié)調(diào)器,然后協(xié)調(diào)器把數(shù)據(jù)發(fā)送到上位機(jī),上位機(jī)把數(shù)據(jù)顯示在界面上,用戶可對(duì)溫濕度數(shù)據(jù)進(jìn)行即時(shí)查詢。這樣就實(shí)現(xiàn)了溫濕度數(shù)據(jù)實(shí)時(shí)顯示的功能。
把ZigBee這樣一種短距離、低功耗、低成本的無線通信技術(shù)應(yīng)用到溫室大棚的檢測(cè)統(tǒng)中,能夠?qū)崿F(xiàn)檢測(cè)系統(tǒng)的自動(dòng)化,具有很強(qiáng)的實(shí)用性和應(yīng)用前景。
目錄
摘 要
目錄
第1章 緒論
1.1 引言
1.2 設(shè)計(jì)實(shí)現(xiàn)的目標(biāo)
第2章 系統(tǒng)總體設(shè)計(jì)
2.1 方案的總體設(shè)計(jì)
2.2 ZigBee技術(shù)簡(jiǎn)介
2.3 傳感器簡(jiǎn)介
第3章 系統(tǒng)軟硬件設(shè)計(jì)
3.1 硬件電路設(shè)計(jì)
3.2 軟件程序設(shè)計(jì)
第4章 系統(tǒng)的調(diào)試和結(jié)論
第5章 總結(jié)和展望
5.1 總結(jié)
5.2 展望
第1章 緒論
1.1 引言
研究背景及研究意義
無線傳感器網(wǎng)絡(luò)涉及了多種技術(shù)的前沿?zé)狳c(diǎn)研究領(lǐng)域,包括傳感器技術(shù)、無線通信技術(shù)、分布式信號(hào)處理技術(shù)等。它通過集成化的微型傳感器完成對(duì)環(huán)境或檢測(cè)對(duì)象的信息實(shí)時(shí)監(jiān)測(cè)和采集,并將檢測(cè)到的信息在自組織的無線多跳網(wǎng)絡(luò)中傳送到上位機(jī)并顯示給用戶。自從無線傳感器網(wǎng)絡(luò)出現(xiàn)以來,我們把信息世界和物理世界融合在一起,使人與機(jī)器、人和自然的交互方式得到了改變,然后實(shí)現(xiàn)了物理世界、計(jì)算世界以及人類社會(huì)之間的連通,使人類更加有能力認(rèn)識(shí)世界。
早在世紀(jì)年代末年代初,溫室監(jiān)控系統(tǒng)研究開始起步了,那時(shí)候的檢測(cè)很單一,是通過一些儀器和儀表單點(diǎn)測(cè)量,然后記錄。后來在傳感器技術(shù)和單片機(jī)技術(shù)的迅速發(fā)展下,溫室環(huán)境監(jiān)測(cè)技術(shù)的研究也隨著發(fā)展起來了。直到年代初,引入了計(jì)算機(jī)和總線技術(shù)之后,使得溫室系統(tǒng)開始走向自動(dòng)化。跟著在軟件技術(shù)的大力發(fā)展下,出現(xiàn)了專家系統(tǒng),溫室監(jiān)控逐漸向智能化方向發(fā)展。但是還存在著一個(gè)很大的問題,那就是布線困難,接線復(fù)雜。但是這個(gè)問題也很快得到了解決,這完全依賴于無線通信技術(shù)的迅猛發(fā)展。在國外首先出現(xiàn)將無線技術(shù)應(yīng)用到農(nóng)業(yè)生產(chǎn)中,包括應(yīng)用到溫室監(jiān)測(cè)和控制系統(tǒng)中,避免了一些有線傳輸帶來的問題,比如:系統(tǒng)測(cè)試精度低,存在抗干擾能力差,工作不穩(wěn)定等。
隨著社會(huì)進(jìn)步和生產(chǎn)發(fā)展需要,傳統(tǒng)的使用模擬儀表進(jìn)行單點(diǎn)測(cè)溫度,測(cè)濕度已經(jīng)不能滿足我們的需求,所以利用無線通信來采集溫濕度數(shù)據(jù)顯得非常重要,測(cè)量的精度也得到了社會(huì)的重視。而無線傳感器網(wǎng)絡(luò)的優(yōu)勢(shì)和發(fā)展成熟必將是溫室測(cè)控系統(tǒng)的發(fā)展方向。
在工業(yè)現(xiàn)場(chǎng),由于環(huán)境比較惡劣,工作人員不能長(zhǎng)時(shí)間停留在現(xiàn)場(chǎng)觀測(cè)設(shè)備的運(yùn)轉(zhuǎn),所以需要采集數(shù)據(jù)并傳送數(shù)據(jù)到操控室,工作人員就可以根據(jù)情況來發(fā)送控制命令了。然而數(shù)據(jù)傳輸也有兩種方式,有線傳輸和無線傳輸,傳統(tǒng)的有線數(shù)據(jù)傳輸需要的電纜多,布線復(fù)雜,出現(xiàn)問題了換線困難難于維修,并且浪費(fèi)資源,占用空間大。而采用無線傳輸?shù)脑捑涂梢员苊馍鲜鰡栴}了。
由于溫室大棚占地面積比較大導(dǎo)致工作量大,可靠性差;檢測(cè)目標(biāo)也比較分散,測(cè)點(diǎn)較多,
所以傳統(tǒng)的方法已經(jīng)不能滿足當(dāng)前農(nóng)業(yè)發(fā)展的需要。在科技水平日新月異發(fā)展的當(dāng)下,無
線通信技術(shù)的發(fā)展使得溫室測(cè)量采集更精確,更簡(jiǎn)便。
1.2 設(shè)計(jì)實(shí)現(xiàn)的目標(biāo)
本次設(shè)計(jì)方案選取了溫室大棚的溫度和濕度兩個(gè)重要的環(huán)境參數(shù)作為傳感器采集數(shù)據(jù)源,通過傳感器節(jié)點(diǎn)實(shí)時(shí)的采集數(shù)據(jù),通過射頻模塊進(jìn)行溫濕度數(shù)據(jù)的無線傳輸,并基于協(xié)議組建無線網(wǎng)絡(luò)實(shí)現(xiàn)數(shù)據(jù)的更遠(yuǎn)距離傳輸,然后由組建網(wǎng)絡(luò)者協(xié)調(diào)器將經(jīng)過處理后的數(shù)據(jù)傳輸?shù)缴衔粰C(jī),并在計(jì)算機(jī)上顯示,以供工作人員觀測(cè),及時(shí)處理。
第2章 系統(tǒng)總體設(shè)計(jì)
2.1 方案的總體設(shè)計(jì)
圖2-1溫濕度檢測(cè)整體方案設(shè)計(jì)框圖 基本設(shè)計(jì)方案:本次設(shè)計(jì)的主要內(nèi)容是基于協(xié)議的低功耗,低成本,方便簡(jiǎn)潔的溫濕度檢測(cè) 系統(tǒng)的實(shí)現(xiàn),以供農(nóng)民制定生產(chǎn)策略保護(hù)農(nóng)作物生長(zhǎng)和提高產(chǎn)量。 研究的主要內(nèi)容有以下六個(gè)方面: 了解三種邏輯設(shè)備終端節(jié)點(diǎn)、路由器、協(xié)調(diào)器的工作原理,提出檢測(cè)系統(tǒng)的總體方案。 深刻理解傳感器節(jié)點(diǎn)電路的原理,根據(jù)實(shí)際應(yīng)用的要求,選擇合適的器件完成傳感器節(jié)點(diǎn)電路的設(shè)計(jì),包括電池板和射頻板的設(shè)計(jì)并抗干擾,溫濕度傳感器的外接。提出一套可行的檢測(cè)溫濕度的方案,并合理布局傳感器節(jié)點(diǎn),實(shí)現(xiàn)不同地點(diǎn)溫濕度的測(cè)量。在硬件的支持上,深入理解協(xié)議棧,各層的作用以及協(xié)調(diào)器和計(jì)算機(jī)的串口通信程序設(shè)計(jì)。對(duì)傳感器節(jié)點(diǎn)、路由器節(jié)點(diǎn),協(xié)調(diào)器進(jìn)行組網(wǎng)調(diào)試,傳感器節(jié)點(diǎn)實(shí)現(xiàn)溫濕度的檢測(cè),并通過路由器、協(xié)調(diào)器傳送到計(jì)算機(jī)界面上用顯示出來。當(dāng)節(jié)點(diǎn)的發(fā)送功率為時(shí),節(jié)點(diǎn)和相鄰節(jié)點(diǎn)之間的距離小于米時(shí),其數(shù)據(jù)丟包率保持在以內(nèi),三節(jié)干電池有效工作時(shí)間在個(gè)月以上。我們的溫濕度檢測(cè)系統(tǒng)的設(shè)計(jì),需要考慮到成本最小,也就是盡量找到便宜實(shí)用以及穩(wěn)定性高的硬件芯片作為節(jié)點(diǎn)。軟件設(shè)計(jì)方面要考慮到算法盡可能的簡(jiǎn)單,并且最為優(yōu)化。使得數(shù)據(jù)傳輸過程中能量消耗盡量減少,主要考慮比較節(jié)能的路由算法。硬件方面的工作主要是數(shù)據(jù)采集節(jié)點(diǎn)電路設(shè)計(jì)、協(xié)調(diào)器電路設(shè)計(jì)以及相關(guān)接口電路設(shè)計(jì)。 軟件方面的工作包括以為主控芯片的測(cè)溫程序的開發(fā),網(wǎng)絡(luò)算法以及無線收發(fā)芯片的驅(qū)動(dòng)程序的開發(fā),和針對(duì)無線通信系統(tǒng)的應(yīng)用程序幵發(fā),包括了數(shù)據(jù)采集、數(shù)據(jù)傳輸、數(shù)據(jù)處理及顯示。并在此基礎(chǔ)上完成協(xié)議棧的移植。 創(chuàng)新點(diǎn):有線傳輸方式進(jìn)行通信和組網(wǎng),系統(tǒng)復(fù)雜度高,系統(tǒng)可靠性和靈活性低,而將這樣一種短距低速低成本低功耗的無線通信組網(wǎng)技術(shù)應(yīng)用到溫濕度測(cè)量系統(tǒng)中,實(shí)現(xiàn)了自動(dòng)化、信息化,有效的減輕了工作人員的工作壓力,提高了工作效率,對(duì)今后無線傳感器網(wǎng)絡(luò)的廣泛應(yīng)用是很好的嘗試。
2.2 ZigBee技術(shù)簡(jiǎn)介蜜蜂在發(fā)現(xiàn)花叢后會(huì)通過一種特殊的肢體語言來告知同伴新發(fā)現(xiàn)的食物源位置等信息,這種肢體語言就是ZigZag行舞蹈,是蜜蜂之間一種簡(jiǎn)單傳達(dá)信息的方式。借此意義Zigbee作為新一代無線通訊技術(shù)的命名。在此之前ZigBee也被稱為“HomeRF Lite”、“RF- EasyLink”或“fireFly”無線電技術(shù),統(tǒng)稱為ZigBee。 簡(jiǎn)單的說,ZigBee是一種高可靠的無線數(shù)傳網(wǎng)絡(luò),類似于CDMA和GSM網(wǎng)絡(luò)。ZigBee數(shù)傳模塊類似于移動(dòng)網(wǎng)絡(luò)基站。通訊距離從標(biāo)準(zhǔn)的75m到幾百米、幾公里,并且支持無限擴(kuò)展。 ZigBee是一個(gè)由可多到65000個(gè)無線數(shù)傳模塊組成的一個(gè)無線數(shù)傳網(wǎng)絡(luò)平臺(tái),在整個(gè)網(wǎng)絡(luò)范圍內(nèi),每一個(gè)ZigBee網(wǎng)絡(luò)數(shù)傳模塊之間可以相互通信,每個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)間的距離可以從標(biāo)準(zhǔn)的75m無限擴(kuò)展。 與移動(dòng)通信的CDMA網(wǎng)或GSM網(wǎng)不同的是,ZigBee網(wǎng)絡(luò)主要是為工業(yè)現(xiàn)場(chǎng)自動(dòng)化控制數(shù)據(jù)傳輸而建立,因而,它必須具有簡(jiǎn)單,使用方便,工作可靠,價(jià)格低的特點(diǎn)。而移動(dòng)通信網(wǎng)主要是為語音通信而建立,每個(gè)基站價(jià)值一般都在百萬元人民幣以上,而每個(gè)ZigBee“基站”卻不到1000元人民幣。每個(gè)ZigBee網(wǎng)絡(luò)節(jié)點(diǎn)不僅本身可以作為監(jiān)控對(duì)象,例如其所連接的傳感器直接進(jìn)行數(shù)據(jù)采集和監(jiān)控,還可以自動(dòng)中轉(zhuǎn)別的網(wǎng)絡(luò)節(jié)點(diǎn)傳過來的數(shù)據(jù)資料。除此之外,每一個(gè)ZigBee網(wǎng)絡(luò)節(jié)點(diǎn)(FFD)還可在自己信號(hào)覆蓋的范圍內(nèi),和多個(gè)不承擔(dān)網(wǎng)絡(luò)信息中轉(zhuǎn)任務(wù)的孤立的子節(jié)點(diǎn)(RFD)無線連接。 2.3 傳感器簡(jiǎn)介DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器,它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性和卓越的長(zhǎng)期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測(cè)溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式存在OTP內(nèi)存中,傳感器內(nèi)部在檢測(cè)型號(hào)的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡(jiǎn)易快捷。超小的體積、極低的功耗,使其成為給類應(yīng)用甚至最為苛刻的應(yīng)用場(chǎng)合的最佳選擇。產(chǎn)品為4針單排引腳封裝,連接方便。精度濕度+-5%RH, 溫度+-2℃,量程濕度20-90%RH, 溫度0~50℃。
第3章 系統(tǒng)軟硬件設(shè)計(jì)3.1 硬件電路設(shè)計(jì)幾個(gè)作為終端接收溫濕度,在協(xié)調(diào)器上顯示,如果超過溫濕度設(shè)定,就會(huì)亮燈并顯示太高字樣。 實(shí)驗(yàn)原理圖:
0.png (104.18 KB, 下載次數(shù): 136)
下載附件
2019-1-14 20:28 上傳
射頻板的主控芯片是CC2530,所以控制部分電路圖如圖 
報(bào)警現(xiàn)象由led的亮閃觀察 
PCB設(shè)計(jì)圖  3.2 軟件程序設(shè)計(jì)
主程序流程圖 
(和各個(gè)分功能流程圖的介紹,可分小節(jié)介紹。) 1.溫濕度計(jì)算:可以計(jì)算出溫度和濕度的值,下面給出計(jì)算方法: temp(溫度)一byte2 .bytel=28.00(℃) humi(濕度)=byte4 .byte3=62.00 ( } RH) 檢驗(yàn)一bytel+ byte2 + byte3+ byte4 =01011010=90(=溫度+濕度)(校驗(yàn)正確) 2.協(xié)調(diào)器建立網(wǎng)絡(luò)流程圖 
3. 完成初始化 后通過原語的方式發(fā)起網(wǎng)絡(luò)。它有拒絕和允許節(jié)點(diǎn)加入網(wǎng)絡(luò)的權(quán)力,然后把各個(gè)節(jié)點(diǎn)的數(shù) 據(jù)采集匯總后發(fā)給上位機(jī)顯示出來。協(xié)調(diào)器發(fā)起網(wǎng)絡(luò)由功能函數(shù)Void ZDO Network For mation(byte LogicalType,devStartModes_ t StartMode,byte BeaconOrder,byte SuperframeOr der)來實(shí)現(xiàn)組建無線網(wǎng)絡(luò)。函數(shù)參數(shù)的意義說明如下: Logical腸pe是Byte類型的,代表該設(shè)備的類型。StartMode是Struct類型的,MOD E HARD申請(qǐng)新建網(wǎng)絡(luò),MODE一OIN申請(qǐng)加入網(wǎng)絡(luò),MODE_ RESUME重新新建網(wǎng)絡(luò), MODE_ REJOIN重新加入網(wǎng)絡(luò),BeaconOrder是Byte類型,是要建立的ZigBee網(wǎng)絡(luò)的信 標(biāo)序號(hào),SuperframeOrder也是一個(gè)Byte類型的,是要建立的ZigBee網(wǎng)絡(luò)的超幀信號(hào)。 當(dāng)協(xié)調(diào)器上電后,其應(yīng)用層通過發(fā)送原語NLME NETWORK-FORMATION.request發(fā)起新網(wǎng)絡(luò)的建立的進(jìn)程,網(wǎng)絡(luò)層在收到請(qǐng)求后也通過發(fā)送原語NLME-SCAN.request來要求MAC層對(duì)信道進(jìn)行能量掃描。MAC層通過NLME_ SCAN.confirm將掃描到的可用信道報(bào)告給網(wǎng)絡(luò)層,網(wǎng)絡(luò)層再發(fā)出NLME-SCAN.request搜索可用信道中其他未使用或使用最少的信道,MAC層將搜索結(jié)果報(bào)告給網(wǎng)絡(luò)層。如果沒有搜索到可用信道則表示新網(wǎng)絡(luò)建立失敗;如果搜到可用信道,則協(xié)調(diào)器確定一個(gè)PAN ID和16位網(wǎng)絡(luò)地址,如果在NLME一ETWORK_DISCOVERY request原語中指定了PAN ID而且與原來存在的不沖突,則使用指定的PAN ID,否則使用隨機(jī)選擇的,但要求PAN ID在0x0000^-Ox3FFF范圍內(nèi),協(xié)調(diào)器網(wǎng)絡(luò)地址一般為0x0000。之后,網(wǎng)絡(luò)層發(fā)出MLME-SET.request通知MAC層設(shè)置這些參數(shù),收到MAC的確認(rèn)后,NWK發(fā)出MLME-START.request原語啟動(dòng)新網(wǎng)路的建立新網(wǎng)絡(luò)建立后,發(fā)送NLMEes NETWORKse FORMATION.confirm原語通知應(yīng)用層最終結(jié)果。 主要代碼:
第4章 系統(tǒng)的調(diào)試和結(jié)論
6.1準(zhǔn)備工作
首先要排除硬件的各種問題,比如接觸不良,短路,電源不穩(wěn)定等,然后開始上電測(cè)試。由于我們是在實(shí)驗(yàn)階段,所以先選用少量的節(jié)點(diǎn)來做測(cè)試。我們測(cè)試時(shí)所用的硬件有:
計(jì)算機(jī)一臺(tái),仿真器一個(gè),兩個(gè)終端節(jié)點(diǎn)(RFD),一個(gè)協(xié)調(diào)器((FFD)o
在ZigBee協(xié)議棧移植后,在進(jìn)行部分軟件的編寫和修改后,分別把程序下載到協(xié)調(diào)
器和終端節(jié)點(diǎn)。我們測(cè)試所用的軟件是IAR嵌入式集成開發(fā)環(huán)境。
在測(cè)試中,網(wǎng)絡(luò)拓?fù)漕愋瓦x擇星型網(wǎng)絡(luò),兩個(gè)終端節(jié)點(diǎn)采用三節(jié)1.5V電池供電,協(xié)調(diào)器采用USB供電,并通過串口與計(jì)算機(jī)相連。由于現(xiàn)在的筆記本沒有9針串口,因此我們采用USB轉(zhuǎn)串口來和計(jì)算機(jī)通信。
這時(shí)我們就要對(duì)終端節(jié)點(diǎn)和協(xié)調(diào)器進(jìn)行穩(wěn)定性測(cè)試和安全性測(cè)試。
1)穩(wěn)定性測(cè)試
把終端節(jié)點(diǎn)的電源模式設(shè)定為完全功能模式(CPMO),協(xié)調(diào)器沒有休眠模式,因此不用設(shè)置。長(zhǎng)時(shí)間運(yùn)行48小時(shí)以上,檢查各個(gè)模塊是否運(yùn)轉(zhuǎn)正常,電壓是否在正常值范圍之內(nèi),液晶是否清晰可見無閃屏現(xiàn)象。
2)安全性測(cè)試
檢查各類接口,保證不短路,長(zhǎng)時(shí)間運(yùn)行程序后,檢查芯片溫度以及工作電壓,防止燒壞。在硬件測(cè)試結(jié)束后,我們測(cè)試下傳感器采集溫濕度是否正常,利用串口調(diào)試助手測(cè)試下9針串口的通信。
4.2組網(wǎng)測(cè)試
在硬件測(cè)試都無異常,各部分測(cè)試都正常后,我們就開始進(jìn)行組網(wǎng)測(cè)試。
1)配置傳感器節(jié)點(diǎn)
在Z-Stack協(xié)議棧移植后,用IAR集成開發(fā)軟件打開組網(wǎng)測(cè)試程序,選擇SensorBB,選擇Project->Rebuild All編譯,在編譯完全通過后,連接PC、仿真器和目標(biāo)板Q2530BB,按下仿真器的Reset鍵,此時(shí)仿真器指示燈應(yīng)正常,點(diǎn)擊Debug按鈕進(jìn)行下載,待下載進(jìn)度條消失,左上角出現(xiàn)調(diào)試窗口時(shí),點(diǎn)擊退出調(diào)試狀態(tài),拔除DEBUG線,重啟目標(biāo)板電源或按下目標(biāo)板的Reset鍵,此時(shí)LED 1, LED2慢速閃爍,目標(biāo)己被設(shè)定為終端傳感器節(jié)點(diǎn)。
2)配置協(xié)調(diào)器節(jié)點(diǎn)
選擇CollectorEB,選擇Project->Rebuild All編譯,編譯完全通過后,連接PC、仿真
器和目標(biāo)板Q2530EB,按下仿真器的Reset鍵,此時(shí)仿真器指示燈應(yīng)正常,點(diǎn)擊Debug進(jìn)行下載,待下載進(jìn)度條消失,左上角出現(xiàn)調(diào)試窗口,點(diǎn)擊全速運(yùn)行按鈕,目標(biāo)板LED 1,LED2同時(shí)閃爍,此時(shí)LCD屏顯示為當(dāng)前節(jié)點(diǎn)的IEEE地址。
(1)此時(shí)如果退出調(diào)試狀態(tài),拔掉Debug線,重啟目標(biāo)板電源,按下reset鍵,目標(biāo)板已被設(shè)定為網(wǎng)絡(luò)路由器節(jié)點(diǎn)
(2)此時(shí)如果按下U3的UP鍵,則LED 1 /LED3長(zhǎng)亮,LED2閃爍,點(diǎn)擊退出調(diào)試狀態(tài),拔掉目標(biāo)板上的Debug線,重啟目標(biāo)板電源或按下目標(biāo)板的Reset鍵,此時(shí)LED 1 /LED3長(zhǎng)亮,LED2閃爍,目標(biāo)板己被設(shè)定為網(wǎng)絡(luò)協(xié)調(diào)器節(jié)點(diǎn)。關(guān)閉網(wǎng)路中所有節(jié)點(diǎn)電源,將協(xié)調(diào)器的串口與計(jì)算機(jī)連接起來,打開ZigBee協(xié)議分析軟件,選擇COM1口,波特率為9600,開啟協(xié)調(diào)器電源,這樣ZigBee的網(wǎng)絡(luò)建立好了。 首先觀察兩個(gè)節(jié)點(diǎn)加入網(wǎng)絡(luò)的時(shí)間,sensorl加入網(wǎng)絡(luò)的時(shí)間是2.5秒,sensor2加入網(wǎng)絡(luò)的時(shí)間是2秒。終端節(jié)點(diǎn)綁定以后就開始自動(dòng)采集溫濕度數(shù)據(jù),并將采集到的數(shù)據(jù)通過ZigBee協(xié)議傳輸給協(xié)調(diào)器,然后協(xié)調(diào)器通過串口通信協(xié)議傳到上位機(jī)界面顯示出來。
第5章 總結(jié)和展望
5.1 總結(jié)
本次設(shè)計(jì)的無線溫濕度監(jiān)測(cè)網(wǎng)絡(luò)是基于ZigBee協(xié)議的短距離、低功耗的無線通信網(wǎng)絡(luò),一般用于溫室大棚,花園等。針對(duì)農(nóng)作物的生長(zhǎng)需要最適宜的溫濕度,所以我們選用復(fù)合數(shù)字溫濕度傳感器DHT 11來測(cè)量溫濕度,和CC2530芯片一同組成了采集溫濕度的傳感器節(jié)點(diǎn)。此節(jié)點(diǎn)功耗低、成本低、傳輸數(shù)據(jù)穩(wěn)定。另外的一大特色是使用了ZigBee協(xié)議棧來組建無線傳感器網(wǎng)絡(luò),這樣可以使溫濕度數(shù)據(jù)可以通過無線來傳輸。最后還設(shè)計(jì)了上位機(jī)的界面顯示,可以實(shí)時(shí)顯示溫濕度數(shù)據(jù),可以在辦公室內(nèi)就可以清楚的知道溫室大棚內(nèi)的溫濕度情況,極大的減輕了工作人員的勞動(dòng)強(qiáng)度。
隨著人們生活水平的提高,溫室大棚經(jīng)歷了從傳統(tǒng)的利用儀器儀表手動(dòng)檢測(cè),到現(xiàn)在的利用無線網(wǎng)絡(luò)自動(dòng)檢測(cè),并且逐漸向智能化方向發(fā)展。
本文的研究重點(diǎn)在于對(duì)ZigBee協(xié)議棧的組網(wǎng)研究上,ZigBee協(xié)議是一種基于IEEE802.15.4標(biāo)準(zhǔn)的協(xié)議,采用了分層的構(gòu)架。而在ZigBee協(xié)議棧中基于開發(fā)的程序主要集中在網(wǎng)絡(luò)層,應(yīng)用層。ZigBee協(xié)議棧基于原語問答的方式實(shí)現(xiàn)系統(tǒng)通信功能,對(duì)于硬件的設(shè)計(jì)使用了SOC解決方案,并且參照某些開發(fā)板的電路圖,使得整個(gè)硬件設(shè)計(jì)過程變得不復(fù)雜,減少了開發(fā)的周期。
5.2 展望
ZigBee技術(shù)畢竟還是一門新興的通信技術(shù),在使用和推廣中還有很多地方要改進(jìn)。論文寫作過程中雖然參閱了許多文獻(xiàn)資料和別人的研究成果,但是由于時(shí)間和能力的有限,還有很多因素和問題沒有考慮進(jìn)去,所以還存在很多不足,在后續(xù)的工作中將主要從以下幾個(gè)方面提高研究水平:
1)在硬件電路設(shè)計(jì)方面:對(duì)于高頻電路分布參數(shù)以及天線電路的設(shè)計(jì)還有一些不足,由高頻電路造成的電磁干擾在一定程度上影響了節(jié)點(diǎn)采集數(shù)據(jù)的準(zhǔn)確度。其次是盡量將電路板設(shè)計(jì)的更小,這樣更加便于攜帶。這就需要對(duì)從元件選型到電路布局布線設(shè)計(jì)等方面做出調(diào)整。
2)對(duì)ZigBee協(xié)議棧的理解明顯不足。對(duì)于細(xì)節(jié)的把握還很欠缺,這直接影響到了協(xié)議棧的具體開發(fā)工作。軟件的架構(gòu)還有完善的地方,對(duì)于路由選擇還有很大的空間進(jìn)行優(yōu)化。代碼還可以進(jìn)一步精簡(jiǎn),這樣可以提高程序的執(zhí)行效率,提高代碼的健壯性。 - /*********************************************************************
- * INCLUDES
- */
- #include "OSAL.h"
- #include "ZGlobals.h"
- #include "AF.h"
- #include "aps_groups.h"
- #include "ZDApp.h"
-
- #include "SampleApp.h"
- #include "SampleAppHw.h"
-
- #include "OnBoard.h"
-
- /* HAL */
- #include "hal_lcd.h"
- #include "hal_led.h"
- #include "hal_key.h"
-
- /*********************************************************************
- * MACROS
- */
-
- /*********************************************************************
- * CONSTANTS
- */
-
- /*********************************************************************
- * TYPEDEFS
- */
-
- /*********************************************************************
- * GLOBAL VARIABLES
- */
-
- // This list should be filled with Application specific Cluster IDs.
- const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =
- {
- SAMPLEAPP_PERIODIC_CLUSTERID,
- SAMPLEAPP_FLASH_CLUSTERID
- };
-
- const SimpleDescriptionFormat_t SampleApp_SimpleDesc =
- {
- SAMPLEAPP_ENDPOINT, // int Endpoint;
- SAMPLEAPP_PROFID, // uint16 AppProfId[2];
- SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2];
- SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4;
- SAMPLEAPP_FLAGS, // int AppFlags:4;
- SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;
- (cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList;
- SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;
- (cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList;
- };
-
- // This is the Endpoint/Interface description. It is defined here, but
- // filled-in in SampleApp_Init(). Another way to go would be to fill
- // in the structure here and make it a "const" (in code space). The
- // way it's defined in this sample app it is define in RAM.
- endPointDesc_t SampleApp_epDesc;
-
- /*********************************************************************
- * EXTERNAL VARIABLES
- */
-
- /*********************************************************************
- * EXTERNAL FUNCTIONS
- */
-
- /*********************************************************************
- * LOCAL VARIABLES
- */
- uint8 SampleApp_TaskID; // Task ID for internal task/event processing
- // This variable will be received when
- // SampleApp_Init() is called.
- devStates_t SampleApp_NwkState;
-
- uint8 SampleApp_TransID; // This is the unique message ID (counter)
-
- afAddrType_t SampleApp_Periodic_DstAddr;
- afAddrType_t SampleApp_Flash_DstAddr;
-
- aps_Group_t SampleApp_Group;
-
- uint8 SampleAppPeriodicCounter = 0;
- uint8 SampleAppFlashCounter = 0;
-
- /*********************************************************************
- * LOCAL FUNCTIONS
- */
- void SampleApp_HandleKeys( uint8 shift, uint8 keys );
- void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
- void SampleApp_SendPeriodicMessage( void );
- void SampleApp_SendFlashMessage( uint16 flashTime );
-
- /*********************************************************************
- * NETWORK LAYER CALLBACKS
- */
-
- /*********************************************************************
- * PUBLIC FUNCTIONS
- */
-
- /*********************************************************************
- * @fn SampleApp_Init
- *
- * @brief Initialization function for the Generic App Task.
- * This is called during initialization and should contain
- * any application specific initialization (ie. hardware
- * initialization/setup, table initialization, power up
- * notificaiton ... ).
- *
- * @param task_id - the ID assigned by OSAL. This ID should be
- * used to send messages and set timers.
- *
- * @return none
- */
- void SampleApp_Init( uint8 task_id )
- {
- SampleApp_TaskID = task_id;
- SampleApp_NwkState = DEV_INIT;
- SampleApp_TransID = 0;
-
- // Device hardware initialization can be added here or in main() (Zmain.c).
- // If the hardware is application specific - add it here.
- // If the hardware is other parts of the device add it in main().
-
- #if defined ( BUILD_ALL_DEVICES )
- // The "Demo" target is setup to have BUILD_ALL_DEVICES and HOLD_AUTO_START
- // We are looking at a jumper (defined in SampleAppHw.c) to be jumpered
- // together - if they are - we will start up a coordinator. Otherwise,
- // the device will start as a router.
- if ( readCoordinatorJumper() )
- zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR;
- else
- zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER;
- #endif // BUILD_ALL_DEVICES
-
- #if defined ( HOLD_AUTO_START )
- // HOLD_AUTO_START is a compile option that will surpress ZDApp
- // from starting the device and wait for the application to
- // start the device.
- ZDOInitDevice(0);
- #endif
-
- // Setup for the periodic message's destination address
- // Broadcast to everyone
- SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
- SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
- SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;
-
- // Setup for the flash command's destination address - Group 1
- SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;
- SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
- SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;
-
- // Fill out the endpoint description.
- SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;
- SampleApp_epDesc.task_id = &SampleApp_TaskID;
- SampleApp_epDesc.simpleDesc
- = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
- SampleApp_epDesc.latencyReq = noLatencyReqs;
-
- // Register the endpoint description with the AF
- afRegister( &SampleApp_epDesc );
-
- // Register for all key events - This app will handle all key events
- RegisterForKeys( SampleApp_TaskID );
-
- // By default, all devices start out in Group 1
- SampleApp_Group.ID = 0x0001;
- osal_memcpy( SampleApp_Group.name, "Group 1", 7 );
- aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
-
- #if defined ( LCD_SUPPORTED )
- HalLcdWriteString( "SampleApp", HAL_LCD_LINE_1 );
- #endif
- }
-
- /*********************************************************************
- * @fn SampleApp_ProcessEvent
- *
- * @brief Generic Application Task event processor. This function
- * is called to process all events for the task. Events
- * include timers, messages and any other user defined events.
- *
- * @param task_id - The OSAL assigned task ID.
- * @param events - events to process. This is a bit map and can
- * contain more than one event.
- *
- * @return none
- */
- uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
- {
- afIncomingMSGPacket_t *MSGpkt;
- (void)task_id; // Intentionally unreferenced parameter
-
- if ( events & SYS_EVENT_MSG )
- {
- MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
- while ( MSGpkt )
- {
- switch ( MSGpkt->hdr.event )
- {
- // Received when a key is pressed
- case KEY_CHANGE:
- SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
- break;
-
- // Received when a messages is received (OTA) for this endpoint
- case AF_INCOMING_MSG_CMD:
- SampleApp_MessageMSGCB( MSGpkt );
- break;
-
- // Received whenever the device changes state in the network
- case ZDO_STATE_CHANGE:
- SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
- if ( (SampleApp_NwkState == DEV_ZB_COORD)
- || (SampleApp_NwkState == DEV_ROUTER)
- || (SampleApp_NwkState == DEV_END_DEVICE) )
- {
- // Start sending the periodic message in a regular interval.
- osal_start_timerEx( SampleApp_TaskID,
- SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
- SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
- }
- else
- {
- // Device is no longer in the network
- }
- break;
-
- default:
- break;
- }
-
- // Release the memory
- osal_msg_deallocate( (uint8 *)MSGpkt );
-
- // Next - if one is available
- MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
- }
-
- // return unprocessed events
- return (events ^ SYS_EVENT_MSG);
- }
-
- // Send a message out - This event is generated by a timer
- // (setup in SampleApp_Init()).
- if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
- {
- // Send the periodic message
- SampleApp_SendPeriodicMessage();
-
- // Setup to send message again in normal period (+ a little jitter)
- osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
- (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
-
- // return unprocessed events
- return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
- }
-
- // Discard unknown events
- return 0;
- }
-
- /*********************************************************************
- * Event Generation Functions
- */
- /*********************************************************************
- * @fn SampleApp_HandleKeys
- *
- * @brief Handles all key events for this device.
- *
- * @param shift - true if in shift/alt.
- * @param keys - bit field for key events. Valid entries:
- * HAL_KEY_SW_2
- * HAL_KEY_SW_1
- *
- * @return none
- */
- void SampleApp_HandleKeys( uint8 shift, uint8 keys )
- {
- (void)shift; // Intentionally unreferenced parameter
-
- if ( keys & HAL_KEY_SW_1 )
- {
- /* This key sends the Flash Command is sent to Group 1.
- * This device will not receive the Flash Command from this
- * device (even if it belongs to group 1).
- */
- SampleApp_SendFlashMessage( SAMPLEAPP_FLASH_DURATION );
- }
-
- if ( keys & HAL_KEY_SW_2 )
- {
- /* The Flashr Command is sent to Group 1.
- * This key toggles this device in and out of group 1.
- * If this device doesn't belong to group 1, this application
- * will not receive the Flash command sent to group 1.
- */
- aps_Group_t *grp;
- grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
- if ( grp )
- {
- // Remove from the group
- aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
- }
- else
- {
- // Add to the flash group
- aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
- }
- }
- }
-
- /*********************************************************************
- * LOCAL FUNCTIONS
- */
-
- /*********************************************************************
- * @fn SampleApp_MessageMSGCB
- *
- * @brief Data message processor callback. This function processes
- * any incoming data - probably from other devices. So, based
- * on cluster ID, perform the intended action.
- *
- * @param none
- *
- * @return none
- */
- void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
- {
- uint16 flashTime;
-
- switch ( pkt->clusterId )
- {
- case SAMPLEAPP_PERIODIC_CLUSTERID:
- break;
-
- case SAMPLEAPP_FLASH_CLUSTERID:
- flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
- HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
- break;
- }
- }
-
- /*********************************************************************
- * @fn SampleApp_SendPeriodicMessage
- *
- * @brief Send the periodic message.
- *
- * @param none
- *
- * @return none
- */
- void SampleApp_SendPeriodicMessage( void )
- {
- if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
- SAMPLEAPP_PERIODIC_CLUSTERID,
- 1,
- (uint8*)&SampleAppPeriodicCounter,
- &SampleApp_TransID,
- AF_DISCV_ROUTE,
- AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
- {
- }
- else
- {
- // Error occurred in request to send.
- }
- }
-
- /*********************************************************************
- * @fn SampleApp_SendFlashMessage
- *
- * @brief Send the flash message to group 1.
- *
- * @param flashTime - in milliseconds
- *
- * @return none
- */
- void SampleApp_SendFlashMessage( uint16 flashTime )
- {
- uint8 buffer[3];
- buffer[0] = (uint8)(SampleAppFlashCounter++);
- buffer[1] = LO_UINT16( flashTime );
- buffer[2] = HI_UINT16( flashTime );
-
- if ( AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc,
- SAMPLEAPP_FLASH_CLUSTERID,
- 3,
- buffer,
- &SampleApp_TransID,
- AF_DISCV_ROUTE,
- AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
- {
- }
- else
- {
- // Error occurred in request to send.
- }
- }
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
基于zigbee的大棚溫濕度監(jiān)控報(bào)警系統(tǒng).doc
(425.5 KB, 下載次數(shù): 257)
2019-1-14 20:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|