打印
[开发板]

【CW32L031CxTx StartKit评估板测评】HC-SR501检测

[复制链接]
394|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# 人体红外传感器HC-SR501相信大伙都不陌生,这类传感器功耗低,常用于智能家居,红外监控的项目上。其工作原理也比较简单,人体会发出特定波长为10um左右的红外线,HC-SR501模块集成了红外感应源,该感应源通常采用热释电元件,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经检测处理后就能产生报警信号。
     下面来看看这个功能模块,实物图如下图所示:

      模块的功能特点:
①、全自动感应:人进入其感应范围则输出高电平, 人离开感应范围则自动延时关闭高电平,输出低电平。
②、光敏控制(可选择,出厂时未设)可设置光敏控制,白天或光线强时不感应。
③、温度补偿(可选择,出厂时未设):在夏天当环境温度升高至30~32℃,探测距离稍变短,温度补偿可作一定的性能补偿。
④、两种触发方式:(可跳线选择)
      a、不可重复触发方式:即感应输出高电平后,延时时间段一结束,输出将自动从高电平变成低电平;
      b、可重复触发方式:即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。
⑤、具有感应封锁时间(默认设置:2.5S 封锁时间):感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号。此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。(此时间可设置在零点几秒—几十秒钟)。
⑥、工作电压范围宽:默认工作电压DC4.5V-20V。
⑦、微功耗:静态电流<50 微安,特别适合干电池供电的自动控制产品。
⑧、输出高电平信号:可方便与各类电路实现对接。

      HC-SR501功能模块带有可调节旋钮,两个可调节旋钮实物图如下所示:

     距离调节:调节距离电位器顺时针旋转,感应距离增大(约7 米),反之,感应距离减小(约3 米)。
     延时调节:调节延时电位器顺时针旋转,感应延时加长(约200S),反之,感应延时减短(约8S )。
     关于该模块的软件部分,实现也比较简单,代码展示如下:
#include "../inc/main.h"
#include "bsp_HC-SR501.h"

#define LED_GPIO_PORT CW_GPIOB
#define LED_GPIO_PINS GPIO_PIN_8 | GPIO_PIN_9

void Delay(uint16_t nCount);

int32_t main(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
                HC_SR501_GPIO_Init();

    RCC_HSI_Enable(RCC_HSIOSC_DIV6);
    __RCC_GPIOC_CLK_ENABLE();

    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pins = LED_GPIO_PINS;

    GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);

    while (1)
    {
if(HC_SR501_StateRead()==HC_SR501_LOW)
                                {
                                         GPIO_WritePin(LED_GPIO_PORT,LED_GPIO_PINS,GPIO_Pin_RESET);
                                                                Delay(0xFFFF);
                                }
                                else
                                {
                                        GPIO_WritePin(LED_GPIO_PORT,LED_GPIO_PINS,GPIO_Pin_SET);
                                                                Delay(0xFFFF);
                                }

    }
}

void Delay(__IO uint16_t nCount)
{
    /* Decrement nCount value */
    while (nCount != 0)
    {
        nCount--;
    }
}
/* 包含头文件 ----------------------------------------------------------------*/
#include "bsp_HC-SR501.h"


/**
  * 函数功能: 人体红外感应模块IO引脚初始化.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:对人体红外感应模块接入的引脚进行初始化
  *           
  */
void HC_SR501_GPIO_Init(void)
{
   /* 定义IO硬件初始化结构体变量 */
  GPIO_InitTypeDef GPIO_InitStruct;
       
        /* 使能(开启)HC_SR501引脚对应IO端口时钟 */  
        __RCC_GPIOA_CLK_ENABLE();
   
        //GPIO_InitStruct.IT = GPIO_IT_HIGH;
        /* 设定HC_SR501对应引脚IO为浮空输入模式 */
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  
  /* 设定HC_SR501对应引脚IO编号 */
  GPIO_InitStruct.Pins = HC_SR501_GPIO_PIN;  

  /* 初始化HC_SR501对应引脚IO */
  GPIO_Init(HC_SR501_GPIO, &GPIO_InitStruct);
}

/**
  * 函数功能: 简单粗暴的延时函数
  * 输入参数: time;延时时间设置
  * 返 回 值: 无
  * 说    明:软件消抖
  */
static void HC_SR501_ScanDelay(void)
{  
  uint32_t i,j;
  for(i=0;i<10;++i)
    for(j=0;j<100;++j){ }               
}

/**
  * 函数功能: 读取引脚的状态
  * 输入参数:无
  * 返 回 值: HC_SR501_HIGH:有人;
  *           HC_SR501_LOW:没人
  * 说    明:无。
  */
HC_SR501_State_TypeDef HC_SR501_StateRead(void)
{
  /* 读取模块输出信号,若此时输出的是高电平 ,则进入下一步判断*/
  if(GPIO_ReadPin(HC_SR501_GPIO,HC_SR501_GPIO_PIN)==HC_SR501_ACTIVE_LEVEL)
  {
    /* 延时一小段时间,消除抖动 */
    HC_SR501_ScanDelay();
    /* 延时时间后再来判断引脚状态,如果还是高电平那么确实就是高电平 */
    if(GPIO_ReadPin(HC_SR501_GPIO,HC_SR501_GPIO_PIN)==HC_SR501_ACTIVE_LEVEL)
    {      
       /* 按键扫描完毕,确定有人,返回有人状态(高电平) */
      return HC_SR501_HIGH;
    }
  }
  /* 没人,返回没人状态 */
  return HC_SR501_LOW;
}

#ifndef __BSP_HC_SR501_H__
#define __BSP_HC_SR501_H__

/* 包含头文件 -----------------------------------------------------------*/
#include "../inc/main.h"

/* 类型定义 --------------------------------------------------------------*/
typedef enum
{
  HC_SR501_LOW   = 0,
  HC_SR501_HIGH = 1,
}HC_SR501_State_TypeDef;

/* 宏定义 --------------------------------------------------------------------*/
#define HC_SR501_RCC_CLK_ENABLE()         _RCC_GPIOA_CLK_ENABLE()
#define HC_SR501_GPIO_PIN                 GPIO_PIN_7
#define HC_SR501_GPIO                     CW_GPIOA
#define HC_SR501_ACTIVE_LEVEL             1

/* 函数声明 ------------------------------------------------------------------*/
void HC_SR501_GPIO_Init(void);
HC_SR501_State_TypeDef HC_SR501_StateRead(void);

#endif  
     编译完成后,下载到CW32L031CxTx StartKit开发板中,然后使用手挥动触发人体红外感应,演示的效果见下面视频展示。大体上感觉还算比较灵敏。当然这个红外感应模块还是存在些缺点的,1)容易受各种热源、光源干扰;2)被动红外穿透力差,人体的红外辐射容易被遮挡,不易被探头接收;3)易受射频辐射的干扰;4)环境温度和人体温度接近时,探测和灵敏度明显下降,有时造成短时失灵。
HC-SR501人体感应模块.pdf (700.89 KB)


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

1005

帖子

6

粉丝