ZigBee网络和Wi-Fi相组合的工作方式来针对环境情况进行感知。请基于ZigBee和Wi-Fi通信的温湿度采集系统。
使用1块ZigBee模块(白色)、1块ZigBee模块(黑色)、1块Wi-Fi通讯模块、1个温湿度传感器模块, 选取白色ZIGBEE模块安装温湿度传感器模块作为发送端,黑色ZIGBEE模块作为接收端。
将黑色ZigBee模块用双公头的串口线和newland平台相连,平台上放上wifi模块,电脑连接wifi,在网络调试助手上查看数据。
1、将Wi-Fi通讯模块配置为AP工作模式,启用DHCP功能,配置热点名称为AP+工位号、密码为准考号后8位、信道自行决定、加密方式为WPA2_PSK、IP地址为192.168.10.1,启用AP热点多连接,启用模块服务器模式(端口为8080)。
AT+CWMODE=2 //设置AP模式 AT+CWDHCP=0,1 //DHCP功能 AT+RST //重启 A+CWSAP="WiFi名称","WiFi密码",5,3 //配置wifi AT+CIPAP="XXX.XXX.XXX.XXX" //wifi模块当前使用的ip地址 AT+CIPMUX=1 //设置多连接 AT+CIPSERVER=1,8080 //启动wifi模块的服务器模式,端口号为8080,客户端ID号0~4 /*不出意外应该很顺利,如果过程中发生error,那就重新上电*/
2、在IAR中创建基于CC2530的BasicRf开发工程,工程保存到工程目录中,工程文件为test.eww,路径为:工程目录/project/test.eww。把考试资源包中的CC2530_lib和sensor_drv拷贝到工程目录中。项目应包括app、basicrf、board、common、mylib、sensor_drv、utils共7个文件夹
3、在IAR项目工作组(workspace)中增加EndDev模块,将考试资源中的“Project”文件夹中的“EndDev.c”文件导入到工程中app目录下并保证编译通过。
4、在IAR项目工作组(workspace)中增加GateDev模块,将考试资源中的“Project”文件夹中的 “GateDev.c”文件导入到工程中app目录下并保证编译通过。
5、完善“EndDev.c”文件中的代码,实现发送端功能。配置和初始化BasicRf(Channel为13, PANID为工位号,比如工位号为1234则PANID为0x1234),获取温湿度传感器的温度和湿度值,按照下述数据格式发送给接收端:
帧头 |
帧长度 |
温度数据 |
湿度数据 |
校验和 |
固定值 0xCC |
1字节 0x05 |
1字节 采集值 |
1字节 采集值 |
1个字节 为前4字节累加和 |
void configRF(void) { /*开始完善代码——basicRf配置和初始化*/ cfg.myAddr=0xA1B1; cfg.panId=0x3211; cfg.channel=11; cfg.ackRequest=TRUE; while(basicRfInit(&cfg)==FAILED); basicRfReceiveOn(); /*结束完善代码——basicRf配置和初始化*/ }
void main(void) { halBoardInit(); configRF(); Timer4_Init(); Timer4_On(); while(1) { APP_SEND_DATA_FLAG = GetSendDataFlag(); if(APP_SEND_DATA_FLAG == 1) { /*开始完善代码——获取温湿度数据,发送给接收端*/ unsigned int tem,hum; call_sht11(&tem,&hum); txData[0]=0xCC; txData[1]=0x05; txData[2]=tem; txData[3]=hum; txData[4]=CheckSum(txData,4); basicRfSendPacket( 0xA0B0, txData, 5); /*结束完善代码——获取温湿度数据,发送给接收端*/ FlashLed(1,100); Timer4_On(); } } }
6、完善“GateDev.c”文件中的代码,实现接收端功能。配置和初始化BasicRf,当接收到发送端的无线数据后,将温度、湿度数据通过串口发送给Wi-Fi通讯模块,发送格式为“当前温度:XX℃,当前湿度:XXRH。” 。对温度值进行判断,当温度值超过某个值(例如30度),接收端D3灯亮起,否则D3灯熄灭。
void configRF(void) { /*开始完善代码——basicRf配置和初始化*/ cfg.myAddr=0xA0B0; cfg.panId=0x3211; cfg.channel=11; cfg.ackRequest=TRUE; while(basicRfInit(&cfg)==FAILED); basicRfReceiveOn(); /*结束完善代码——basicRf配置和初始化*/ }
char sendStrToWifi[50]; void main(void) { halBoardInit(); configRF(); /*开始完善代码——串口发送AT指令,启用WIFI模块AP热点多连接*/ const char *cmdStr; const char *DataStr; for(int i=0;i<3;i++) { //initWifi(); cmdStr="AT+CIPMUX=1 "; halUartWrite((uint8 *)cmdStr, strlen(cmdStr)); halMcuWaitMs(500); /*结束完善代码——串口发送AT指令,启用WIFI模块AP热点多连接*/ /*开始完善代码——串口发送AT指令,启用WIFI模块服务器模式(端口为8080)*/ cmdStr="AT+CIPSERVER=1,8080 "; halUartWrite((uint8 *) cmdStr, strlen( cmdStr)); /*结束完善代码——串口发送AT指令,启用WIFI模块服务器模式(端口为8080)*/ halMcuWaitMs(500); } while(1) { if(basicRfPacketIsReady()) { FlashLed(2,100); /*开始完善代码——接收发送端无线数据,根据湿度控制D3灯,并将温湿度数据通过WIFI发出去*/ basicRfReceive(rxData,5, NULL); if(rxData[2]>=26) //对温度值进行判断,当温度值超过某个值(例如30度),接收端D3灯亮起, halLedSet(1); else //否则D3灯熄灭。 halLedClear(1); sprintf((char *)DataStr," 当前温度:%d℃, 当前湿度:%d", rxData[2],rxData[3]); sprintf((char *)cmdStr,"AT+CIPSEND=0,%d ",strlen(DataStr)); halUartWrite((uint8 *)cmdStr, strlen(cmdStr)); halMcuWaitMs(500); uart_printf((char *)DataStr); /*结束完善代码——接收发送端无线数据,根据湿度控制D3灯,并将温湿度数据通过WIFI发出去*/ } } }