无线传感器数据通信实验报告Word文件下载.docx
《无线传感器数据通信实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《无线传感器数据通信实验报告Word文件下载.docx(13页珍藏版)》请在冰点文库上搜索。
命令如下表。
单片机在发送完命令信号后,等待温湿度传感器测量完成。
传感器在转换完成后将数据线拉低。
单片机产生时钟信号,从温湿度传感器读数据。
数据包含2bytes的测量结果和1bytes的校验。
单片机在收到每字节数据都要将数据线拉低给出应答信号。
数据高位在前,低位在后。
传感器在测量结束和通信完毕后自动进入休眠。
具体操作见数据手册。
时序图如图1-10所示。
图1-10传感器工作时序图
8、计算公式
温度计算公式:
湿度计算公式:
三、实验设备:
ZIGBEE无线空气温湿度传感器一个、装有实验软件的计算机。
四、实验内容:
1、建立开发工程;
用MDK打开工程模板。
2、把similar_i2C.c和similar_i2C.h加入到工程。
将similar_i2c文件夹拷贝到工程模板目录中。
调用similar_i2C.c中函数,编写温度采集和湿度采集代码
在工程模板根目录下建立sht1xx_sensor,在里面新建sht1xx.c和sht1xx.h空文件,将c加入到工程,将h文件加入到工程设置中
编写main()调用温度采集和湿度采集函数,并对原始数据进行处理。
在原有的程序的基础上,添加代码使程序能够根据数据计算出湿度,并显示出来。
计算湿度的公式:
代码:
(主函数部分)
#include"
arch_include.h"
sht1xx.h"
similar_i2c.h"
uint16_ttemp_value;
uint16_trh_value;
floatg_temp;
floatg_rh;
intmain(void){
system_init_from_reset();
SENSOR_VBAT_ON();
SI32_PBSTD_A_enable_pullup_resistors(SI32_PBSTD_1);
delay_us(100000);
while
(1){
temp_value=SHT15_temp_samp();
g_temp=-39.7+0.04*temp_value;
//计算温度公式
rh_value=SHT15_rh_samp();
g_rh=-4+0.0405*rh_value+rh_value*rh_value*(-2.8)/1000000+(g_temp-25)*(0.01+0.00008*rh_value);
//计算湿度公式
delay_us(1000000);
}
}
(SHT15_rh_samp函数部分)
floatSHT15_rh_samp()
{
uint8_tRH_data[3];
floatrh=0;
simliar_i2c_transstart();
//transmissionstart
similar_i2c_write_byte(0x06);
//sendcommandtosensor
similar_i2c_write_byte(0x00);
//sendvalueofstatusregister
similar_i2c_write_byte(0x05);
SIMILAR_I2C_DATA_IN;
delay_us(100000);
SIMILAR_I2C_DATA_OUT;
RH_data[0]=similar_i2c_read_byte(SIMILAR_I2C_ACK);
//readthefirstbyte(MSB)
RH_data[1]=similar_i2c_read_byte(SIMILAR_I2C_ACK);
//readthesecondbyte(LSB)
RH_data[2]=similar_i2c_read_byte(SIMILAR_I2C_NOACK);
//readchecksum
rh=RH_data[0]*256+RH_data[1];
returnrh;
调试结果:
运行后可得到温度为28.42℃,湿度为68.68%rh,与现实相符,表示测量结果正确。
五、实验心得:
这次实验是在第一次熟悉传感器的基础上进行的。
在实验中第一次接触到了KeiluVision4这个软件。
与其他相关的编译软件差不多,一些基本的头文件导入,分步调试的功能我也能较快的进行。
只是在调试前仍需在Options中设置许多的参数,以保证能够正确地驱动传感器并调取传感器的数据。
有些参数的设置或选项在张老师的讲解下能够清楚明白,但是也有部分的设置不知道是为何要那样设置,因此在之后的一些不停调试中,有时需要机械性地记住哪些地方是需要改动的。
在这一点上,我觉得我应该再去清楚的了解,真正了解了每一步的意义才能一直记住如何去做。
除设置外,实验的进行也比较顺利,利用资料中的公式与程序中已有的温度查询的基础上,将湿度的计算公式添入进去即可,基本都比较容易,数据在运行后都及时地显示了。
这一次实验也对传感器有了更深的理解,传感器不仅仅是一各仪器,它仍需一些程序才能正常地使用,并激发更多的功能。
实验三:
无线传感器设计实验
在之前实验的基础上,根据物联网网关数据接收协议,编写无线传感器代码,实现无线传感器节点上的数据采集向物联网网关的无线上传。
1.发包和收包是有射频芯片完成:
节点上的处理器和射频模块的连接如下图所示,MCU和RF212之间是通过SPI通信的。
2.射频协议:
里面我们要关心的是目的PANID,目的地址,源PANID,源地址,MAC荷载。
3.射频模块的初始化:
射频模块在使用前要进行初始化,主要是配置本机PANID和ID,通信速率,通信频段等信息。
4.发包过程:
1)填写发包数据结构体。
发包要知道通信节点的ID、组号、数据、是否需要应答。
这些信息封装在以发包结构体里。
发包结构体定义如下:
2)通过SPI总线写入视频芯片缓冲区。
3)启动发包
步骤2)和步骤3)都是通过
完成。
产生发包完成中断。
(射频发包和射频收包用的是同一个终端标志,必须设置终端标志位判断是发包中断,还是收包终端)。
5.收包过程:
1)射频芯片接受到完整数据包
2)产生接收中断(第1)和2)都是有射频芯片完成。
3)MCU从射频芯片都走数据包这一步是有
数据储存在rx_frame结构体中。
1.对节点进行射频初始化:
填写本机ID、本机panid、设置信道7820,设置速率是250kB/s、调用Mac初始化
2.发包:
填写发包内容,调用发包函数,屏蔽收包代码,编译烧写,开机。
3.收包:
修改本机ID,PANID,屏蔽发包代码,编译,进入到调试界面,在收包函数后面设置断点,将rx_frame加入watch1.观看数据。
rf2xx_include.h"
test_send.h"
floatg_RH;
uint8_trec_flag=0;
uint8_tdata_temp[2]={0,0};
uint8_tdata_rh[2]={0,0};
externnode_addr_tnode_addr;
externnode_addr_tdest_addr;
externrf_settings_trf2xx_settings;
externhal_rx_frame_trx_frame;
voidsent_fram_2_getway(void){
uint8_tlen=0;
rfTxInfo.pPayload[len++]=0x03;
rfTxInfo.pPayload[len++]=1;
rfTxInfo.pPayload[len++]=0x00;
//PANID
rfTxInfo.pPayload[len++]=0x01;
rfTxInfo.pPayload[len++]=0x0;
//ID
rfTxInfo.pPayload[len++]=0x11;
rfTxInfo.pPayload[len++]=0;
rfTxInfo.pPayload[len++]=data_rh[1];
//humi//rfTxInfo.pPayload[len++]=data_temp[1];
//humi
rfTxInfo.pPayload[len++]=data_temp[1];
//temp
rfTxInfo.pPayload[len++]=((data_rh[0]&
0x0F)<
<
4)+(data_temp[0]&
0x0F);
rfTxInfo.pPayload[len++]=0x7F;
//qualityofpower
rfTxInfo.pPayload[len++]=0x0B;
rfTxInfo.ackRequest=0;
rfTxInfo.destAddr=0x1801;
//修改发送与接收的地址
rfTxInfo.destPanId=0x22;
rfTxInfo.length=len;
mac_send_packet_extend(&
rfTxInfo,0,0);
return;
uint8_tw=3;
SI32_PBGP_A_set_pins_push_pull_output(SI32_PBGP_4,0X0003);
SI32_PBGP_A_write_pins_low(SI32_PBGP_4,0X0003);
node_addr.id=0x1001;
//sendnode:
0x1001,revnode:
0x1801
node_addr.panid=0x22;
rf2xx_settings.rf212_band_set=7820;
rf2xx_settings.rf212_bitrate=OQPSK_SIN_250;
mac_init();
while
(1){
SHT15_temp_samp(data_temp);
SHT15_rh_samp(data_rh);
sent_fram_2_getway();
(SHT15_rh_samp函数)
voidSHT15_rh_samp(uint8_t*data){
simliar_i2c_transstart();
similar_i2c_write_byte(0x06);
//sendcommandtosensor
similar_i2c_write_byte(0x00);
similar_i2c_write_byte(0x05);
SIMILAR_I2C_DATA_IN;
SIMILAR_I2C_DATA_OUT;
RH_data[0]=similar_i2c_read_byte(SIMILAR_I2C_ACK);
RH_data[1]=similar_i2c_read_byte(SIMILAR_I2C_ACK);
//readthesecondbyte(LSB)
RH_data[2]=similar_i2c_read_byte(SIMILAR_I2C_NOACK);
rh=RH_data[0]*256+RH_data[1];
rh=-4+0.0405*rh+rh*rh*(-2.8)/1000000+(g_temp-25)*(0.01+0.00008*rh);
*data=RH_data[0];
*(data+1)=RH_data[1];
5、实验心得:
这次实验的目的是将从传感器获得温度与湿度的数据通过蓝牙发送给另外一组,并接收另一组发送的数据。
由于数据发送的数据包不符合发送规则,所以需要对数据进行处理,在这一步中遇到了较大的麻烦,一开始毫无头绪如何去将数据进行处理。
张老师提示了用指针的方法将数据分别获取然后发送,由于很久没有用到指针或者说当时学习指针的时候没有完全学好,短短几行的代码摸索了半天,最后仍是在老师的指导下完成这个数据的处理。
在发送的时候,需要在代码中对发送地址名称进行修改处理,rfTxInfo.destAddr=0x1801;
rfTxInfo.destPanId=0x22;
,但实际操作中,添加完地址名称,在发送与接收时可能因为其他的组对蓝牙修改了跟我们一样的参数,导致我们的频段被使用。
最后还是在张老师的处理下才得意成功实现。
总体来说,这次实验并不成功,许多基础的知识我们大多数人都没有掌握。
做到了晚上9点多也没有太大的突破。
张老师也对我们进行了鞭策,现在想来,我们的确需要对这些专业知识进行恶补与学习,毕竟这很多都会成为我们毕业后找工作的资本。
实验的设置挺好的,让我们更多地了解到自己的不足,也感谢张老师的不停的指导。