基于zigbee的温度采集系统文档格式.docx
- 文档编号:17220443
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:15
- 大小:264.86KB
基于zigbee的温度采集系统文档格式.docx
《基于zigbee的温度采集系统文档格式.docx》由会员分享,可在线阅读,更多相关《基于zigbee的温度采集系统文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。
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<
len)
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)
//读取温度
//小数部分
//整数部分
returntemh;
清单5.2把读取的温度数据转换为真实的温度信息
*函数名read_data
*描述利用read_1820函数读取温度数据之后,把温度数据转换为温度信息
*返回值无
voidread_data(void)
UINT8a,b,c;
init_1820();
//复位18b20
write_1820(0xcc);
//发出转换命令搜索器件
write_1820(0x44);
//启动
Delay_nus(50000);
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;
flag=0;
//为正
a=temh<
a+=(teml&
0xf0)>
//得到高位的值
b=teml&
temh=a;
teml=b&
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<
n++)
CL_DQ;
SET_DQ;
SET_IN;
k=IN_DQ;
//读数据,从低位开始
if(k)
temp|=(1<
n);
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网?
如果能,怎样保证数据的可靠传输?
如果不能,为什么?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 zigbee 温度 采集 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)