1、无线传感器数据通信实验报告实验二:无线传感器数据通信实验一、实验目的: 在无线传感器节点的单片机驱动代码的基础上,编写无线通信程序,实现多个传感器节点之间的双向数据传输。二、实验原理: 温湿度传感器和单片机采用的是类似IIC的串行通信,和单片机相连如图1-8所示VDD和GND是传感器供电引脚。SCK是时钟引脚,在通信这个过程中,SCK信号都是有单片机控制的。DATA是数据线,和单片机IO口相连。用于向传感器发送指令和从单片机读走数据。数据在时钟的上升沿生效在时钟是高电平时保持不变。在时钟是低电平时准备数据。接口如图所示。 图1-8 温湿度接口单片机先向传感器发送开始命令,然后开始通信,开始命令
2、时序图如图所示。在SCK高电平时,将数据线拉低,在下一个时钟高电平期间,将数据线拉高。开始信号发送完毕。 图1-9 开始信号再开始信号后是命令信号,命令信号包含3位地址位(只支持000)和5位命令位组成。传感器在接收到1byte数据时(即第八个时钟下降沿)将数据线拉低,表示数据正确接收。在九个下降沿被释放。命令如下表。单片机在发送完命令信号后,等待温湿度传感器测量完成。传感器在转换完成后将数据线拉低。单片机产生时钟信号,从温湿度传感器读数据。数据包含2bytes的测量结果和1bytes的校验。单片机在收到每字节数据都要将数据线拉低给出应答信号。数据高位在前,低位在后。传感器在测量结束和通信完毕
3、后自动进入休眠。具体操作见数据手册。时序图如图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文件加入到工程设置中
4、编写main()调用温度采集和湿度采集函数,并对原始数据进行处理。在原有的程序的基础上,添加代码使程序能够根据数据计算出湿度,并显示出来。计算湿度的公式:代码:(主函数部分)#include arch_include.h#include sht1xx.h#include similar_i2c.huint16_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_res
5、istors(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_s
6、amp() uint8_t RH_data3; float rh=0; simliar_i2c_transstart(); /transmission start similar_i2c_write_byte(0x06); /send command to sensor similar_i2c_write_byte(0x00); /send value of status register simliar_i2c_transstart(); similar_i2c_write_byte(0x05); SIMILAR_I2C_DATA_IN; delay_us(100000); SIMILAR_
7、I2C_DATA_OUT; RH_data0=similar_i2c_read_byte(SIMILAR_I2C_ACK); /read the first byte (MSB) RH_data1=similar_i2c_read_byte(SIMILAR_I2C_ACK); /read the second byte (LSB) RH_data2 =similar_i2c_read_byte(SIMILAR_I2C_NOACK); /read checksum rh=RH_data0*256+RH_data1; return rh;调试结果:运行后可得到温度为28.42,湿度为68.68%r
8、h,与现实相符,表示测量结果正确。五、实验心得:这次实验是在第一次熟悉传感器的基础上进行的。在实验中第一次接触到了Keil uVision4这个软件。与其他相关的编译软件差不多,一些基本的头文件导入,分步调试的功能我也能较快的进行。只是在调试前仍需在Options中设置许多的参数,以保证能够正确地驱动传感器并调取传感器的数据。有些参数的设置或选项在张老师的讲解下能够清楚明白,但是也有部分的设置不知道是为何要那样设置,因此在之后的一些不停调试中,有时需要机械性地记住哪些地方是需要改动的。在这一点上,我觉得我应该再去清楚的了解,真正了解 了每一步的意义才能一直记住如何去做。除设置外,实验的进行也比
9、较顺利,利用资料中的公式与程序中已有的温度查询的基础上,将湿度的计算公式添入进去即可,基本都比较容易,数据在运行后都及时地显示了。这一次实验也对传感器有了更深的理解,传感器不仅仅是一各仪器,它仍需一些程序才能正常地使用,并激发更多的功能。实验三:无线传感器设计实验一、实验目的: 在之前实验的基础上,根据物联网网关数据接收协议,编写无线传感器代码,实现无线传感器节点上的数据采集向物联网网关的无线上传。二、实验原理: 1.发包和收包是有射频芯片完成:节点上的处理器和射频模块的连接如下图所示,MCU和RF212之间是通过SPI通信的。 2射频协议:里面我们要关心的是目的PANID,目的地址,源PAN
10、ID,源地址,MAC荷载。3射频模块的初始化:射频模块在使用前要进行初始化,主要是配置本机PANID和ID,通信速率,通信频段等信息。 4发包过程:1)填写发包数据结构体。发包要知道通信节点的ID、组号、数据、是否需要应答。这些信息封装在以发包结构体里。发包结构体定义如下:2)通过SPI总线写入视频芯片缓冲区。3)启动发包步骤2)和步骤3)都是通过完成。产生发包完成中断。(射频发包和射频收包用的是同一个终端标志,必须设置终端标志位判断是发包中断,还是收包终端)。5收包过程:1)射频芯片接受到完整数据包2)产生接收中断( 第1)和2)都是有射频芯片完成。3)MCU从射频芯片都走数据包这一步是有完
11、成。数据储存在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
12、.h#include sht1xx.h#include similar_i2c.hfloat g_temp;float g_RH;uint8_t rec_flag=0;uint8_t data_temp2=0,0;uint8_t data_rh2=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;
13、rfTxInfo.pPayloadlen+ = 0x03; rfTxInfo.pPayloadlen+ = 1; rfTxInfo.pPayloadlen+ = 1; rfTxInfo.pPayloadlen+ = 0x00;/PANID rfTxInfo.pPayloadlen+ = 0x01;/PANID rfTxInfo.pPayloadlen+ = 0x0; rfTxInfo.pPayloadlen+ = 0x0; rfTxInfo.pPayloadlen+ = 0x01;/ID rfTxInfo.pPayloadlen+ = 0x11;/ID rfTxInfo.pPayloadlen
14、+ = 0; rfTxInfo.pPayloadlen+ = 0; rfTxInfo.pPayloadlen+ = 0; rfTxInfo.pPayloadlen+ = 0; rfTxInfo.pPayloadlen+ = data_rh1;/humi/rfTxInfo.pPayloadlen+ = data_temp1;/humi rfTxInfo.pPayloadlen+ =data_temp1;/temp rfTxInfo.pPayloadlen+ =(data_rh0&0x0F)4)+ (data_temp0&0x0F); rfTxInfo.pPayloadlen+ = 0; rfTx
15、Info.pPayloadlen+ = 0; rfTxInfo.pPayloadlen+ = 0; rfTxInfo.pPayloadlen+ = 0; rfTxInfo.pPayloadlen+ = 0x7F;/quality of power rfTxInfo.pPayloadlen+ = 0x0B; rfTxInfo.ackRequest = 0; rfTxInfo.destAddr = 0x1801; /修改发送与接收的地址 rfTxInfo.destPanId = 0x22; rfTxInfo.length = len; mac_send_packet_extend(&rfTxInf
16、o, 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
17、: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)
18、uint8_t RH_data3; float rh=0; simliar_i2c_transstart(); /transmission start similar_i2c_write_byte(0x06);/send command to sensor similar_i2c_write_byte(0x00); /send value of status register simliar_i2c_transstart(); similar_i2c_write_byte(0x05); SIMILAR_I2C_DATA_IN; delay_us(100000); SIMILAR_I2C_DAT
19、A_OUT; RH_data0=similar_i2c_read_byte(SIMILAR_I2C_ACK); /read the first byte (MSB) RH_data1=similar_i2c_read_byte(SIMILAR_I2C_ACK);/read the second byte (LSB) RH_data2 =similar_i2c_read_byte(SIMILAR_I2C_NOACK); /read checksum rh=RH_data0*256+RH_data1; rh=-4+0.0405*rh+rh*rh*(-2.8)/1000000+(g_temp-25)
20、*(0.01+0.00008*rh); *data = RH_data0; *(data+1) = RH_data1;5、实验心得:这次实验的目的是将从传感器获得温度与湿度的数据通过蓝牙发送给另外一组,并接收另一组发送的数据。由于数据发送的数据包不符合发送规则,所以需要对数据进行处理,在这一步中遇到了较大的麻烦,一开始毫无头绪如何去将数据进行处理。张老师提示了用指针的方法将数据分别获取然后发送,由于很久没有用到指针或者说当时学习指针的时候没有完全学好,短短几行的代码摸索了半天,最后仍是在老师的指导下完成这个数据的处理。在发送的时候,需要在代码中对发送地址名称进行修改处理,rfTxInfo.destAddr = 0x1801; rfTxInfo.destPanId = 0x22;,但实际操作中,添加完地址名称,在发送与接收时可能因为其他的组对蓝牙修改了跟我们一样的参数,导致我们的频段被使用。最后还是在张老师的处理下才得意成功实现。 总体来说,这次实验并不成功,许多基础的知识我们大多数人都没有掌握。做到了晚上9点多也没有太大的突破。张老师也对我们进行了鞭策,现在想来,我们的确需要对这些专业知识进行恶补与学习,毕竟这很多都会成为我们毕业后找工作的资本。实验的设置挺好的,让我们更多地了解到自己的不足,也感谢张老师的不停的指导。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1