基于ZigBee的无线温度监控系统的设计
扫描二维码
随时随地手机看文章
摘要:文章使甩ZigBee无线数传模块DRF1605作为数据通信的核心模块,设计了一个小型的温度监控系统,可以远程与温度节点建立联系,设定温度和读取温度,实现了温度信号的检测与控制。设计方法简单快速、使用界面友好,通过分置在多个地点的ZigBee温度采集模块,可以方便地实现多点分布式温度信号的采集。
关键词:无线数传;ZigBee模块;温度监控
0 前言
ZigBee协议是基于IEEE802.15.4标准的低功耗、短距离的无线通信个域网协议,与传统无线通信技术(如蓝牙、红外、宽带卫星、3G、WLAN)相比,具有距离短、复杂度低、自组网功能、低功耗、低成本等优点,适用于自动及远程控制领域。而ZigBee模块具有高度集成化的特点,可以轻松嵌入各种便携式设备,使用户无需考虑模块的运行原理,只需要将自己的数据通过标准传输方式发送至模块中,模块便可依据预先配置好的网络结构,与网络中的目的节点进行双向通信。本设计使用ZigBee无线数传模块DRF1605搭建了一个基于MESH网络的小型温度监控系统,实现主机上位机程序和终端节点间温度信号与控制信号的双向通讯。
1 系统结构
设计使用ZigBee无线数传模块DRF1605作为数据通信的核心模块,可以远程与温度节点建立联系,设定和读取温度,实现温度的检测和控制。系统包含3个模块:PC机端的上位机监控模块、ZigBee无线数传模块、AVR单片机控制模块。处于监测点的AVR单片机控制模块对温度传感器DS18B20采集的温度数据进行处理,通过UART的方式发送给ZigBee终端节点模块,由ZigBee中心节点模块接收,并通过RS232端口返回至PC机端的用户界面。用户在用户界面可以获取监测点的当前温度并设定监测点的预设温度,AVR单片机控制模块依据用户UI设定的预设温度与当前监测点温度的对比实现温度信号的监控。系统架构如图1所示。
2 ZigBee数据传输模块
ZigBee无线数传模块采用DTK厂家开发的完整功能模块DRF1605,附带RS232的总线接口板。DRF1605基于TI公司CC2530F256芯片,满足ZigBee2007/PRO协议的全部特点,且CC2530F256芯片出厂时已自带IEEE地址,用户无需另行购买IEEE地址(MAC地址),IEEE地址可作为Zig Bee模块的标识。DRF1605结构框图如图2所示。
一个完整的ZigBee MESH网络包含3种节点:中心节点、路由节点和终端采集节点,相邻节点之间支持75M距离传输。在短距通信中,可以不使用路由器节点。本设计中的ZigBee数据传输采用两种节点:协调(Coordinator)节点和终端(Route)节点。其中,协调节点为中心节点,与PC机相连,负责发送PC机数据和接收来自温度采集模块的信息;终端节点与单片机相连,负责发送温度采集模块的信息和接收PC机数据。2个模块可以实现上电自动组网,Coordinator节点自动给所有的节点分配地址,不需要用户手动分配地址,具有断电自动保护等优点,而且极易拓展,由于终端节点的设备配置方式基本一致,因此可以依据现有的终端节点迅速实现节点拓展,新加入的节点将异步完成网络加入和重构,且当节点出现故障时,ZigBee模块可以迅速重新架构网络,保证数据网络的正常通讯。
DRF1605可以形象的理解为“无线的RS232连接”,简单易用,不用考虑ZigBee协议,串口数据透明传输。有两种数据传输方式:Coordi nator节点从串口接收到的数据会自动发送给所有的节点,终端节点从串口接收到的数据,会自动发送给Coordinator节点;也可以通过串口在任意节点间进行数据传输,数据传输的格式为:0xFD(数据传输命令)+0x0A(数据长度)+0x73 0x79(目标地址)+0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0X10(数据,共0x0A字节)。
3 AVR单片机控制模块
AVR单片机控制模块由2部分组成:单片机最小系统以及DS18B20温度采集模块,如图3中虚线框所示。其中,单片机系统的RX、TX两个引脚和ZigBee模块的TX、RX引脚相连,负责UART的通讯。单片机的PCI引脚与DS18B20的数据端相连,接收来自温度传感器的温度数据。此外,单片机上的PA0和PA1两个引脚分别引出,用来指示不同的温度控制响应。
3.1 温度采集模块
温度采集模块由温度传感器DS18B20构成。由于DS18B20采用1-WIRE数据传输协议,仅使用1根数据线即可实现与单片机芯片的双向通讯(包括传输温度信息),接线方便,非常适用于农业大棚、洁净室、机房等多种非极限测温场合。设计采用寄生电源供电方式,电路连接如图4所示,由ATMega16的PCI采集温度数据。
DS18B20的内部有64位的ROM单元和9字节的RAM单元。64位的ROM包含了DS18B20唯一的序列号,因此DS18B20支持多点组网功能,多至阶DS18B20可以同时存在一条总线上,实现多点测温,由ROM读取操作来判断选择某点的DS18B20温度数据。在9字节RAM单元中,字节0-1是温度寄存器,用来保存转换好的温度,共16bits。其中,bit0-bit7为LSB,分别保存权值为2-4至23的数据;bit8-bit15为MSB,bit8-bit10保存权值为24至26的数据,bit11-bit15为符号位,DS18B20的分辨率为0.0625,温度计算公式为:temperature=(MSB+LSB)×256x0.062。DS18 B20内部还有2个E2PROM字节TH和TL,用于配置温度最高界限和温度最低界限,用户通过设置这2个寄存器的值可以设定温度报警的上下限。
3.2 单片机控制系统
单片机控制系统使用Atmel公司的ATMega16L芯片作为主控芯片,实现温度数据的采集、串行数据的发送与接收,以及根据上位机的设定温度和当前温度比对结果做出加热或降温响应。数据传输和温度信号采集部分的主要程序如下。
1 UART数据接收模块
利用单片机内部自带的接收中断来完成数据接收模块。在此之前,需要对UART寄存器进行如下配置:异步模式、8位数据位、无校验位、1位停止位。波特率设置函数为:UBRRL=(CRYSTAL/BAUD/16-1)%256和UBRRH=(CRYSTAL/BAUD/16-1)/256。
2 UART数据发送模块
当系统调用字符发送函数时,会先判断发送寄存器是否为空,如果为空,则函数会向UART的I/O数据寄存器UDR写入待发送的字符,格式为char型(8bits)。单片机接收到来自DS18B20的温度数据,分别取出温度的整数位和小数位,添加小数点后,将所有的整数位和小数点后两位数据发送给UART。温度数据以字符数组的形式保存,因此发送时以字符串的形式发送数据。
3.DS18B20温度数据接收模块
完成对DS18B20的报警温度的设置和当前温度的读取。单片机与DS18B20的通讯,一般需要经过3个步骤:(1)DS18B20复位;(2)执行ROM指令,对于总线上挂接多个DS18B20的情况,通过读取ROM里的序列号来匹配某个DS18B20,否则可以直接跳过ROM指令(0XCC);(3)执行DS18B20功能指令(RAM指令)。DS18B20有2个常用的功能指令:0x44:开始转换温度,转换好的温度会储存在暂存器字节0和1;最小频率不得小于750ms。0xBE:读RAM指令,依次读取RAM的9个字节的数据。DS18B20复位可以终止此进程。
4 上位机GUI监控模块
该模块是基于WINDOWS系统开发的上位机程序,通过系统预设的API函数与主机RS232底层端口进行通讯和捕获用户输入。用户可以通过用户UI界面自行设定预设温度值,通过主机RS232端口发送至ZigBee模块;ZigBee模块将接收来自ROUTE终端节点的温度信息,并反馈至上位机程序。用户界面的设计采用跨平台的图形用户界面应用程序QT软件,采用第三方开源qextsertalport类,对串口进行读写操作。在WINDOWS下,需要使用其中的6个文件:qextserialbase.cpp和qextserialbase.h,qextserialport.cpp和qextserialport.h,win qextserialpo rt.cpp和win qextserialport.h定义的API接口函数,具体如下。
4.1 建立串口
serialPort=new ManageSedalPort;
connect(serialPort,SIGNAL(newDataReeeived(const QByteArray&)),this,SLOT(slot_new DataReceived(const QByteArray&)));
基于ManageSerialPort类新建一个串口对象serialPort,包含对串口名、波特率、数据位、起始位、停止位、校验位等变量的定义以及设定这些变量的相关函数。第二条语句是一个信号连接槽的函数,将serialPort的信号SIGNAL与槽SLOT相连接,在这种情况下,每当发送这个信号的时候,就会自动调用这个槽。
4.2 打开串口
包括了对串口常用参数:串口名、波特率、数据位、起始位、停止位、发送接收使能等的设置。
4.3 发送数据
serialPort->scndData(temp);
调用对象sendData,将变量temp的数据通过串口RS232发送。通过返回值来指示发送状态:1表示数据发送成功;2表示未打开串口;3表示发送使能但无发送数据。主要用于发送预设温度值,UI界面接收到用户设定的预设温度后,将其保存,并在用户按下发送按钮后,将数据通过RS232串口发送给ZigBee模块。
4.4 接收数据
QString decodedStr=in.readAll();
这里rcadAll()函数是使用在槽slot_new DataReceived(const QByteArray&dataReeeived)中负责对数据接收的操作函数,由于之前在串口定义时,已经将信号与槽函数关联,因此,当串口缓冲区有数据时,会自动调用此槽函数,进行读串口操作,并通过readAll()函数读取串口缓冲区数据(即来自单片机DS18B20的温度数据),给临时变量decodeStr。
4.5 串口关闭操作
serialPort->close(); -调用close()子函数关闭串口对象
设计后的用户UI界面如图5所示,左部分为通信串口的设置,串口和波特率均可调整,默认使用COM1、38400波特率;中部为系统预设温度;右部为系统数据返回,当接收到来自串口的温度数据后,欢迎界面将显示系统当前温度。
5 结语
基于ZigBee模块设计的无线温度监控系统,具有ZigBee技术的低复杂度、低功耗、低成本等优点,同时由于ZigBee模块的高集成化,用户不需要了解复杂的ZigBee协议,所有的ZigBee协议的处理部分,在ZigBee模块内部自动完成,用户只需要通过串口传输数据即可,研发周期短,满足了产品快速入市,适应市场快速变化的需求,通过分置在多个地点的ZigBee温度采集模块,可以方便的实现多点分布式温度信号的采集。