当前位置:文档之家› 无线传感器数据通信实验报告

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

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

二、实验原理:温湿度传感器和单片机采用的是类似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_t temp_value;uint16_t rh_value;float g_temp;float g_rh;int main(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函数部分)float SHT15_rh_samp(){uint8_t RH_data[3];float rh=0;simliar_i2c_transstart(); //transmission startsimilar_i2c_write_byte(0x06); //send command to sensorsimilar_i2c_write_byte(0x00); //send value of status registersimliar_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); //read the first byte (MSB)RH_data[1]=similar_i2c_read_byte(SIMILAR_I2C_ACK); //read the second byte (LSB)RH_data[2] =similar_i2c_read_byte(SIMILAR_I2C_NOACK); //read checksumrh=RH_data[0]*256+RH_data[1];return rh;}调试结果:运行后可得到温度为28.42℃,湿度为68.68%rh,与现实相符,表示测量结果正确。

五、实验心得:这次实验是在第一次熟悉传感器的基础上进行的。

在实验中第一次接触到了Keil uVision4这个软件。

与其他相关的编译软件差不多,一些基本的头文件导入,分步调试的功能我也能较快的进行。

只是在调试前仍需在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"float g_temp;float g_RH;uint8_t rec_flag=0;uint8_t data_temp[2]={0,0};uint8_t data_rh[2]={0,0};extern node_addr_t node_addr;extern node_addr_t dest_addr;extern rf_settings_t rf2xx_settings;extern hal_rx_frame_t rx_frame;void sent_fram_2_getway(void){uint8_t len = 0;rfTxInfo.pPayload[len++] = 0x03;rfTxInfo.pPayload[len++] = 1;rfTxInfo.pPayload[len++] = 1;rfTxInfo.pPayload[len++] = 0x00;//PANIDrfTxInfo.pPayload[len++] = 0x01;//PANIDrfTxInfo.pPayload[len++] = 0x0;rfTxInfo.pPayload[len++] = 0x0;rfTxInfo.pPayload[len++] = 0x01;//IDrfTxInfo.pPayload[len++] = 0x11;//IDrfTxInfo.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];//temprfTxInfo.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;//quality of powerrfTxInfo.pPayload[len++] = 0x0B;rfTxInfo.ackRequest = 0;rfTxInfo.destAddr = 0x1801; //修改发送与接收的地址rfTxInfo.destPanId = 0x22;rfTxInfo.length = len;mac_send_packet_extend(&rfTxInfo, 0, 0);return;}int main(void){uint8_t w=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;//send node:0x1001, rev node :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函数)void SHT15_rh_samp(uint8_t* data){uint8_t RH_data[3];float rh=0;simliar_i2c_transstart(); //transmission startsimilar_i2c_write_byte(0x06);//send command to sensorsimilar_i2c_write_byte(0x00); //send value of status registersimliar_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); //read the first byte (MSB)RH_data[1]=similar_i2c_read_byte(SIMILAR_I2C_ACK);//read the second byte (LSB)RH_data[2] =similar_i2c_read_byte(SIMILAR_I2C_NOACK); //read checksumrh=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、 实验心得:这次实验的目的是将从传感器获得温度与湿度的数据通过蓝牙发送给另外一组,并接收另一组发送的数据。

相关主题