基于zigbee的温度采集系统.docx

上传人:b****6 文档编号:4299733 上传时间:2022-11-29 格式:DOCX 页数:15 大小:264.86KB
下载 相关 举报
基于zigbee的温度采集系统.docx_第1页
第1页 / 共15页
基于zigbee的温度采集系统.docx_第2页
第2页 / 共15页
基于zigbee的温度采集系统.docx_第3页
第3页 / 共15页
基于zigbee的温度采集系统.docx_第4页
第4页 / 共15页
基于zigbee的温度采集系统.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于zigbee的温度采集系统.docx

《基于zigbee的温度采集系统.docx》由会员分享,可在线阅读,更多相关《基于zigbee的温度采集系统.docx(15页珍藏版)》请在冰豆网上搜索。

基于zigbee的温度采集系统.docx

基于zigbee的温度采集系统

基于zigbee的温度采集实验

作者:

姚志强

一般而言,无线传感网络具有采集点众多,分布面积广;网络节点间的位置关系不定,节点动态加入或脱离网络等特性。

Z-Stack2007协议栈具有这些实验功能特性。

5.3.1实验目的与器材

1)实验目的

本实验将利用Z-Stack2007协议栈构建一个具有实际意义的无线传感器网络。

该网络中具有采集节点和传感节点。

传感节点连接各种传感器,利用传感器获取环境温度、光照等外界信息。

采集节点负责接收该zigbee网络里传感节点的信息,并通过串口上传至PC端的串口助手进行显示。

采集节点,上电启动后负责建立网络,并开启允许绑定功能;传感节点,上电启动后加入网络,并自动发起绑定请求,待采集节点建立绑定后,将传感器节点的外界温度信息和光照信息发送到采集节点上。

为了实验简单,只有一个采集节点收集这些信息,处理后通过串口上传到计算机,可以在串口调试工具上看到,为了提高网络的负载能力,可以增加中心收集节点。

所以我们可以建立星形拓扑网络,协调器是采集节点,终端节点是传感节点。

为了实现上述实验目的,应该做到:

◆自动形成一个网络;

◆传感器设备必须能自动加入网络,并自动完成绑定;

◆如果传感器设备没有从中心节点收到应答,它将自动移除到该中心节点的绑定。

然后它将自动的去发现新的中心节点绑定。

本实验中传感节点具有获取节点内部温度信息、外界温度信息、外界光照信息等功能。

2)实验器材

◆4个CC2530开发模块(1个采集器节点,1个路由器,2个传感器节点);

◆2个DS18B20温度传感器;

◆2个光敏电阻;

5.3.2实验原理与步骤

1)硬件介绍

1温度传感器DS18b20

DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种数字化单总线器件。

属于新一代适配微处理器的改进型智能温度传感器。

它能够直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

可以分别在93.75ms和750ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写。

其测量温度范围为-55℃~+125℃。

现场温度直接以“一线总线”的数字方式传输,用符号扩展的16位数字方式串行输出,大大提高了系统的抗干扰性。

广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。

DS18B20的性能特点如下:

●采用DALLAS公司独特的单线接口方式:

DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;

●在使用中不需要任何外围元件;

●可用数据线供电,供电电压范围:

+3.0V~+5.5V;

●测温范围:

-55~+125℃。

固有测温分辨率为0.5℃。

当在-10℃~+85℃范围内,可确保测量误差不超过0.5℃,在-55~+125℃范围内,测量误差也不超过2℃;

●通过编程可实现9~12位的数字读数方式;

●用户可自设定非易失性的报警上下限值;

●支持多点的组网功能,多个DS18B20可以并联在唯一的三线上,实现多点测温

●负压特性,即具有电源反接保护电路。

当电源电压的极性反接时,能保护DS18B20不会因发热而烧毁,但此时芯片无法正常工作;

●DS18B20的转换速率比较高,进行9位的温度值转换只需93.75ms;

●适配各种单片机或系统;

●内含64位激光修正的只读存储ROM,扣除8位产品系列号和8位循环冗余校验码(CRC)之后,产品序号占48位。

出厂前产品序号存入其ROM中。

在构成大型温控系统时,允许在单线总线上挂接多片DS18B20。

DS18b20温度传感器实物如图所示。

图DS18b20温度传感器实物图

Zigbee实验板与温度传感器18b20的连接如图所示

图Zigbee实验板与温度传感器18b20的连接

ZigBee芯片通过P6_2管脚读取DS18b20所产生的温度数据。

2光敏电阻器

光敏电阻器是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;入射光强,电阻减小,入射光弱,电阻增大。

光敏电阻器一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化)。

常用的光敏电阻器硫化镉光敏电阻器,它是由半导体材料制成的。

光敏电阻器的阻值随入射光线(可见光)的强弱变化而变化,在黑暗条件下,它的阻值(暗阻)可达1~10M欧,在强光条件(100LX)下,它阻值(亮阻)仅有几百至数千欧姆。

光敏电阻器对光的敏感性(即光谱特性)与人眼对可见光(0.4~0.76)μm的响应很接近,只要人眼可感受的光,都会引起它的阻值变化。

光敏电阻的主要参数:

光敏电阻的主要参数是:

光敏电阻的实验图

●光电流、亮电阻。

光敏电阻器在一定的外加电压下,当有光照射时,流过的电流称为光电流,外加电压与光电流之比称为亮电阻,常用“100LX”表示。

  

●暗电流、暗电阻。

光敏电阻在一定的外加电压下,当没有光照射的时候,流过的电流称为暗电流。

外加电压与暗电流之比称为暗电阻,常用“0LX”表示。

  

●灵敏度。

灵敏度是指光敏电阻不受光照射时的电阻值(暗电阻)与受光照射时的电阻值(亮电阻)的相对变化值。

  

●光谱响应。

光谱响应又称光谱灵敏度,是指光敏电阻在不同波长的单色光照射下的灵敏度。

若将不同波长下的灵敏度画成曲线,就可以得到光谱响应的曲线。

  

●光照特性。

光照特性指光敏电阻输出的电信号随光照度而变化的特性。

从光敏电阻的光照特性曲线可以看出,随着的光照强度的增加,光敏电阻的阻值开始迅速下降。

若进一步增大光照强度,则电阻值变化减小,然后逐渐趋向平缓。

在大多数情况下,该特性为非线性。

  

●伏安特性曲线。

伏安特性曲线用来描述光敏电阻的外加电压与光电流的关系,对于光敏器件来说,其光电流随外加电压的增大而增大。

  

●温度系数。

光敏电阻的光电效应受温度影响较大,部分光敏电阻在低温下的光电灵敏较高,而在高温下的灵敏度则较低。

  

●额定功率。

额定功率是指光敏电阻用于某种线路中所允许消耗的功率,当温度升高时,其消耗的功率就降低。

光照传感器实物如图所示

图光照传感器实物图

Zigbee实验板与光敏电阻的连接如图所示

图Zigbee实验板与光敏电阻的连接

将ZigBee芯片的P04引脚设置为AD采样的模拟输入引脚,这样由光敏电阻阻值变换所引起的电压的变化量就会反映在芯片的模拟输入引脚上,芯片根据电压的变化量可以判断出当前的光照强度。

2)程序流程

1传感节点发送数据流程

在节点成功加入网络并且同协调器绑定成功后,通过SimpleSensor.c文件中的zb_BindConfirm()函数来调用myApp_StartReporting()函数

1.voidzb_BindConfirm(uint16commandId,uint8status)

{

(void)commandId;

if((status==ZB_SUCCESS)&&(myAppState==APP_START))

{

myAppState=APP_BOUND;

myApp_StartReporting();

}

else

{

osal_start_timerEx(sapi_TaskID,MY_FIND_COLLECTOR_EVT,myBindRetryDelay);

}

}

2.在myApp_StartReporting()函数中触发测量温度事件。

voidmyApp_StartReporting(void)

{

osal_start_timerEx(sapi_TaskID,MY_REPORT_TEMP_EVT,myTempReportPeriod);

osal_start_timerEx(sapi_TaskID,MY_REPORT_BATT_EVT,myBatteryCheckPeriod);

}

3.在函数zb_HandleOsalEvent()中对该事件进行响应。

voidzb_HandleOsalEvent(uint16event)

{……

uint8pData[2];

if(event&MY_REPORT_EXTEMP_EVT)

{

pExTemp[0]=EXTEMP_REPORT;

myApp_ReadExTemperature();

osal_memcpy(pExTemp+1,ch,8);

zb_SendDataRequest(0xFFFF,SENSOR_REPORT_CMD_ID,9,pExTemp,0,AF_ACK_REQUEST,0);

}……

}

4.事件响应函数通过调用myApp_ReadExTemperature()函数读取当前温度值。

voidmyApp_ReadExTemperature(void)

{

UINT8temh,teml;

UINT16num;

UINT8i;

uint8Temp_channel;

P0DIR=0x00;

P1DIR|=0x0d;//设置P1.0,P1.2,P1.3为输出方式

P2DIR|=0x01;//同上

read_data();//读取温度

Temp_channel=0x31;

teml=sensor_data_value[0];

temh=sensor_data_value[1];

i=(Temp_channel-0x31)*2;

ch[0]=Temp_channel;//当前显示的传感器的编号

ch[1]='';

num=teml*625;//小数部分的取值每位代表0.0625(精度)

if(flag==1)//判断正负温度

{

ch[2]='-';//+0x2d为变"-"ASCII码

}

elsech[2]='+';

if(temh/100==0)

ch[3]='';

elsech[3]=temh/100+0x30;//+0x30为变0~9ASCII码

if((temh/10%10==0)&&(temh/100==0))

ch[4]='';

elsech[4]=temh/10%10+0x30;

ch[5]=temh%10+0x30;

ch[6]='.';

ch[7]=num/1000+0x30;//忽略小数点后1位的数

}

read_data()是负责从DS18b20中读取当前温度的函数,其中涉及到对DS18b20器件单总线结构的操作函数,该函数位于DS18B20.c文件中,详细操作流程请结合DS18b20相关数据手册参看附录中的程序清单,在此就不详细列出。

5.事件响应函数通过调用zb_SendDataRequest()函数将得到的温度值发送至协调器节点。

2汇聚节点接收数据流程

程序接收数据函数

voidzb_ReceiveDataIndication(uint16source,uint16command,uint16len,uint8*pData)

{

......

uint8sensorReading;

uint8tmpBuf[32];

uint8*outputBuf;

if(command==SENSOR_REPORT_CMD_ID)

{

sensorReading=pData[1];

outputBuf=tmpBuf;

switch(pData[0])

{

caseEXTEMP_REPORT:

tmpBuf[1]='7';

tmpBuf[6]='*';

while(i

{

tmpBuf[7+i]=pData[1+i];//接收到的数据

i++;

}

i=0;

tmpBuf[len+6]='#';

HalUARTWrite(Urtport,tmpBuf,len+7);//写串口向上位机报告

osal_mem_free(tmpBuf);

break;

default:

{

}

......

}

}

HalUARTWrite(HAL_UART_PORT_0,buf,32);

osal_set_event(sapi_TaskID,LED_TOGGLE_EVT);

}

接收到数据后,通过串口汇报给上位机程序。

程序的流程图如图所示。

图数据报告程序流程图

通过以上流程,由温度传感器DS18b20获得的温度数据就可以通过ZigBee网络发送至与ZigBee汇聚节点通信的上位机软件中。

完成对远程温度数据的采集工作。

3)实验步骤

第一步:

开发模块加电,并连接好仿真器。

利用IAR开发工具设置成debug,2个模块下载collector.c文件,2个模块下载sensor.c文件。

其中下载collector.c程序的模块是采集器,下载sensor.c程序的模块是传感器。

第二步:

下载成功后,先启动一个采集器,按顺序按下模块的上键->右键->下键,此时四个灯都一直亮,表明该采集器建立了网络,并可以让其他模块加入到该网络中。

第三步:

启动另一个采集器,按键上键即可,此时四个灯都一直亮。

第四步:

分别启动两个传感器,按下模块的下键,此时传感器模块的绿灯、红灯、黄灯一起快速闪烁,采集器的红灯在慢速闪烁,表明传感器的数据在不停的向采集器发送数据。

第五步:

采集数据,分析数据。

传感器每隔2秒一次上传至采集器。

4)程序清单

清单5.1读取传感器测出的外界温度信息

/******************************************************************************

*函数名myApp_ReadExTemperature

*描述读取传感器测出的外界温度信息AD采样使用P07管脚

*参数无

*返回值返回环境的温度信息,只保留了整数部分

*****************************************************************************/

staticuint8myApp_ReadExTemperature(void)

{

UINT8temh,teml;

read_data();//读取温度

teml=sensor_data_value[0];//小数部分

temh=sensor_data_value[1];//整数部分

returntemh;

}

清单5.2把读取的温度数据转换为真实的温度信息

/******************************************************************************

*函数名read_data

*描述利用read_1820函数读取温度数据之后,把温度数据转换为温度信息

*参数无

*返回值无

*****************************************************************************/

voidread_data(void)

{

UINT8temh,teml;

UINT8a,b,c;

init_1820();//复位18b20

write_1820(0xcc);//发出转换命令搜索器件

write_1820(0x44);//启动

Delay_nus(50000);

init_1820();

write_1820(0xcc);

write_1820(0xbe);

teml=read_1820();//读数据

temh=read_1820();

if(temh&0x80)//判断正负

{

flag=1;

c=0;

c=c|temh;

c=c&0x00ff;

c=c<<8;

a=c;

a=c|teml;

a=(a^0xffff);//异或

a=a+1;//取反加1

teml=a&0x0f;

temh=a>>4;

}

else

{

flag=0;//为正

a=temh<<4;

a+=(teml&0xf0)>>4;//得到高位的值

b=teml&0x0f;

temh=a;

teml=b&0x00ff;

}

sensor_data_value[0]=teml;

sensor_data_value[1]=temh;

}

清单5.3利用DS18B20读取温度数据函数

/******************************************************************************

*函数名read_1820

*描述利用DS18B20读取温度数据的底层函数

*参数无

*返回值返回读取的温度数据

*****************************************************************************/

UINT8read_1820(void)

{

UINT8temp,k,n;

temp=0;

for(n=0;n<8;n++)

{

CL_DQ;

SET_DQ;

SET_IN;

k=IN_DQ;//读数据,从低位开始

if(k)

temp|=(1<

else

temp&=~(1<

Delay_nus(70);//60~120us

SET_OUT;

}

return(temp);

}

清单5.4传感器读取外部光照强度的函数

/******************************************************************************

*函数名myApp_ReadLight

*描述读取传感器测出的外界光度强度信息AD采样使用P04管脚

*参数无

*返回值返回环境的光照强度信息,范围在0~100之间,100最亮

*****************************************************************************/

staticuint8myApp_ReadLight(void)

{

INT8adc_value;

P0DIR&=~(0x01<<4);//设置P04为输入模式,采集P04的电压

ADCCFG|=(0x01<<0x04);//设置P04使能

//设置ADCCON3寄存器为AVDD_SoC,512抽取率,AIN7通道

ADCCON3=(HAL_ADC_REF_AVDD|HAL_ADC_DEC_512|HAL_ADC_CHN_AIN4);

ADC_SAMPLE_SINGLE();

while(!

ADC_SAMPLE_READY());//采样准备完成

while(!

ADCIF);

adc_value=ADCH;//读取光照数据

#defineVDD33//最大电压

floatv;

adc_value=(adc_value>0?

adc_value:

0);

v=((float)adc_value/(float)0x7F);

v*=VDD;

return(INT8)(100-v*100/VDD);//光敏亮度0~100.0为最暗,100为最亮

}

5.3.3实验结果

利用TI公司提供的ZigBeeSensorMonitor(1.2.0)工具可以看到节点的拓扑数据信息图。

如图是该工具的界面,如图是我们实验结果的拓扑数据信息图。

图zigbeeSensorMonitor(1.2.0)界面展示

图实验拓扑数据信息

我们用串口助手v3.1,可以看到数据的输出结果,如图所示。

图串口调试助手显示采集的数据信息

问题1:

在该实验代码中,协调器通过什么样的方式来区分上传上来的不同类型的环境信息?

问题2:

本套实验模块,最多可以添加几个外部环境传感器器件?

问题3:

当协调器接收上来的数据量很大时,协调器怎样避免这种问题的发生?

问题4:

为了节约传感器模块的电池电量,能否实现传感器模块的省电模式?

即,每个传感器模块在不发送数据的时候,进行睡眠;发送数据时就被立即唤醒。

问题5:

该实验能否实现MESH网?

如果能,怎样保证数据的可靠传输?

如果不能,为什么?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1