无线传感器数据通信实验报告.docx

上传人:b****8 文档编号:11382082 上传时间:2023-02-28 格式:DOCX 页数:13 大小:448.50KB
下载 相关 举报
无线传感器数据通信实验报告.docx_第1页
第1页 / 共13页
无线传感器数据通信实验报告.docx_第2页
第2页 / 共13页
无线传感器数据通信实验报告.docx_第3页
第3页 / 共13页
无线传感器数据通信实验报告.docx_第4页
第4页 / 共13页
无线传感器数据通信实验报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

无线传感器数据通信实验报告.docx

《无线传感器数据通信实验报告.docx》由会员分享,可在线阅读,更多相关《无线传感器数据通信实验报告.docx(13页珍藏版)》请在冰豆网上搜索。

无线传感器数据通信实验报告.docx

无线传感器数据通信实验报告

实验二:

无线传感器数据通信实验

一、实验目的:

在无线传感器节点的单片机驱动代码的基础上,编写无线通信程序,实现多个传感器节点之间的双向数据传输。

二、实验原理:

温湿度传感器和单片机采用的是类似IIC的串行通信,和单片机相连如图1-8所示

VDD和GND是传感器供电引脚。

SCK是时钟引脚,在通信这个过程中,SCK信号都是有单片机控制的。

DATA是数据线,和单片机IO口相连。

用于向传感器发送指令和从单片机读走数据。

数据在时钟的上升沿生效在时钟是高电平时保持不变。

在时钟是低电平时准备数据。

接口如图所示。

图1-8温湿度接口

单片机先向传感器发送开始命令,然后开始通信,开始命令时序图如图所示。

在SCK高电平时,将数据线拉低,在下一个时钟高电平期间,将数据线拉高。

开始信号发送完毕。

图1-9开始信号

再开始信号后是命令信号,命令信号包含3位地址位(只支持000)和5位命令位组成。

传感器在接收到1byte数据时(即第八个时钟下降沿)将数据线拉低,表示数据正确接收。

在九个下降沿被释放。

命令如下表。

单片机在发送完命令信号后,等待温湿度传感器测量完成。

传感器在转换完成后将数据线拉低。

单片机产生时钟信号,从温湿度传感器读数据。

数据包含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"

#include"sht1xx.h"

#include"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

simliar_i2c_transstart();

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结构体中。

三、实验设备:

ZIGBEE无线空气温湿度传感器一个、装有实验软件的计算机。

四、实验内容:

1.对节点进行射频初始化:

填写本机ID、本机panid、设置信道7820,设置速率是250kB/s、调用Mac初始化

2.发包:

填写发包内容,调用发包函数,屏蔽收包代码,编译烧写,开机。

3.收包:

修改本机ID,PANID,屏蔽发包代码,编译,进入到调试界面,在收包函数后面设置断点,将rx_frame加入watch1.观看数据。

代码:

(主函数部分)

#include"arch_include.h"

#include"rf2xx_include.h"

#include"test_send.h"

#include"sht1xx.h"

#include"similar_i2c.h"

floatg_temp;

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++]=1;

rfTxInfo.pPayload[len++]=0x00;//PANID

rfTxInfo.pPayload[len++]=0x01;//PANID

rfTxInfo.pPayload[len++]=0x0;

rfTxInfo.pPayload[len++]=0x0;

rfTxInfo.pPayload[len++]=0x01;//ID

rfTxInfo.pPayload[len++]=0x11;//ID

rfTxInfo.pPayload[len++]=0;

rfTxInfo.pPayload[len++]=0;

rfTxInfo.pPayload[len++]=0;

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++]=0;

rfTxInfo.pPayload[len++]=0;

rfTxInfo.pPayload[len++]=0;

rfTxInfo.pPayload[len++]=0;

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;

}

intmain(void){

uint8_tw=3;

system_init_from_reset();

SENSOR_VBAT_ON();

SI32_PBSTD_A_enable_pullup_resistors(SI32_PBSTD_1);

SI32_PBGP_A_set_pins_push_pull_output(SI32_PBGP_4,0X0003);

SI32_PBGP_A_write_pins_low(SI32_PBGP_4,0X0003);

delay_us(100000);

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();

delay_us(1000000);

}

}

(SHT15_rh_samp函数)

voidSHT15_rh_samp(uint8_t*data){

uint8_tRH_data[3];

floatrh=0;

simliar_i2c_transstart();//transmissionstart

similar_i2c_write_byte(0x06);//sendcommandtosensor

similar_i2c_write_byte(0x00);//sendvalueofstatusregister

simliar_i2c_transstart();

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];

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点多也没有太大的突破。

张老师也对我们进行了鞭策,现在想来,我们的确需要对这些专业知识进行恶补与学习,毕竟这很多都会成为我们毕业后找工作的资本。

实验的设置挺好的,让我们更多地了解到自己的不足,也感谢张老师的不停的指导。

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

当前位置:首页 > 初中教育 > 语文

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

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