摘 要
溫度和濕度是保證農作物良好生長的兩個重要的因素,因此檢測溫濕度就顯得尤為重要。傳統的檢測溫濕度是通過儀器儀表到溫室大棚內檢測、記錄,然后再通過相應的設備來調整溫濕度。若可通過組建無線網絡來檢測溫濕度,既可避免傳統有線傳輸的布線復雜、出現故障很難檢查等問題,又減小了成本,使得檢測溫濕度更加方便。
本文主要設計研究了基于ZigBee的溫室大棚的溫濕度檢測系統,在溫室大棚中,傳感器節點比較多,所以該無線網絡系統采用的傳感器節點設計方案是SOC解決方案,即主控芯片CC2530和溫濕度傳感器DHT11的結合,真正實現了成本低,功耗小,穩定性好的特點。
軟件的編程采用的是IAR集成開發環境,軟件設計主要分為三個部分,傳感器節點的采集程序、協調器的組網程序、上位機的界面編程,此外還有一些串口通信程序等。在ZigBee的協議棧移植,協調器建立網絡后,終端節點都加入網絡。首先終端節點采集溫蕊度數據)然后通過ZigBee協議把數據發送給協調器,然后協調器把數據發送到上位機,上位機把數據顯示在界面上,用戶可對溫濕度數據進行即時查詢。這樣就實現了溫濕度數據實時顯示的功能。
把ZigBee這樣一種短距離、低功耗、低成本的無線通信技術應用到溫室大棚的檢測統中,能夠實現檢測系統的自動化,具有很強的實用性和應用前景。
目錄
摘 要
目錄
第1章 緒論
1.1 引言
1.2 設計實現的目標
第2章 系統總體設計
2.1 方案的總體設計
2.2 ZigBee技術簡介
2.3 傳感器簡介
第3章 系統軟硬件設計
3.1 硬件電路設計
3.2 軟件程序設計
第4章 系統的調試和結論
第5章 總結和展望
5.1 總結
5.2 展望
第1章 緒論
1.1 引言
研究背景及研究意義
無線傳感器網絡涉及了多種技術的前沿熱點研究領域,包括傳感器技術、無線通信技術、分布式信號處理技術等。它通過集成化的微型傳感器完成對環境或檢測對象的信息實時監測和采集,并將檢測到的信息在自組織的無線多跳網絡中傳送到上位機并顯示給用戶。自從無線傳感器網絡出現以來,我們把信息世界和物理世界融合在一起,使人與機器、人和自然的交互方式得到了改變,然后實現了物理世界、計算世界以及人類社會之間的連通,使人類更加有能力認識世界。
早在世紀年代末年代初,溫室監控系統研究開始起步了,那時候的檢測很單一,是通過一些儀器和儀表單點測量,然后記錄。后來在傳感器技術和單片機技術的迅速發展下,溫室環境監測技術的研究也隨著發展起來了。直到年代初,引入了計算機和總線技術之后,使得溫室系統開始走向自動化。跟著在軟件技術的大力發展下,出現了專家系統,溫室監控逐漸向智能化方向發展。但是還存在著一個很大的問題,那就是布線困難,接線復雜。但是這個問題也很快得到了解決,這完全依賴于無線通信技術的迅猛發展。在國外首先出現將無線技術應用到農業生產中,包括應用到溫室監測和控制系統中,避免了一些有線傳輸帶來的問題,比如:系統測試精度低,存在抗干擾能力差,工作不穩定等。
隨著社會進步和生產發展需要,傳統的使用模擬儀表進行單點測溫度,測濕度已經不能滿足我們的需求,所以利用無線通信來采集溫濕度數據顯得非常重要,測量的精度也得到了社會的重視。而無線傳感器網絡的優勢和發展成熟必將是溫室測控系統的發展方向。
在工業現場,由于環境比較惡劣,工作人員不能長時間停留在現場觀測設備的運轉,所以需要采集數據并傳送數據到操控室,工作人員就可以根據情況來發送控制命令了。然而數據傳輸也有兩種方式,有線傳輸和無線傳輸,傳統的有線數據傳輸需要的電纜多,布線復雜,出現問題了換線困難難于維修,并且浪費資源,占用空間大。而采用無線傳輸的話就可以避免上述問題了。
由于溫室大棚占地面積比較大導致工作量大,可靠性差;檢測目標也比較分散,測點較多,
所以傳統的方法已經不能滿足當前農業發展的需要。在科技水平日新月異發展的當下,無
線通信技術的發展使得溫室測量采集更精確,更簡便。
1.2 設計實現的目標
本次設計方案選取了溫室大棚的溫度和濕度兩個重要的環境參數作為傳感器采集數據源,通過傳感器節點實時的采集數據,通過射頻模塊進行溫濕度數據的無線傳輸,并基于協議組建無線網絡實現數據的更遠距離傳輸,然后由組建網絡者協調器將經過處理后的數據傳輸到上位機,并在計算機上顯示,以供工作人員觀測,及時處理。
第2章 系統總體設計
2.1 方案的總體設計
圖2-1溫濕度檢測整體方案設計框圖 基本設計方案:本次設計的主要內容是基于協議的低功耗,低成本,方便簡潔的溫濕度檢測 系統的實現,以供農民制定生產策略保護農作物生長和提高產量。 研究的主要內容有以下六個方面: 了解三種邏輯設備終端節點、路由器、協調器的工作原理,提出檢測系統的總體方案。 深刻理解傳感器節點電路的原理,根據實際應用的要求,選擇合適的器件完成傳感器節點電路的設計,包括電池板和射頻板的設計并抗干擾,溫濕度傳感器的外接。提出一套可行的檢測溫濕度的方案,并合理布局傳感器節點,實現不同地點溫濕度的測量。在硬件的支持上,深入理解協議棧,各層的作用以及協調器和計算機的串口通信程序設計。對傳感器節點、路由器節點,協調器進行組網調試,傳感器節點實現溫濕度的檢測,并通過路由器、協調器傳送到計算機界面上用顯示出來。當節點的發送功率為時,節點和相鄰節點之間的距離小于米時,其數據丟包率保持在以內,三節干電池有效工作時間在個月以上。我們的溫濕度檢測系統的設計,需要考慮到成本最小,也就是盡量找到便宜實用以及穩定性高的硬件芯片作為節點。軟件設計方面要考慮到算法盡可能的簡單,并且最為優化。使得數據傳輸過程中能量消耗盡量減少,主要考慮比較節能的路由算法。硬件方面的工作主要是數據采集節點電路設計、協調器電路設計以及相關接口電路設計。 軟件方面的工作包括以為主控芯片的測溫程序的開發,網絡算法以及無線收發芯片的驅動程序的開發,和針對無線通信系統的應用程序幵發,包括了數據采集、數據傳輸、數據處理及顯示。并在此基礎上完成協議棧的移植。 創新點:有線傳輸方式進行通信和組網,系統復雜度高,系統可靠性和靈活性低,而將這樣一種短距低速低成本低功耗的無線通信組網技術應用到溫濕度測量系統中,實現了自動化、信息化,有效的減輕了工作人員的工作壓力,提高了工作效率,對今后無線傳感器網絡的廣泛應用是很好的嘗試。
2.2 ZigBee技術簡介蜜蜂在發現花叢后會通過一種特殊的肢體語言來告知同伴新發現的食物源位置等信息,這種肢體語言就是ZigZag行舞蹈,是蜜蜂之間一種簡單傳達信息的方式。借此意義Zigbee作為新一代無線通訊技術的命名。在此之前ZigBee也被稱為“HomeRF Lite”、“RF- EasyLink”或“fireFly”無線電技術,統稱為ZigBee。 簡單的說,ZigBee是一種高可靠的無線數傳網絡,類似于CDMA和GSM網絡。ZigBee數傳模塊類似于移動網絡基站。通訊距離從標準的75m到幾百米、幾公里,并且支持無限擴展。 ZigBee是一個由可多到65000個無線數傳模塊組成的一個無線數傳網絡平臺,在整個網絡范圍內,每一個ZigBee網絡數傳模塊之間可以相互通信,每個網絡節點間的距離可以從標準的75m無限擴展。 與移動通信的CDMA網或GSM網不同的是,ZigBee網絡主要是為工業現場自動化控制數據傳輸而建立,因而,它必須具有簡單,使用方便,工作可靠,價格低的特點。而移動通信網主要是為語音通信而建立,每個基站價值一般都在百萬元人民幣以上,而每個ZigBee“基站”卻不到1000元人民幣。每個ZigBee網絡節點不僅本身可以作為監控對象,例如其所連接的傳感器直接進行數據采集和監控,還可以自動中轉別的網絡節點傳過來的數據資料。除此之外,每一個ZigBee網絡節點(FFD)還可在自己信號覆蓋的范圍內,和多個不承擔網絡信息中轉任務的孤立的子節點(RFD)無線連接。 2.3 傳感器簡介DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器,它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性和卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式存在OTP內存中,傳感器內部在檢測型號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,使其成為給類應用甚至最為苛刻的應用場合的最佳選擇。產品為4針單排引腳封裝,連接方便。精度濕度+-5%RH, 溫度+-2℃,量程濕度20-90%RH, 溫度0~50℃。
第3章 系統軟硬件設計3.1 硬件電路設計幾個作為終端接收溫濕度,在協調器上顯示,如果超過溫濕度設定,就會亮燈并顯示太高字樣。 實驗原理圖:
0.png (104.18 KB, 下載次數: 136)
下載附件
2019-1-14 20:28 上傳
射頻板的主控芯片是CC2530,所以控制部分電路圖如圖 
報警現象由led的亮閃觀察 
PCB設計圖  3.2 軟件程序設計
主程序流程圖 
(和各個分功能流程圖的介紹,可分小節介紹。) 1.溫濕度計算:可以計算出溫度和濕度的值,下面給出計算方法: temp(溫度)一byte2 .bytel=28.00(℃) humi(濕度)=byte4 .byte3=62.00 ( } RH) 檢驗一bytel+ byte2 + byte3+ byte4 =01011010=90(=溫度+濕度)(校驗正確) 2.協調器建立網絡流程圖 
3. 完成初始化 后通過原語的方式發起網絡。它有拒絕和允許節點加入網絡的權力,然后把各個節點的數 據采集匯總后發給上位機顯示出來。協調器發起網絡由功能函數Void ZDO Network For mation(byte LogicalType,devStartModes_ t StartMode,byte BeaconOrder,byte SuperframeOr der)來實現組建無線網絡。函數參數的意義說明如下: Logical腸pe是Byte類型的,代表該設備的類型。StartMode是Struct類型的,MOD E HARD申請新建網絡,MODE一OIN申請加入網絡,MODE_ RESUME重新新建網絡, MODE_ REJOIN重新加入網絡,BeaconOrder是Byte類型,是要建立的ZigBee網絡的信 標序號,SuperframeOrder也是一個Byte類型的,是要建立的ZigBee網絡的超幀信號。 當協調器上電后,其應用層通過發送原語NLME NETWORK-FORMATION.request發起新網絡的建立的進程,網絡層在收到請求后也通過發送原語NLME-SCAN.request來要求MAC層對信道進行能量掃描。MAC層通過NLME_ SCAN.confirm將掃描到的可用信道報告給網絡層,網絡層再發出NLME-SCAN.request搜索可用信道中其他未使用或使用最少的信道,MAC層將搜索結果報告給網絡層。如果沒有搜索到可用信道則表示新網絡建立失敗;如果搜到可用信道,則協調器確定一個PAN ID和16位網絡地址,如果在NLME一ETWORK_DISCOVERY request原語中指定了PAN ID而且與原來存在的不沖突,則使用指定的PAN ID,否則使用隨機選擇的,但要求PAN ID在0x0000^-Ox3FFF范圍內,協調器網絡地址一般為0x0000。之后,網絡層發出MLME-SET.request通知MAC層設置這些參數,收到MAC的確認后,NWK發出MLME-START.request原語啟動新網路的建立新網絡建立后,發送NLMEes NETWORKse FORMATION.confirm原語通知應用層最終結果。 主要代碼:
第4章 系統的調試和結論
6.1準備工作
首先要排除硬件的各種問題,比如接觸不良,短路,電源不穩定等,然后開始上電測試。由于我們是在實驗階段,所以先選用少量的節點來做測試。我們測試時所用的硬件有:
計算機一臺,仿真器一個,兩個終端節點(RFD),一個協調器((FFD)o
在ZigBee協議棧移植后,在進行部分軟件的編寫和修改后,分別把程序下載到協調
器和終端節點。我們測試所用的軟件是IAR嵌入式集成開發環境。
在測試中,網絡拓撲類型選擇星型網絡,兩個終端節點采用三節1.5V電池供電,協調器采用USB供電,并通過串口與計算機相連。由于現在的筆記本沒有9針串口,因此我們采用USB轉串口來和計算機通信。
這時我們就要對終端節點和協調器進行穩定性測試和安全性測試。
1)穩定性測試
把終端節點的電源模式設定為完全功能模式(CPMO),協調器沒有休眠模式,因此不用設置。長時間運行48小時以上,檢查各個模塊是否運轉正常,電壓是否在正常值范圍之內,液晶是否清晰可見無閃屏現象。
2)安全性測試
檢查各類接口,保證不短路,長時間運行程序后,檢查芯片溫度以及工作電壓,防止燒壞。在硬件測試結束后,我們測試下傳感器采集溫濕度是否正常,利用串口調試助手測試下9針串口的通信。
4.2組網測試
在硬件測試都無異常,各部分測試都正常后,我們就開始進行組網測試。
1)配置傳感器節點
在Z-Stack協議棧移植后,用IAR集成開發軟件打開組網測試程序,選擇SensorBB,選擇Project->Rebuild All編譯,在編譯完全通過后,連接PC、仿真器和目標板Q2530BB,按下仿真器的Reset鍵,此時仿真器指示燈應正常,點擊Debug按鈕進行下載,待下載進度條消失,左上角出現調試窗口時,點擊退出調試狀態,拔除DEBUG線,重啟目標板電源或按下目標板的Reset鍵,此時LED 1, LED2慢速閃爍,目標己被設定為終端傳感器節點。
2)配置協調器節點
選擇CollectorEB,選擇Project->Rebuild All編譯,編譯完全通過后,連接PC、仿真
器和目標板Q2530EB,按下仿真器的Reset鍵,此時仿真器指示燈應正常,點擊Debug進行下載,待下載進度條消失,左上角出現調試窗口,點擊全速運行按鈕,目標板LED 1,LED2同時閃爍,此時LCD屏顯示為當前節點的IEEE地址。
(1)此時如果退出調試狀態,拔掉Debug線,重啟目標板電源,按下reset鍵,目標板已被設定為網絡路由器節點
(2)此時如果按下U3的UP鍵,則LED 1 /LED3長亮,LED2閃爍,點擊退出調試狀態,拔掉目標板上的Debug線,重啟目標板電源或按下目標板的Reset鍵,此時LED 1 /LED3長亮,LED2閃爍,目標板己被設定為網絡協調器節點。關閉網路中所有節點電源,將協調器的串口與計算機連接起來,打開ZigBee協議分析軟件,選擇COM1口,波特率為9600,開啟協調器電源,這樣ZigBee的網絡建立好了。 首先觀察兩個節點加入網絡的時間,sensorl加入網絡的時間是2.5秒,sensor2加入網絡的時間是2秒。終端節點綁定以后就開始自動采集溫濕度數據,并將采集到的數據通過ZigBee協議傳輸給協調器,然后協調器通過串口通信協議傳到上位機界面顯示出來。
第5章 總結和展望
5.1 總結
本次設計的無線溫濕度監測網絡是基于ZigBee協議的短距離、低功耗的無線通信網絡,一般用于溫室大棚,花園等。針對農作物的生長需要最適宜的溫濕度,所以我們選用復合數字溫濕度傳感器DHT 11來測量溫濕度,和CC2530芯片一同組成了采集溫濕度的傳感器節點。此節點功耗低、成本低、傳輸數據穩定。另外的一大特色是使用了ZigBee協議棧來組建無線傳感器網絡,這樣可以使溫濕度數據可以通過無線來傳輸。最后還設計了上位機的界面顯示,可以實時顯示溫濕度數據,可以在辦公室內就可以清楚的知道溫室大棚內的溫濕度情況,極大的減輕了工作人員的勞動強度。
隨著人們生活水平的提高,溫室大棚經歷了從傳統的利用儀器儀表手動檢測,到現在的利用無線網絡自動檢測,并且逐漸向智能化方向發展。
本文的研究重點在于對ZigBee協議棧的組網研究上,ZigBee協議是一種基于IEEE802.15.4標準的協議,采用了分層的構架。而在ZigBee協議棧中基于開發的程序主要集中在網絡層,應用層。ZigBee協議棧基于原語問答的方式實現系統通信功能,對于硬件的設計使用了SOC解決方案,并且參照某些開發板的電路圖,使得整個硬件設計過程變得不復雜,減少了開發的周期。
5.2 展望
ZigBee技術畢竟還是一門新興的通信技術,在使用和推廣中還有很多地方要改進。論文寫作過程中雖然參閱了許多文獻資料和別人的研究成果,但是由于時間和能力的有限,還有很多因素和問題沒有考慮進去,所以還存在很多不足,在后續的工作中將主要從以下幾個方面提高研究水平:
1)在硬件電路設計方面:對于高頻電路分布參數以及天線電路的設計還有一些不足,由高頻電路造成的電磁干擾在一定程度上影響了節點采集數據的準確度。其次是盡量將電路板設計的更小,這樣更加便于攜帶。這就需要對從元件選型到電路布局布線設計等方面做出調整。
2)對ZigBee協議棧的理解明顯不足。對于細節的把握還很欠缺,這直接影響到了協議棧的具體開發工作。軟件的架構還有完善的地方,對于路由選擇還有很大的空間進行優化。代碼還可以進一步精簡,這樣可以提高程序的執行效率,提高代碼的健壯性。 - /*********************************************************************
- * 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.
- }
- }
復制代碼
完整的Word格式文檔51黑下載地址:
基于zigbee的大棚溫濕度監控報警系統.doc
(425.5 KB, 下載次數: 257)
2019-1-14 20:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|