zigbee协议栈应用(五)协议栈与温湿度传感器DHT11

1.实现点播通讯

   1.1实现步骤

     (1)添加点播函数声明

       zigbee协议栈应用(五)协议栈与温湿度传感器DHT11_第1张图片

     (2)搜索 afAddrGroup,在它下增加对 SampleApp_P2P_DstAddr 配置,可直接复制广播的配
置 修改即可,增加后如下:

       zigbee协议栈应用(五)协议栈与温湿度传感器DHT11_第2张图片

    (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添加文件

     zigbee协议栈应用(五)协议栈与温湿度传感器DHT11_第3张图片

    在协议栈的 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"

zigbee协议栈应用(五)协议栈与温湿度传感器DHT11_第4张图片

1.选择 CoodinatorEB, 下载到板 A;作为协调器,通过 USB 线跟电脑连接.
2.选择 EndDeviceEB, 下载到板 B;作为终端设备无线发送数据给协调器,也通过
USB 线跟电脑连接.
3.给两块开发板上电,打开串口调试助手,设为:115200 8N1并打开串口,串口请选择
自 己的端口号。终端连网成功后会向协调器发数据

你可能感兴趣的:(zigbee)