1. 程式人生 > >zigbee協議棧應用(五)協議棧與溫溼度感測器DHT11

zigbee協議棧應用(五)協議棧與溫溼度感測器DHT11

1.實現點播通訊

   1.1實現步驟

     (1)新增點播函式宣告

       

     (2)搜尋 afAddrGroup,在它下增加對 SampleApp_P2P_DstAddr 配置,可直接複製廣播的配
置 修改即可,增加後如下:

       

    (3)增加點播發送函式

       //點播發送函式
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], "  ", 2);
    osal_memcpy(&strTemp[4], humidity, 3);
    // 獲得的溫溼度通過串列埠輸出到電腦顯示
    HalUARTWrite(0, "T&H:", 4);
    HalUARTWrite(0, strTemp, 6);
    HalUARTWrite(0, "\n",1);
    /*
    // 輸出到 LCD 顯 示
    for(i=0; i<3; i++) // 輸出溫度、溼度提示字元
    {
      if(i==0)
      {
        LCD_P16x16Ch(i*16,4,i*16);
        LCD_P16x16Ch(i*16,6,(i+3)*16);
      }
      else
      {
        LCD_P16x16Ch(i*16,4,i*16);
        LCD_P16x16Ch(i*16,6,i*16);
      }
    }
    LCD_P8x16Str(44, 4, temp);  //LCD  顯示溫度值
    LCD_P8x16Str(44, 6, humidity);  //LCD  顯示溼度值*/
    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.
    }
}

(4)搜尋 SampleApp_ProcessEvent,找到 if ( events &
SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) 修改成如下程式碼:
if ( ( events & & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) )
{ {
// Send the periodic message
//SampleApp_SendPeriodicMessage(); // 註釋原來的傳送函式
SampleApp_Send_P2P_Message(); // 增加點播的傳送函式
// Setup to send message again in normal period (+ a a little jitter)
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + + (osal_rand() & & 0x00FF)) );
// return unprocessed events
return (events ^ ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
} }

(5)協調器不需要週期發資料,註釋協調器的週期事件
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( //(SampleApp_NwkState == DEV_ZB_COORD) ||
(SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
{
// Start sending the periodic message in a regular interval.
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
else
{
// Device is no longer in the network
}
break;

2.實現無線溫溼度感測

  2.1新增檔案

     

    在協議棧的 APP 目錄樹下點選右鍵--Add--新增 DHT11.c和 DHT11.h檔案。並在
SampleApp.c
檔案中包含 DHT11.h標頭檔案。

2.2初始化串列埠與IO口

//------------------------配置串列埠---------------------------------
  MT_UartInit();                    //串列埠初始化
  MT_UartRegisterTaskID(task_id);   //註冊串列埠任務
  P0SEL&=0x7f;//設定P_7為通用IO
  HalUARTWrite(0,"UartInit OK\n", sizeof("UartInit OK\n"));

2.3DH11 .c 檔案還需要修改一個地方。開啟檔案將原來的延時函式改成協議棧自帶的延時函
數,保證時序的正確。同時要包含 #include"OnBoard.h"


1.選擇 CoodinatorEB, 下載到板 A;作為協調器,通過 USB 線跟電腦連線.
2.選擇 EndDeviceEB, 下載到板 B;作為終端裝置無線傳送資料給協調器,也通過
USB 線跟電腦連線.
3.給兩塊開發板上電,開啟串列埠除錯助手,設為:115200 8N1並開啟串列埠,串列埠請選擇
自 己的埠號。終端連網成功後會向協調器發資料