基于basicRf+Wifi数据采集

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\r\n";
  halUartWrite((uint8 *)cmdStr, strlen(cmdStr));
 
  halMcuWaitMs(500);

  /*结束完善代码——串口发送AT指令,启用WIFI模块AP热点多连接*/
    
  /*开始完善代码——串口发送AT指令,启用WIFI模块服务器模式(端口为8080)*/
  cmdStr="AT+CIPSERVER=1,8080\r\n";
  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,"\r\n当前温度:%d℃, 当前湿度:%d", rxData[2],rxData[3]);
      sprintf((char *)cmdStr,"AT+CIPSEND=0,%d\r\n",strlen(DataStr));
      halUartWrite((uint8 *)cmdStr, strlen(cmdStr));
    
      halMcuWaitMs(500);
      uart_printf((char *)DataStr);


      /*结束完善代码——接收发送端无线数据,根据湿度控制D3灯,并将温湿度数据通过WIFI发出去*/  
    }
        
  }
}
posted @ 2019-12-30 19:36  DingJie1024  阅读(1866)  评论(0编辑  收藏  举报