基於 Z-Stack 3.0.2 的人體熱紅外傳感器 AM312

基於 Z-Stack 3.0.2 的人體熱紅外傳感器 AM312



點擊左上角的“關注”,定期更新Zigbee最新資訊,總有你想要的信息!

目錄

  1. 概述
  2. 代碼分析

1. 概述

  這篇文章給出了基於 Z-Stack 3.0.2 協議棧的人體熱紅外傳感器 “AM312” 的驅動代碼。

2. 代碼分析

SmartSens.h:

#ifndef __SMARTSENS_H
#define __SMARTSENS_H


#include "AF.h"
/*********************************************************************
 * MACROS
 */
#define OPEN_SMARTSENS   0x01
#define CLOSE_SMARTSENS  0x00
#define TOGGLE_SMARTSENS 0x02

#define STATUS_SMARTSENS_ON    0x01
#define STATUS_SMARTSENS_OFF   0x00

#define OCCUPIED   1
#define UNOCCUPIED 0


/*********************************************************************
 * CONSTANTS
 */

/*********************************************************************
 * TYPEDEFS
 */


/*********************************************************************
 * FUNCTIONS
 */
/**
  初始化 AM312 的 GPIO 口
*/
void Init_AM312_GPIO(void);
/**
  控制紅外傳感開關
*/
void Set_SmartSens(uint8_t state);
/**
  獲取紅外傳感的開關狀態
*/
uint8_t Get_SmartSensState(void);
/**
  紅外感應裝置中斷處理函數
*/
void SmartSens_Isr(void);

void Send_Infrared(void);

#endif

/ ****************************************************** SmartSens.c ******************************************************/

#include <iocc2530.h>
#include "hal_mcu.h"
#include "hal_defs.h"
#include "hal_types.h"
#include "hal_board.h"
#include "hal_drivers.h"
#include "hal_adc.h"
#include "hal_key.h"
#include "osal.h"
#include "AF.h"

#include "SmartSens.h"
#include "Coordinator.h"

/*********************************************************************
 * MACROS
 */
#define ATTRID_OCCUPANCY                        0x0000

/*********************************************************************
 * CONSTANTS
 */


/*********************************************************************
 * TYPEDEFS
 */

/*********************************************************************
 * GLOBAL VARIABLES
 */
uint8_t g_smartsens_onoff = 0;
/*********************************************************************
 * GLOBAL FUNCTIONS
 */


/*********************************************************************
 * LOCAL VARIABLES
 */


/*********************************************************************
 * LOCAL FUNCTIONS
 */

/*********************************************************************
 * EXTERN VARIABLES
 */

/*********************************************************************
 * EXTERN FUNCTIONS
 */


/************************************************************************
* 函數名:void Init_AM312_GPIO(void)
* 功能:初始化 AM312 的 GPIO 口
* 參數:NONE
* 返回值:NONE
* 調用函數:NONE
* 引用全局變量:NONE
* 函數全局變量:NONE
* 作者:Jesse_嘉偉
* 時間:2016/5/17
* 最後修改時間:
* 說明:Jesse_嘉偉的專欄(https://blog.csdn.net/u012993936)
  AM312 的數據口爲 P0_0 口
  設置 P0_0 口爲外部中斷模式,且爲上升沿中斷
*************************************************************************/
void Init_AM312_GPIO(void)
{ 
  // 清除中斷標誌位
  P0IF = 0;
  P0IFG &= ~(1<<0);
 
  // P0_0寄存器設置
  P0SEL &= ~(1<<0);  // P0_0通用功能
  P0DIR &= ~(1<<0); // P0_0輸入方向
  P0INP &= ~(1<<0); // P0_0上拉/下拉模式
  P2INP |= (1<<5);  // 將端口0設爲下拉輸入
  PICTL &= ~(1<<0);  //選擇端口0的輸入選擇中斷請求條件爲“上升沿中斷”,捕捉上升沿
  
  // 設置 SFR 寄存器中的中斷使能位
  P0IEN |= (1<<0);  // P0_0中斷使能
  
  // 設置IEN1中的中斷使能位
  IEN1 |= (1<<5);   // 使能端口0中斷
}

/************************************************************************
* 函數名:void SmartSens_ISR(void)
* 功能:紅外感應裝置的中斷處理函數
* 參數:NONE
* 返回值:NONE
* 調用函數:
  void Blink_IndLight(uint8_t numblinks, uint32_t time)
  void Set_OccupancyState(uint8_t state)
  void Send_Alarm(void)
* 引用全局變量:
  Red_Indicator_Light:紅色指示燈
* 函數全局變量:NONE
* 作者:Jesse_嘉偉
* 時間:2016/5/17
* 最後修改時間:
* 說明:Jesse_嘉偉的專欄(https://blog.csdn.net/u012993936)
*************************************************************************/
void SmartSens_Isr(void)
{ 
  Send_Infrared();
}

/************************************************************************
* 函數名:static void Update_SmartSemsState(uint8_t state)
* 功能:更新“紅外感應裝置”狀態
* 參數:
  state:紅外感應裝置狀態
* 返回值:NONE
* 調用函數:NONE
* 引用全局變量:
  g_smartsens_onoff:紅外感應裝置狀態
* 函數全局變量:NONE
* 作者:Jesse_嘉偉
* 時間:2016/5/17
* 最後修改時間:
* 說明:Jesse_嘉偉的專欄(https://blog.csdn.net/u012993936)
*************************************************************************/
static void Update_SmartSemsState(uint8_t state)
{
  g_smartsens_onoff = state;
}

/************************************************************************
* 函數名:static void Toggle_SmartSems(void)
* 功能:取反“紅外感應裝置”
* 參數:NONE
* 返回值:NONE
* 調用函數:
  uint8_t Get_SmartSensState(void)
  void Set_SmartSens(uint8_t state)
* 引用全局變量:NONE
* 函數全局變量:NONE
* 作者:Jesse_嘉偉
* 時間:2016/5/17
* 最後修改時間:
* 說明:Jesse_嘉偉的專欄(https://blog.csdn.net/u012993936)
*************************************************************************/
static void Toggle_SmartSems(void)
{
  if(Get_SmartSensState()==OPEN_SMARTSENS)
  {
    Set_SmartSens(CLOSE_SMARTSENS);
  }
  else
  {
    Set_SmartSens(OPEN_SMARTSENS);
  }
}

/************************************************************************
* 函數名:uint8_t Get_SmartSensState(void)
* 功能:獲取紅外傳感狀態
* 參數:NONE
* 返回值:紅外傳感狀態
* 調用函數:NONE
* 引用全局變量:
  smartsens_state:紅外傳感狀態
* 函數全局變量:NONE
* 作者:Jesse_嘉偉
* 時間:2016/5/17
* 最後修改時間:
* 說明:Jesse_嘉偉的專欄(https://blog.csdn.net/u012993936)
*************************************************************************/
uint8_t Get_SmartSensState(void)
{
  return (g_smartsens_onoff);
}

/************************************************************************
* 函數名:void Set_SmartSens(uint8_t state)
* 功能:控制紅外傳感開關
* 參數:
  state:
    OPEN_SMARTSENS:開啓紅外傳感
    CLOSE_SMARTSENS:關閉紅外傳感
* 返回值:NONE
* 調用函數:
  void Set_Light(Light_t light, uint8_t mode)
  static void Update_SmartSemsState(uint8_t state)
  static void Toggle_SmartSems(void)
* 引用全局變量:NONE
* 函數全局變量:NONE
* 作者:Jesse_嘉偉
* 時間:2016/5/17
* 最後修改時間:
* 說明:Jesse_嘉偉的專欄(https://blog.csdn.net/u012993936)
*************************************************************************/
void Set_SmartSens(uint8_t state)
{
  switch(state)
  {
    case OPEN_SMARTSENS:
      P0IEN |= (1<<0);                                  // 使能“紅外感應裝置”
      Update_SmartSemsState(STATUS_SMARTSENS_ON);       // 更新紅外感應裝置“開關屬性”
      break;
      
    case CLOSE_SMARTSENS:
      P0IEN &= ~(1<<0);                                 // 失能“紅外感應裝置”
      Update_SmartSemsState(STATUS_SMARTSENS_OFF);      // 更新紅外感應裝置“開關屬性”
      
      break;
      
    case TOGGLE_SMARTSENS:
      Toggle_SmartSems();
      break;
      
    default:
      break;
  }
}

/************************************************************************
* 函數名:void Send_Infrared(void)
* 功能:發送熱紅外感應裝置狀態給協調器
* 參數:NONE
* 返回值:NONE
* 調用函數:
* 引用全局變量:NONE
* 函數全局變量:NONE
* 作者:Jesse_嘉偉
* 時間:2016/5/17
* 最後修改時間:
* 說明:Jesse_嘉偉的專欄(https://blog.csdn.net/u012993936)
*************************************************************************/
void Send_Infrared(void)
{
  afAddrType_t dstaddr;
  uint8_t cmd[6] = {0};
  uint8_t devtype = DEV_INFRARED;
  uint16_t nwk = 0;
  uint16_t pnwk = 0;
  uint8_t valueinfrared = 0;

  dstaddr.addr.shortAddr = 0x0000;
  dstaddr.addrMode = (afAddrMode_t)Addr16Bit;
  dstaddr.endPoint = GenericApp_SimpleDesc.EndPoint;
  
  nwk = NLME_GetShortAddr();
  pnwk =  NLME_GetCoordShortAddr();  
  valueinfrared = 1;
  
  osal_memcpy(&cmd[0], &devtype, 1);
  osal_memcpy(&cmd[1], &nwk, 2);
  osal_memcpy(&cmd[3], &pnwk, 2);
  osal_memcpy(&cmd[5], &valueinfrared, 1);
  
  AF_DataRequest(&dstaddr,
                 &GenericApp_epDesc,
                 GenericApp_epDesc.simpleDesc->pAppOutClusterList[0],
                 sizeof(cmd)/sizeof(uint8_t),
                 cmd,
                 0, 
                 AF_DISCV_ROUTE,
                 AF_DEFAULT_RADIUS
                 );
}




--- End ---
你可能還想看:

> Zigbee進階:功能模塊
> 免費的Zigbee抓包神器!比Ubiqua還好用!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章