点击左上角的
“关注”
,定期更新Zigbee最新资讯,总有你想要的信息!
这篇文章给出了基于 Z-Stack 3.0.2 协议栈的人体热红外传感器 “AM312” 的驱动代码。
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
#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
* 调用函数:NONE
* 引用全局变量:NONE
* 函数全局变量: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
* 调用函数:
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
);
}
> Zigbee进阶:功能模块
> 免费的Zigbee抓包神器!比Ubiqua还好用!