找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 13938|回复: 5
收起左侧

基于zigbee的大棚温湿度监控报警系统设计(CC2530+DHT11)

  [复制链接]
ID:468138 发表于 2019-1-14 20:28 | 显示全部楼层 |阅读模式
摘 要
  温度和湿度是保证农作物良好生长的两个重要的因素,因此检测温湿度就显得尤为重要。传统的检测温湿度是通过仪器仪表到温室大棚内检测、记录,然后再通过相应的设备来调整温湿度。若可通过组建无线网络来检测温湿度,既可避免传统有线传输的布线复杂、出现故障很难检查等问题,又减小了成本,使得检测温湿度更加方便。
  本文主要设计研究了基于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

射频板的主控芯片是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协议栈的理解明显不足。对于细节的把握还很欠缺,这直接影响到了协议栈的具体开发工作。软件的架构还有完善的地方,对于路由选择还有很大的空间进行优化。代码还可以进一步精简,这样可以提高程序的执行效率,提高代码的健壮性。

  1. /*********************************************************************
  2. * INCLUDES
  3. */
  4. #include "OSAL.h"
  5. #include "ZGlobals.h"
  6. #include "AF.h"
  7. #include "aps_groups.h"
  8. #include "ZDApp.h"

  9. #include "SampleApp.h"
  10. #include "SampleAppHw.h"

  11. #include "OnBoard.h"

  12. /* HAL */
  13. #include "hal_lcd.h"
  14. #include "hal_led.h"
  15. #include "hal_key.h"

  16. /*********************************************************************
  17. * MACROS
  18. */

  19. /*********************************************************************
  20. * CONSTANTS
  21. */

  22. /*********************************************************************
  23. * TYPEDEFS
  24. */

  25. /*********************************************************************
  26. * GLOBAL VARIABLES
  27. */

  28. // This list should be filled with Application specific Cluster IDs.
  29. const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =
  30. {
  31.   SAMPLEAPP_PERIODIC_CLUSTERID,
  32.   SAMPLEAPP_FLASH_CLUSTERID
  33. };

  34. const SimpleDescriptionFormat_t SampleApp_SimpleDesc =
  35. {
  36.   SAMPLEAPP_ENDPOINT,              //  int Endpoint;
  37.   SAMPLEAPP_PROFID,                //  uint16 AppProfId[2];
  38.   SAMPLEAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  39.   SAMPLEAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  40.   SAMPLEAPP_FLAGS,                 //  int   AppFlags:4;
  41.   SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
  42.   (cId_t *)SampleApp_ClusterList,  //  uint8 *pAppInClusterList;
  43.   SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
  44.   (cId_t *)SampleApp_ClusterList   //  uint8 *pAppInClusterList;
  45. };

  46. // This is the Endpoint/Interface description.  It is defined here, but
  47. // filled-in in SampleApp_Init().  Another way to go would be to fill
  48. // in the structure here and make it a "const" (in code space).  The
  49. // way it's defined in this sample app it is define in RAM.
  50. endPointDesc_t SampleApp_epDesc;

  51. /*********************************************************************
  52. * EXTERNAL VARIABLES
  53. */

  54. /*********************************************************************
  55. * EXTERNAL FUNCTIONS
  56. */

  57. /*********************************************************************
  58. * LOCAL VARIABLES
  59. */
  60. uint8 SampleApp_TaskID;   // Task ID for internal task/event processing
  61.                           // This variable will be received when
  62.                           // SampleApp_Init() is called.
  63. devStates_t SampleApp_NwkState;

  64. uint8 SampleApp_TransID;  // This is the unique message ID (counter)

  65. afAddrType_t SampleApp_Periodic_DstAddr;
  66. afAddrType_t SampleApp_Flash_DstAddr;

  67. aps_Group_t SampleApp_Group;

  68. uint8 SampleAppPeriodicCounter = 0;
  69. uint8 SampleAppFlashCounter = 0;

  70. /*********************************************************************
  71. * LOCAL FUNCTIONS
  72. */
  73. void SampleApp_HandleKeys( uint8 shift, uint8 keys );
  74. void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
  75. void SampleApp_SendPeriodicMessage( void );
  76. void SampleApp_SendFlashMessage( uint16 flashTime );

  77. /*********************************************************************
  78. * NETWORK LAYER CALLBACKS
  79. */

  80. /*********************************************************************
  81. * PUBLIC FUNCTIONS
  82. */

  83. /*********************************************************************
  84. * @fn      SampleApp_Init
  85. *
  86. * @brief   Initialization function for the Generic App Task.
  87. *          This is called during initialization and should contain
  88. *          any application specific initialization (ie. hardware
  89. *          initialization/setup, table initialization, power up
  90. *          notificaiton ... ).
  91. *
  92. * @param   task_id - the ID assigned by OSAL.  This ID should be
  93. *                    used to send messages and set timers.
  94. *
  95. * @return  none
  96. */
  97. void SampleApp_Init( uint8 task_id )
  98. {
  99.   SampleApp_TaskID = task_id;
  100.   SampleApp_NwkState = DEV_INIT;
  101.   SampleApp_TransID = 0;

  102.   // Device hardware initialization can be added here or in main() (Zmain.c).
  103.   // If the hardware is application specific - add it here.
  104.   // If the hardware is other parts of the device add it in main().

  105. #if defined ( BUILD_ALL_DEVICES )
  106.   // The "Demo" target is setup to have BUILD_ALL_DEVICES and HOLD_AUTO_START
  107.   // We are looking at a jumper (defined in SampleAppHw.c) to be jumpered
  108.   // together - if they are - we will start up a coordinator. Otherwise,
  109.   // the device will start as a router.
  110.   if ( readCoordinatorJumper() )
  111.     zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR;
  112.   else
  113.     zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER;
  114. #endif // BUILD_ALL_DEVICES

  115. #if defined ( HOLD_AUTO_START )
  116.   // HOLD_AUTO_START is a compile option that will surpress ZDApp
  117.   //  from starting the device and wait for the application to
  118.   //  start the device.
  119.   ZDOInitDevice(0);
  120. #endif

  121.   // Setup for the periodic message's destination address
  122.   // Broadcast to everyone
  123.   SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
  124.   SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
  125.   SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;

  126.   // Setup for the flash command's destination address - Group 1
  127.   SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;
  128.   SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
  129.   SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;

  130.   // Fill out the endpoint description.
  131.   SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;
  132.   SampleApp_epDesc.task_id = &SampleApp_TaskID;
  133.   SampleApp_epDesc.simpleDesc
  134.             = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
  135.   SampleApp_epDesc.latencyReq = noLatencyReqs;

  136.   // Register the endpoint description with the AF
  137.   afRegister( &SampleApp_epDesc );

  138.   // Register for all key events - This app will handle all key events
  139.   RegisterForKeys( SampleApp_TaskID );

  140.   // By default, all devices start out in Group 1
  141.   SampleApp_Group.ID = 0x0001;
  142.   osal_memcpy( SampleApp_Group.name, "Group 1", 7  );
  143.   aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );

  144. #if defined ( LCD_SUPPORTED )
  145.   HalLcdWriteString( "SampleApp", HAL_LCD_LINE_1 );
  146. #endif
  147. }

  148. /*********************************************************************
  149. * @fn      SampleApp_ProcessEvent
  150. *
  151. * @brief   Generic Application Task event processor.  This function
  152. *          is called to process all events for the task.  Events
  153. *          include timers, messages and any other user defined events.
  154. *
  155. * @param   task_id  - The OSAL assigned task ID.
  156. * @param   events - events to process.  This is a bit map and can
  157. *                   contain more than one event.
  158. *
  159. * @return  none
  160. */
  161. uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
  162. {
  163.   afIncomingMSGPacket_t *MSGpkt;
  164.   (void)task_id;  // Intentionally unreferenced parameter

  165.   if ( events & SYS_EVENT_MSG )
  166.   {
  167.     MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
  168.     while ( MSGpkt )
  169.     {
  170.       switch ( MSGpkt->hdr.event )
  171.       {
  172.         // Received when a key is pressed
  173.         case KEY_CHANGE:
  174.           SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
  175.           break;

  176.         // Received when a messages is received (OTA) for this endpoint
  177.         case AF_INCOMING_MSG_CMD:
  178.           SampleApp_MessageMSGCB( MSGpkt );
  179.           break;

  180.         // Received whenever the device changes state in the network
  181.         case ZDO_STATE_CHANGE:
  182.           SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
  183.           if ( (SampleApp_NwkState == DEV_ZB_COORD)
  184.               || (SampleApp_NwkState == DEV_ROUTER)
  185.               || (SampleApp_NwkState == DEV_END_DEVICE) )
  186.           {
  187.             // Start sending the periodic message in a regular interval.
  188.             osal_start_timerEx( SampleApp_TaskID,
  189.                               SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
  190.                               SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
  191.           }
  192.           else
  193.           {
  194.             // Device is no longer in the network
  195.           }
  196.           break;

  197.         default:
  198.           break;
  199.       }

  200.       // Release the memory
  201.       osal_msg_deallocate( (uint8 *)MSGpkt );

  202.       // Next - if one is available
  203.       MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
  204.     }

  205.     // return unprocessed events
  206.     return (events ^ SYS_EVENT_MSG);
  207.   }

  208.   // Send a message out - This event is generated by a timer
  209.   //  (setup in SampleApp_Init()).
  210.   if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
  211.   {
  212.     // Send the periodic message
  213.     SampleApp_SendPeriodicMessage();

  214.     // Setup to send message again in normal period (+ a little jitter)
  215.     osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
  216.         (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );

  217.     // return unprocessed events
  218.     return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
  219.   }

  220.   // Discard unknown events
  221.   return 0;
  222. }

  223. /*********************************************************************
  224. * Event Generation Functions
  225. */
  226. /*********************************************************************
  227. * @fn      SampleApp_HandleKeys
  228. *
  229. * @brief   Handles all key events for this device.
  230. *
  231. * @param   shift - true if in shift/alt.
  232. * @param   keys - bit field for key events. Valid entries:
  233. *                 HAL_KEY_SW_2
  234. *                 HAL_KEY_SW_1
  235. *
  236. * @return  none
  237. */
  238. void SampleApp_HandleKeys( uint8 shift, uint8 keys )
  239. {
  240.   (void)shift;  // Intentionally unreferenced parameter

  241.   if ( keys & HAL_KEY_SW_1 )
  242.   {
  243.     /* This key sends the Flash Command is sent to Group 1.
  244.      * This device will not receive the Flash Command from this
  245.      * device (even if it belongs to group 1).
  246.      */
  247.     SampleApp_SendFlashMessage( SAMPLEAPP_FLASH_DURATION );
  248.   }

  249.   if ( keys & HAL_KEY_SW_2 )
  250.   {
  251.     /* The Flashr Command is sent to Group 1.
  252.      * This key toggles this device in and out of group 1.
  253.      * If this device doesn't belong to group 1, this application
  254.      * will not receive the Flash command sent to group 1.
  255.      */
  256.     aps_Group_t *grp;
  257.     grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
  258.     if ( grp )
  259.     {
  260.       // Remove from the group
  261.       aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
  262.     }
  263.     else
  264.     {
  265.       // Add to the flash group
  266.       aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
  267.     }
  268.   }
  269. }

  270. /*********************************************************************
  271. * LOCAL FUNCTIONS
  272. */

  273. /*********************************************************************
  274. * @fn      SampleApp_MessageMSGCB
  275. *
  276. * @brief   Data message processor callback.  This function processes
  277. *          any incoming data - probably from other devices.  So, based
  278. *          on cluster ID, perform the intended action.
  279. *
  280. * @param   none
  281. *
  282. * @return  none
  283. */
  284. void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
  285. {
  286.   uint16 flashTime;

  287.   switch ( pkt->clusterId )
  288.   {
  289.     case SAMPLEAPP_PERIODIC_CLUSTERID:
  290.       break;

  291.     case SAMPLEAPP_FLASH_CLUSTERID:
  292.       flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
  293.       HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
  294.       break;
  295.   }
  296. }

  297. /*********************************************************************
  298. * @fn      SampleApp_SendPeriodicMessage
  299. *
  300. * @brief   Send the periodic message.
  301. *
  302. * @param   none
  303. *
  304. * @return  none
  305. */
  306. void SampleApp_SendPeriodicMessage( void )
  307. {
  308.   if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
  309.                        SAMPLEAPP_PERIODIC_CLUSTERID,
  310.                        1,
  311.                        (uint8*)&SampleAppPeriodicCounter,
  312.                        &SampleApp_TransID,
  313.                        AF_DISCV_ROUTE,
  314.                        AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  315.   {
  316.   }
  317.   else
  318.   {
  319.     // Error occurred in request to send.
  320.   }
  321. }

  322. /*********************************************************************
  323. * @fn      SampleApp_SendFlashMessage
  324. *
  325. * @brief   Send the flash message to group 1.
  326. *
  327. * @param   flashTime - in milliseconds
  328. *
  329. * @return  none
  330. */
  331. void SampleApp_SendFlashMessage( uint16 flashTime )
  332. {
  333.   uint8 buffer[3];
  334.   buffer[0] = (uint8)(SampleAppFlashCounter++);
  335.   buffer[1] = LO_UINT16( flashTime );
  336.   buffer[2] = HI_UINT16( flashTime );

  337.   if ( AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc,
  338.                        SAMPLEAPP_FLASH_CLUSTERID,
  339.                        3,
  340.                        buffer,
  341.                        &SampleApp_TransID,
  342.                        AF_DISCV_ROUTE,
  343.                        AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  344.   {
  345.   }
  346.   else
  347.   {
  348.     // Error occurred in request to send.
  349.   }
  350. }
复制代码


完整的Word格式文档51黑下载地址:
基于zigbee的大棚温湿度监控报警系统.doc (425.5 KB, 下载次数: 257)



评分

参与人数 2黑币 +80 收起 理由
cheng95 + 30
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

举报

ID:693810 发表于 2020-4-20 19:18 | 显示全部楼层
有源文件吗
回复

举报

ID:819918 发表于 2020-9-17 09:31 | 显示全部楼层
楼主,可以把源码放出来吗?
回复

举报

ID:820816 发表于 2021-5-15 05:17 来自触屏版 | 显示全部楼层
放个源程序呗
回复

举报

ID:150442 发表于 2021-6-23 22:17 | 显示全部楼层
具有指导意义!!!
回复

举报

ID:1111210 发表于 2024-4-3 17:28 | 显示全部楼层
怎么移植zstack工程到IAR?
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表