基於 Z-Stack 3.0.2 的人體熱紅外傳感器 AM312
點擊左上角的
“關注”
,定期更新Zigbee最新資訊,總有你想要的信息!
目錄
- 概述
- 代碼分析
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
);
}