资讯详情

实验七 —— 温湿度传感器

实验要求

在这里插入图片描述

实验源码

/*exam7coo.h*/ #ifndef EXAM7COO_H #define EXAM7COO_H  #ifdef __cplusplus extern "C" { 
           #endif #include "ZComDef.h"    #define WsdAPP_ENDPOINT 10  #define WsdAPP_PROFID 0x0F04 #define WsdAPP_DEVICEID 0x0001 #define WsdAPP_DEVICE_VERSION 0 #define WsdAPP_FLAGS 0  #define WsdAPP_MAX_CLUSTERS 1 #define WsdAPP_CLUSTERID 1  #define WsdAPP_SEND_MSG_TIMEOUT 2000 #define TIMEOUT_EVT_FLAG (1<<0)      extern void WsdApp_Init( byte task_id ); extern UINT16 WsdApp_ProcessEvent( byte task_id, UINT16 events ); #ifdef __cplusplus 
       
        } 
        #endif 
        #endif /* WsdAPP_H */ 
       
/*exam7coo.c*/
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>
#include <stdio.h>
#include "exam7coo.h"
#include "DebugTrace.h"

#if !defined( WIN32 )
  #include "OnBoard.h"
#endif

/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
const cId_t WsdApp_ClusterList[WsdAPP_MAX_CLUSTERS] =
{ 
        
  WsdAPP_CLUSTERID
};

const SimpleDescriptionFormat_t WsdApp_SimpleDesc =
{ 
        
  WsdAPP_ENDPOINT,              // int Endpoint;
  WsdAPP_PROFID,                // uint16 AppProfId[2];
  WsdAPP_DEVICEID,              // uint16 AppDeviceId[2];
  WsdAPP_DEVICE_VERSION,        // int AppDevVer:4;
  WsdAPP_FLAGS,                 // int AppFlags:4;
  WsdAPP_MAX_CLUSTERS,          // byte AppNumInClusters;
  (cId_t *)WsdApp_ClusterList,  // byte *pAppInClusterList;
  WsdAPP_MAX_CLUSTERS,          // byte AppNumInClusters;
  (cId_t *)WsdApp_ClusterList   // byte *pAppInClusterList;
};

endPointDesc_t WsdApp_epDesc;


byte WsdApp_TaskID;  
devStates_t WsdApp_NwkState;


byte WsdApp_TransID;  // This is the unique message ID (counter)

void WsdApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );


void WsdApp_Init( byte task_id )
{ 
        
  halUARTCfg_t config;
  WsdApp_TaskID = task_id;
  WsdApp_NwkState = DEV_INIT;
  WsdApp_TransID = 0;  

  // Fill out the endpoint description.
  WsdApp_epDesc.endPoint = WsdAPP_ENDPOINT;
  WsdApp_epDesc.task_id = &WsdApp_TaskID;
  WsdApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&WsdApp_SimpleDesc;
  WsdApp_epDesc.latencyReq = noLatencyReqs;
  // Register the endpoint description with the AF
  afRegister( &WsdApp_epDesc ); 
 
  config.baudRate = HAL_UART_BR_115200;
  config.flowControl = FALSE;
  
//下面添加串口的配置代码HalUARTOpen
  HalUARTOpen(HAL_UART_PORT_0,&config);
}

UINT16 WsdApp_ProcessEvent( byte task_id, UINT16 events )
{ 
        
  afIncomingMSGPacket_t *MSGpkt;
  (void)task_id;  // Intentionally unreferenced parameter

  if ( events & SYS_EVENT_MSG )
  { 
        
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( WsdApp_TaskID );
    while ( MSGpkt )
    { 
        
      switch ( MSGpkt->hdr.event )
      { 
         
        case AF_INCOMING_MSG_CMD://协调器收到无线数据
          WsdApp_MessageMSGCB( MSGpkt );
          break; 
        default:
          break;
      }
      // Release the memory
      osal_msg_deallocate( (uint8 *)MSGpkt );
      // Next
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( WsdApp_TaskID );
    }
    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }
  // Discard unknown events
  return 0;
}

void WsdApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{ 
        
unsigned char buffer[21];
  switch ( pkt->clusterId )
  { 
        
    case WsdAPP_CLUSTERID:
      osal_memcpy(buffer,pkt->cmd.Data,21);//把数据拷贝到buffer
      if(osal_memcmp(buffer,"humi",4)==TRUE)
      	{ 
        
            HalUARTWrite(HAL_UART_PORT_0,buffer,21);
      	}
      break;
  }
}
/*exam7end.c*/
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>
#include <stdio.h>
#include "exam7coo.h"
#include "DebugTrace.h"
#include "OnBoard.h"


/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
const cId_t WsdApp_ClusterList[WsdAPP_MAX_CLUSTERS] =
{ 
        
  WsdAPP_CLUSTERID
};

const SimpleDescriptionFormat_t WsdApp_SimpleDesc =
{ 
        
  WsdAPP_ENDPOINT,              // int Endpoint;
  WsdAPP_PROFID,                // uint16 AppProfId[2];
  WsdAPP_DEVICEID,              // uint16 AppDeviceId[2];
  WsdAPP_DEVICE_VERSION,        // int AppDevVer:4;
  WsdAPP_FLAGS,                 // int AppFlags:4;
  WsdAPP_MAX_CLUSTERS,          // byte AppNumInClusters;
  (cId_t *)WsdApp_ClusterList,  // byte *pAppInClusterList;
  WsdAPP_MAX_CLUSTERS,          // byte AppNumInClusters;
  (cId_t *)WsdApp_ClusterList   // byte *pAppInClusterList;
};


endPointDesc_t WsdApp_epDesc;
byte WsdApp_TaskID;   
devStates_t WsdApp_NwkState;

afAddrType_t WsdApp_DstAddr;
byte WsdApp_TransID;  // This is the unique message ID (counter)

void WsdApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );


void Am2312_Start(void);
uint8 Am2312_Response(void);
unsigned char Read_SensorBit(void);
unsigned char Read_SensorData(void);
unsigned char Read_Sensor(uint16 *humi,uint16 *temp);
void AF_Send(unsigned char *buffer);
unsigned char Am2321_Data[5]={ 
        0x00,0x00,0x00,0x00,0x00};
void WsdApp_Init( byte task_id )
{ 
        
  WsdApp_TaskID = task_id;
  WsdApp_NwkState = DEV_INIT;
  WsdApp_TransID = 0;  
  
  WsdApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
  WsdApp_DstAddr.endPoint = WsdAPP_ENDPOINT;
  WsdApp_DstAddr.addr.shortAddr = 0;
  // Fill out the endpoint description.
  WsdApp_epDesc.endPoint = WsdAPP_ENDPOINT;
  WsdApp_epDesc.task_id = &WsdApp_TaskID;
  WsdApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&WsdApp_SimpleDesc;
  WsdApp_epDesc.latencyReq = noLatencyReqs;
  // Register the endpoint description with the AF
  afRegister( &WsdApp_epDesc ); 

osal_start_timerEx( WsdApp_TaskID,
                     TIMEOUT_EVT_FLAG,
                     WsdAPP_SEND_MSG_TIMEOUT );
  
  
}
uint16 humi=0,temp=0;
uint8 inform[22];
UINT16 WsdApp_ProcessEvent( byte task_id, UINT16 events )
{ 
        
  (void)task_id;  // Intentionally unreferenced parameter
  
  if ( events & SYS_EVENT_MSG )
  { 
        
   
    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }
  
  if ( events & TIMEOUT_EVT_FLAG )
  { 
        
      osal_start_timerEx( WsdApp_TaskID,
                     TIMEOUT_EVT_FLAG,
                     WsdAPP_SEND_MSG_TIMEOUT );
         Read_Sensor(&humi,&temp);
         sprintf(inform,"humi:%d%% temp:%dC\r\n\r\n",humi,temp);
         AF_Send(inform);
      return (events ^ TIMEOUT_EVT_FLAG);
  }
  // Discard unknown events
  return 0;
}


//起始信号
void Am2312_Start(void)
{ 
        
  P0SEL &= ~(1<<4);
  P0DIR |= (1<<4);
  P0_4 = 0;
  MicroWait(1000);
  P0_4 = 1;
  MicroWait(30);
  
}
//响应信号
uint8 Am2312_Response(void)
{ 
        
  P0DIR &= ~(1<<4);
  P0INP &= ~(1<<4);
  P2INP &= ~(1<<5);
  uint8 cnt=0; 
  while (P0_4&&cnt<100)//DHT11会拉低40~80us
  { 
        
        cnt++;
        MicroWait(1);
  };	 
  if(cnt>=100)return 1;
  else cnt=0;
  while (!P0_4&&cnt<100)//DHT11拉低后会再次拉高40~80us
  { 
        
        cnt++;
        MicroWait(1);
  };
  if(cnt>=100)return 1;	    
  return 0;
 
}

//读取一位数据
unsigned char Read_SensorBit(void)
{ 
        
    uint8 cnt=0;
    while(P0_4&&cnt<100)//等待变为低电平
    { 
        
          cnt++;
          MicroWait(1);
    }
    cnt=0;
    while(!P0_4&&cnt<100)//等待变高电平
    { 
        
          cnt++;
          MicroWait(1);
    }
    MicroWait(40);//等待40us
    if(P0_4)return 1;
    else return 0;
}
//读取单个字节数据
unsigned char Read_SensorData(void)
{ 
        
    uint8 data=0,i,cnt;
    for(i=0;i<8;i++)
    { 
        
        data <<= 1;
        data |= Read_SensorBit();
    }
    return data;
}


//读取40位数据
unsigned char Read_Sensor(uint16 *humi,uint16 *temp)
{ 
        
    uint8 buf[5];
    uint8 i;
    Am2312_Start();
    if(Am2312_Response()==0)
    { 
        
      for(i=0;i<5;i++)//读取40位数据
      { 
        
              buf[i]=Read_SensorData();
      }
      if((uint8)(buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
      { 
        
              *humi=(buf[0]<<8) | buf[1];
              *humi /= 10;
              *temp=(buf[2]<<8) | buf[3];
              *temp /= 10;
      }
    }else return 1;
    return 0;	
}

void AF_Send(unsigned char *buffer)
{ 
        
  AF_DataRequest( &WsdApp_DstAddr, &WsdApp_epDesc,
                       WsdAPP_CLUSTERID,
                       (byte)osal_strlen(buffer) + 1,
                       buffer,
                       &WsdApp_TransID,
                       AF_DISCV_ROUTE, 
                       AF_DEFAULT_RADIUS );
}

实验思路

协调器:等待并接收终端发来的无线电数据,并通过串口打印

终端:每隔2s将温湿度传感器采集到的数据通过无线电发送给协调器

补充

printf(“humi:%d%%”,humi);

校验码=0x03+0x41+0x00+0xFA=13E

如果是象下面这种写法,用表达式代表校验码,并没有用一个8位的数据类型变量存着,编译器为了能存下这个值,它会申请16位的数据类型空间来存放13E,一个16位的值跟一个8位的值不管怎么相比(即使它们低8位的值相同),都不相同

if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])

加强制类型转换(或者用一个8位的数据类型变量存数据,会自动抛弃16位数据中的高8位,保留低8位)

if((uint8)(buf[0]+buf[1]+buf[2]+buf[3])==buf[4])

实验现象

智能家居zigbee实验七(点击跳转)

标签: 无线温温度传感器cnt传感器am2315温湿度传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台