聚豐項(xiàng)目 > 基于NUCLEO-F401RE的zigbee智能網(wǎng)關(guān)
ZigBee協(xié)議與互聯(lián)網(wǎng)中所使用的TCP/IP協(xié)議并不兼容,要想把ZigBee網(wǎng)絡(luò)接入到基于IP的互聯(lián)網(wǎng),就需要一個(gè)設(shè)備來(lái)完成兩個(gè)異構(gòu)網(wǎng)絡(luò)間數(shù)據(jù)的轉(zhuǎn)發(fā)。因此,提出了網(wǎng)關(guān)的概念,由網(wǎng)關(guān)來(lái)完成兩個(gè)異構(gòu)網(wǎng)絡(luò)之間數(shù)據(jù)的轉(zhuǎn)發(fā)。本文使用STM32 Nucleo F401RE評(píng)估板、EMW3080 Wi-Fi網(wǎng)絡(luò)模塊、CC2530 ZigBee模塊,設(shè)計(jì)了一種嵌入式網(wǎng)關(guān)的解決方案。網(wǎng)關(guān)工作在兩個(gè)異構(gòu)的網(wǎng)絡(luò)之間,連接著無(wú)線傳感網(wǎng)絡(luò)和互聯(lián)網(wǎng),其功能包括異構(gòu)網(wǎng)絡(luò)之間的數(shù)據(jù)轉(zhuǎn)發(fā)和對(duì)ZigBee網(wǎng)絡(luò)的管理。
大雨淅淅
分享大雨淅淅
團(tuán)隊(duì)成員
嚴(yán)敏 軟件工程師
張影影 隊(duì)長(zhǎng)
硬件主要由STM32 Nucleo F401RE評(píng)估板、EMW3080 Wi-Fi網(wǎng)絡(luò)模塊、基于CC2530的ZigBee模塊構(gòu)成,并配有開關(guān)量輸入和輸出電路、RS232和RS485電路。MCU是STM32F401RET6芯片;慶科EMW3080wifi模塊用于數(shù)據(jù)遠(yuǎn)程交互,利用慶科云實(shí)現(xiàn)與手機(jī)進(jìn)行數(shù)據(jù)傳輸;ZigBee模塊包括協(xié)調(diào)器模塊和N個(gè)終端模塊,協(xié)調(diào)器模塊與MCU通過(guò)UART進(jìn)行通信,終端模塊與傳感器進(jìn)行連接
1、整體功能框圖
2、 實(shí)物圖
3、 接線圖
串行通訊直接采用TTL方式,EMW3080模塊與STM32F401RE接線如下:
(1)STM32F401RE USART1_TX接EMW3080 USART0_RX
(2)STM32F401REUSART1_RX接EMW3080 USART0_TX
CC2530模塊與STM32F401RE接線如下:
(1)STM32F401REUSART6_TX接EMW3080 USART0_RX
(2)STM32F401REUSART6_RX接EMW3080 USART0_TX
4、核心板
5、WiFi模塊
6、ZigBee模塊
7、溫濕傳感器DHT11
DHT12數(shù)字式溫濕度傳感器是一款含有己校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合型傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和半導(dǎo)體溫濕度傳感器,確保產(chǎn)品具有較高的可靠性與卓越的長(zhǎng)期穩(wěn)定性。
1、STM32F401RET6主控部分軟件設(shè)計(jì)
(1)運(yùn)行平臺(tái):在線ARM mbed os
(2)CubeMX初始化串口USART1、USART6
隨后選擇芯片,并完成I/O口的初始化操作:
設(shè)置完成后點(diǎn)擊生成代碼按鈕,可以完成代碼的生成,并可以繼續(xù)在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”),打開網(wǎng)絡(luò)調(diào)試助手,可以接收到WIFI模塊發(fā)出的zigbee模塊手機(jī)的溫濕信息,如下圖:
2、zigee(CC2530)模塊部分軟件設(shè)計(jì)
(1) 程序編譯平臺(tái):IAR
(2) 主要程序代碼
void DHT11(void) //溫濕傳感啟動(dòng)
{
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 //沒(méi)用成功讀取,返回0
{
wendu_shi=0;
wendu_ge=0;
shidu_shi=0;
shidu_ge=0;
}
P0DIR |= 0x80; //IO口需要重新配置
}
//獲取溫濕度發(fā)送
void SampleApp_Send_P2P_Message( void )
{
byte i, temp[3], humidity[3], strTemp[7];
DHT11(); //獲取溫濕度
//將溫濕度的轉(zhuǎn)換成字符串,供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';
//將數(shù)據(jù)整合后方便發(fā)給協(xié)調(diào)器顯示
osal_memcpy(strTemp, temp, 2);
osal_memcpy(&strTemp[2], humidity, 3);
//獲得的溫濕度通過(guò)串口輸出到電腦顯示
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.
}
}
//數(shù)據(jù)接收
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint16 flashTime;
switch ( pkt->clusterId )
{
case SAMPLEAPP_P2P_CLUSTERID:
HalUARTWrite(0, "T&H:", 4); //提示接收到數(shù)據(jù)
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //輸出接收到的數(shù)據(jù)
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串口輸出如下圖:
(9.26 MB)下載
wkp1992101: 看起來(lái)不錯(cuò),智能網(wǎng)關(guān)
回復(fù)