任务九 基于BasicRF的无线传感网络应用
目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤
实训目的 通过本实训,使学生掌握开关量、模拟量、逻辑量三种传感器的工作原理,熟悉这三种传感器的信号采集方法;熟悉BasicRF参数配置;掌握基于BasicRF的无线采集与网络组建方法。
目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤
实训内容 在实训上,采用人体红外传感器和ZigBee模块组成开关量采集节点A;采用光敏传感器和ZigBee模块组成模拟量采集节点B;一氧化碳传感器和ZigBee模块组成模拟量采集节点C;采用温湿度传感器模块和ZigBee模块组成逻辑量采集节点D。A、B、C、D四个节点实时采集传感器的信号,每隔2s将采集的传感器信号通过无线网络传给ZigBee网关模块(网关模块通过串口与PC机相连),并在PC机串口调试软件上显示。
目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤
实训原理 在开关量采集系统、模拟量采集系统和逻辑量采集系统的基础上,通过ZigBee无线发送给网关模块,网关通过串口把无线接收的数据上传给PC机,从而实现无线传感网络的数据采集与处理。
目 录 一、实训目的 二、实训内容 三、实训原理 四、实训步骤
实训步骤 第一步,新建各传感器节点工程、配置工程相关设置。 1. 选择菜单栏【Project】->【Edit Configuration……】命令,新建gm_sensor、qt_sensor、hw_sensor、tem_sensor和collect五个工程,如图9.1所示。 图9.1 新建工程
实训步骤 2. 各传感器节点工程配置,具体参照实训3操作。 第三步,编写各传感器节点程序。 1. sensor.c文件代码如下: #include "hal_defs.h" #include "hal_cc8051.h" #include "hal_int.h" #include "hal_mcu.h" #include "hal_board.h" #include "hal_led.h" #include "hal_rf.h" #include "basic_rf.h"
实训步骤 #include "hal_uart.h" #include "UART_PRINT.h" #include "TIMER.h" #include "get_adc.h" #include "sh10.h" #include <string.h> #define MAX_SEND_BUF_LEN 128 #define MAX_RECV_BUF_LEN 128 static uint8 pTxData[MAX_SEND_BUF_LEN]; //定义无线发送缓冲区的大小
实训步骤 static uint8 pRxData[MAX_RECV_BUF_LEN]; //定义无线接收缓冲区的大小 #define MAX_UART_SEND_BUF_LEN 128 #define MAX_UART_RECV_BUF_LEN 128 uint8 uTxData[MAX_UART_SEND_BUF_LEN]; //定义串口发送缓冲区的大小 uint8 uRxData[MAX_UART_RECV_BUF_LEN]; //定义串口接收缓冲区的大小 uint16 uTxlen = 0; uint16 uRxlen = 0;
实训步骤 /*********************点对点通讯地址设置*********************/ #define RF_CHANNEL 20 // 频道 11~26 #define PAN_ID 0x1379 //网络id #define MY_ADDR 0xacef // 本机模块地址 #define SEND_ADDR 0x1234 //发送地址 /******************************************************************/ static basicRfCfg_t basicRfConfig; uint8 APP_SEND_DATA_FLAG; /*****************************************************************/
实训步骤 void ConfigRf_Init(void) // 无线RF初始化 { basicRfConfig.panId = PAN_ID; //ZigBee的ID号设置 basicRfConfig.channel = RF_CHANNEL; //ZigBee的频道设置 basicRfConfig.myAddr = MY_ADDR; //设置本机地址 basicRfConfig.ackRequest = TRUE; //应答信号 while(basicRfInit(&basicRfConfig) == FAILED); //检测ZigBee的参数是否配置成功 basicRfReceiveOn(); // 打开RF }
实训步骤 /***************************MAIN*********************/ void main(void) { uint16 sensor_val,sensor_tem; uint16 len = 0; halBoardInit(); //模块相关资源的初始化 ConfigRf_Init(); //无线收发参数的配置初始化 halLedSet(1); halLedSet(2); Timer4_Init(); //定时器初始化 Timer4_On(); //打开定时器
实训步骤 while(1) { APP_SEND_DATA_FLAG = GetSendDataFlag(); if(APP_SEND_DATA_FLAG == 1) //定时时间到 { #if defined (GM_SENDOR) //光敏传感器 sensor_val=get_adc(); //取模拟电压 //把采集数据传化成字符串,以便于在串口上显示观察 printf_str(pTxData,"光照传感器电压:%d.%02dV\r\n",sensor_val/100, sensor_val%100); #endif
实训步骤 #if defined (QT_SENDOR) //气体传感器 sensor_val=get_adc(); //取模拟电压 //把采集数据传化成字符串,以便于在串口上显示观察 printf_str(pTxData,"气体传感器电压:%d.%02dV\r\n",sensor_val/100, sensor_val%100); #endif #if defined (HW_SENDOR) //红外传感器 sensor_val=get_swsensor(); //取红外传感器检测结果
实训步骤 //把采集数据传化成字符串,以便于在串口上显示观察 if(sensor_val) { printf_str(pTxData,"红外传感器电平:%d\r\n",sensor_val);} else { printf_str(pTxData,"红外传感器电平:%d\r\n",sensor_val); } #endif #if defined (TEM_SENDOR) //温湿度传感器 call_sht11(&sensor_tem,&sensor_val); //取温湿度数据
实训步骤 //把采集数据传化成字符串,以便于在串口上显示观察 printf_str(pTxData,"温湿度传感器,温度:%d.%d, 湿度:%d.%d\r\n", sensor_tem/10,sensor_tem%10,sensor_val/10,sensor_val%10); #endif halLedToggle(3); // 绿灯取反,无线发送指示 //把数据通过ZigBee发送出去 basicRfSendPacket(SEND_ADDR, pTxData,strlen(pTxData )); Timer4_On(); //打开定时 } /*【传感器采集、处理】 结束*/ } }
实训步骤 第四步,编写协调器程序 #include "hal_defs.h" #include "hal_cc8051.h" #include "hal_int.h" #include "hal_mcu.h" #include "hal_board.h" #include "hal_led.h" #include "hal_rf.h" #include "basic_rf.h" #include "hal_uart.h"
实训步骤 #define MAX_SEND_BUF_LEN 128 #define MAX_RECV_BUF_LEN 128 static uint8 pTxData[MAX_SEND_BUF_LEN]; //定义无线发送缓冲区的大小 static uint8 pRxData[MAX_RECV_BUF_LEN]; //定义无线接收缓冲区的大小 #define MAX_UART_SEND_BUF_LEN 128 #define MAX_UART_RECV_BUF_LEN 128 uint8 uTxData[MAX_UART_SEND_BUF_LEN]; //定义串口发送缓冲区的大小
实训步骤 uint8 uRxData[MAX_UART_RECV_BUF_LEN]; //定义串口接收缓冲区的大小 uint16 uTxlen = 0; uint16 uRxlen = 0; /*****点对点通讯地址设置******/ #define RF_CHANNEL 20 // 频道 11~26 #define PAN_ID 0x1379 //网络id #define MY_ADDR 0x1234 // 本机模块地址 #define SEND_ADDR 0x55aa //发送地址
实训步骤 static basicRfCfg_t basicRfConfig; void MyByteCopy(uint8 *dst, int dststart, uint8 *src, int srcstart, int len) { int i; for(i=0; i<len; i++) *(dst+dststart+i)=*(src+srcstart+i); }
实训步骤 uint16 RecvUartData(void) { uint16 r_UartLen = 0; uint8 r_UartBuf[128]; uRxlen=0; r_UartLen = halUartRxLen(); while(r_UartLen > 0) r_UartLen = halUartRead(r_UartBuf, sizeof(r_UartBuf));
实训步骤 MyByteCopy(uRxData, uRxlen, r_UartBuf, 0, r_UartLen); uRxlen += r_UartLen; halMcuWaitMs(5); //这里的延迟非常重要,因为这是串口连续读取数据时候需要有一定的时间间隔 r_UartLen = halUartRxLen(); } return uRxlen; );
实训步骤 // 无线RF初始化 void ConfigRf_Init(void) { basicRfConfig.panId = PAN_ID; //ZigBee的ID号设置 basicRfConfig.channel = RF_CHANNEL; //ZigBee的频道设置 basicRfConfig.myAddr = MY_ADDR; //设置本机地址 basicRfConfig.ackRequest = TRUE; //应答信号 while(basicRfInit(&basicRfConfig) == FAILED); //检测ZigBee的参数是否配置成功
实训步骤 basicRfReceiveOn(); // 打开RF } /********************MAIN START************************/ void main(void) { uint16 len = 0; halBoardInit(); //模块相关资源的初始化 ConfigRf_Init(); //无线收发参数的配置初始化 halLedSet(1); halLedSet(2);
实训步骤 while(1) { if(basicRfPacketIsReady()) //查询有没收到无线信号 halLedToggle(4); // 红灯取反,无线接收指示 //接收无线数据 len = basicRfReceive(pRxData, MAX_RECV_BUF_LEN, NULL); halUartWrite(pRxData,len); //把接收到的无线发送到串口 } } }
实训步骤 第五步,编译、烧录程序,测试系统功能。 1. 为传感器节点编译、烧录程序。 (1)在Workspace栏下选择“gm_sensor”,然后在预定义栏输入“GM_SENDOR”,再编译程序,无误后烧录到该模块中。 (2)在Workspace栏下选择“qt_sensor”,然后在预定义栏输入“QT_SENDOR”,再编译程序,无误后烧录到该模块中。 (3)在Workspace栏下选择“hw_sensor”,然后在预定义栏输入“HW_SENDOR”,再编译程序,无误后烧录到该模块中。 (4)在Workspace栏下选择“tem_senso”,然后在预定义栏输入“TEM_SENDOR”,再编译程序,无误后烧录到该模块中。
实训步骤 2. 为协调器编译、烧录程序。 3. 测试系统功能,如图9.2所示。 图9.2 基于BasicRF的无线传感网络应用系统测试效果
谢谢!