基于 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 
#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
                 );
}




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

> Zigbee进阶:功能模块
> 免费的Zigbee抓包神器!比Ubiqua还好用!

你可能感兴趣的:(Zigbee,项目专栏)