聚丰项目 > 基于NUCLEO-F401RE的zigbee智能网关

基于NUCLEO-F401RE的zigbee智能网关

ZigBee协议与互联网中所使用的TCP/IP协议并不兼容,要想把ZigBee网络接入到基于IP的互联网,就需要一个设备来完成两个异构网络间数据的转发。因此,提出了网关的概念,由网关来完成两个异构网络之间数据的转发。本文使用STM32 Nucleo F401RE评估板、EMW3080 Wi-Fi网络模块、CC2530 ZigBee模块,设计了一种嵌入式网关的解决方案。网关工作在两个异构的网络之间,连接着无线传感网络和互联网,其功能包括异构网络之间的数据转发和对ZigBee网络的管理。

大雨淅淅 大雨淅淅

分享
0 喜欢这个项目
团队介绍

大雨淅淅 大雨淅淅

团队成员

严敏 软件工程师

张影影 队长

分享
项目简介
ZigBee协议与互联网中所使用的TCP/IP协议并不兼容,要想把ZigBee网络接入到基于IP的互联网,就需要一个设备来完成两个异构网络间数据的转发。因此,提出了网关的概念,由网关来完成两个异构网络之间数据的转发。本文使用STM32 Nucleo F401RE评估板、EMW3080 Wi-Fi网络模块、CC2530 ZigBee模块,设计了一种嵌入式网关的解决方案。网关工作在两个异构的网络之间,连接着无线传感网络和互联网,其功能包括异构网络之间的数据转发和对ZigBee网络的管理。
硬件说明

硬件主要由STM32 Nucleo F401RE评估板、EMW3080 Wi-Fi网络模块、基于CC2530的ZigBee模块构成,并配有开关量输入和输出电路、RS232和RS485电路。MCU是STM32F401RET6芯片;庆科EMW3080wifi模块用于数据远程交互,利用庆科云实现与手机进行数据传输;ZigBee模块包括协调器模块和N个终端模块,协调器模块与MCU通过UART进行通信,终端模块与传感器进行连接

1、整体功能框图

image002.png

2、 实物图

image003.png

3、 接线图

  串行通讯直接采用TTL方式,EMW3080模块与STM32F401RE接线如下:

1STM32F401RE USART1_TXEMW3080 USART0_RX

2STM32F401REUSART1_RXEMW3080 USART0_TX

CC2530模块与STM32F401RE接线如下:

1STM32F401REUSART6_TXEMW3080 USART0_RX

2STM32F401REUSART6_RXEMW3080 USART0_TX

4、核心板

image008.png

5、WiFi模块

6、ZigBee模块

7、温湿传感器DHT11

DHT12数字式温湿度传感器是一款含有己校准数字信号输出的温湿度复合型传感器。它应用专用的数字模块采集技术和半导体温湿度传感器,确保产品具有较高的可靠性与卓越的长期稳定性。

image022.jpg


软件说明

1、STM32F401RET6主控部分软件设计

(1)运行平台:在线ARM mbed os

image016.png

(2)CubeMX初始化串口USART1USART6

image018.png

随后选择芯片,并完成I/O口的初始化操作:

image034.jpg

设置完成后点击生成代码按钮,可以完成代码的生成,并可以继续在Keil中编辑。


(1)主要程序代码

Serial wifi_uart(PA_9, PA_10);

Serial zigbee_uart(PC_6, PC_7);

Serial PC(USBTX, USBRX);

DigitalOut myled(LED1);

DigitalOut zigbee_uart_E(D7);    //zigbee_uart

 

char s[1024];

 

void callback()           //The zigbee_uart Receive interrupt handler function

{

    zigbee_uart.scanf("%s",s);

         wifi_uart.printf("AT+CIPSEND=2,5\r");

         wait(1);

    wifi_uart.printf("%s\r\n",s);

}

void init_wifi()

{

       wifi_uart.printf("AT+WJAP=TP_LINK,12345678\r");

       wait(1);

       wifi_uart.printf("AT+CIPSTART=2,udp_broadcast,172.16.55.255,8080,4001\r");

       wait(1);

}

int main(void)

{

       wifi_uart.baud(115200);

       zigbee_uart.baud(115200);

      

       init_wifi();

      

  while(1)

       {

          zigbee_uart.attach(&callback);

     zigbee_uart_E = 0;               //receive

     myled = !myled;

               wait(5);

  }

}

电脑连接wifi(“TP_LINK”),打开网络调试助手,可以接收到WIFI模块发出的zigbee模块手机的温湿信息,如下图:

image035.jpg

2、zigeeCC2530)模块部分软件设计

(1)       程序编译平台:IAR

(2)       主要程序代码

void DHT11(void)   //温湿传感启动

{

    DATA_PIN=0;

    Delay_ms(19);  //>18MS

    DATA_PIN=1;

    P0DIR &= ~0x80; //重新配置IO口方向

    Delay_10us();

    Delay_10us();                       

    Delay_10us();

    Delay_10us(); 

    if(!DATA_PIN)

    {

        ucharFLAG=2;

        while((!DATA_PIN)&&ucharFLAG++);

        ucharFLAG=2;

        while((DATA_PIN)&&ucharFLAG++);

        COM();

        ucharRH_data_H_temp=ucharcomdata;

        COM();

        ucharRH_data_L_temp=ucharcomdata;

        COM();

        ucharT_data_H_temp=ucharcomdata;

        COM();

        ucharT_data_L_temp=ucharcomdata;

        COM();

        ucharcheckdata_temp=ucharcomdata;

        DATA_PIN=1;

        uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);

        if(uchartemp==ucharcheckdata_temp)

        {

            ucharRH_data_H=ucharRH_data_H_temp;

            ucharRH_data_L=ucharRH_data_L_temp;

            ucharT_data_H=ucharT_data_H_temp;

            ucharT_data_L=ucharT_data_L_temp;

            ucharcheckdata=ucharcheckdata_temp;

        }

        wendu_shi=ucharT_data_H/10;

        wendu_ge=ucharT_data_H%10;

       

        shidu_shi=ucharRH_data_H/10;

        shidu_ge=ucharRH_data_H%10;       

    }

    else //没用成功读取,返回0

    {

        wendu_shi=0;

        wendu_ge=0;

       

        shidu_shi=0;

        shidu_ge=0; 

    }

   

    P0DIR |= 0x80; //IO口需要重新配置

}

 

//获取温湿度发送

void SampleApp_Send_P2P_Message( void )

{

  byte i, temp[3], humidity[3], strTemp[7];

 

  DHT11();             //获取温湿度

 

  //将温湿度的转换成字符串,LCD显示 

  temp[0] = wendu_shi+0x30;

  temp[1] = wendu_ge+0x30;

  temp[2] = '\0';

  humidity[0] = shidu_shi+0x30;

  humidity[1] = shidu_ge+0x30;

  humidity[2] = '\0';

  //将数据整合后方便发给协调器显示

  osal_memcpy(strTemp, temp, 2);

  osal_memcpy(&strTemp[2], humidity, 3);

 

  //获得的温湿度通过串口输出到电脑显示

  HalUARTWrite(0, " Temperature:", 12);

  HalUARTWrite(0, strTemp, 2);

HalUARTWrite(0, " Humidity:", 9);

HalUARTWrite(0, &strTemp[2], 2);

  HalUARTWrite(0, "\n",1);

 

  if ( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc,

                       SAMPLEAPP_P2P_CLUSTERID,

                       6,

                       strTemp,

                       &SampleApp_TransID,

                       AF_DISCV_ROUTE,

                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )

  {

  }

  else

  {

    // Error occurred in request to send.

  }

}

 

//数据接收

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )

{

  uint16 flashTime;

 

  switch ( pkt->clusterId )

  {

    case SAMPLEAPP_P2P_CLUSTERID:

      HalUARTWrite(0, "T&H:", 4);       //提示接收到数据

      HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据

      HalUARTWrite(0, "\n", 1);         // 回车换行

      break;   

    case SAMPLEAPP_PERIODIC_CLUSTERID:

      break;

 

    case SAMPLEAPP_FLASH_CLUSTERID:

      flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );

      HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );

      break;

  }

}

Zigbee串口输出如下图:

image036.jpg

演示效果

image037.jpg

附件

(9.26 MB)下载

评论区(1 )
  • wkp1992101: 看起来不错,智能网关

    回复