#申请原创# 人体红外传感器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)
|