HC-SR501人体红外传感器详细解析

HC-SR501人体红外传感器

今天分享的是HC-SR501人体红外传感器的使用,下面我会结合stm32以及正在做的合泰HT32这两个型号的芯片进行例程讲解。

HC-SR501介绍

1、HC-SR501是基于红外线HC-SR501是基于红外线技术的自动控制模块 ,采用德国原装进口LHI778 探头设计,灵敏度高,可靠性强,超低电压工作模式 ,广泛应用于各类自动感应电器设备 ,尤其是干电池供电的自动控制产品。
2、模块为全自动感应,当人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。传感器有两种触发方式(可通过跳线进行选择):第一种不可重复触发方式,即感应输出高电平后,延时一段时间结束,输出将自动从高电平变成低电平。第二种可重复触发方式,即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)
3、具有感应封锁时间(默认设置:2.5S 封锁时间):感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号。此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。(此时间可设置在零点几秒—几十秒钟)。感应模块通电后有一分钟左右的初始化时间,在此期间模块会间隔地输出0-3 次,一分钟后进入待机状态。

引脚接线

HC-SR501在使用的时候我们只需要接三根线就可以了,VCC GND OUT(输出引脚)中间的那根是信号线也就是我们的OUT输出引脚。我们从该模块的背后可以看出有一端上面有H L 的跳帽,靠近这个的引脚为GND 剩下的一个就是VCC。

注意

该模块在使用的时候我们需要接5v直流进行驱动
并且我们可以通过下面这两个电位器进行延时和
距离的调节
顺时针转动延时调节的时候,感应延时加长反之减短
顺时针转动距离调节的时候,感应距离变长反之变短

进入正题,HC-SR501的具体使用

1.stm32驱动HC-SR501

/*==================infrared.h===============*/
#ifndef _INFRARED_H_
#define _INFRARED_H_
#include "stm32f10x.h"

/*-----大家可以根据自己进行引脚端口等的修改---------*/
#define PORT GPIOB
#define PIN GPIO_Pin_4
#define GPIOB_RCC RCC_APB2Periph_GPIOB

#define Read_STATE() GPIO_ReadInputDataBit(PORT,PIN)//读取人体红外的值

void Infrared_Init(void);
void  infrared_test(void);
#endif
/*=================infrared.c=================*/
#include "infrared.h"
#include "led.h"
#include "usart.h"



//红外引脚初始化
void Infrared_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量   
    RCC_APB2PeriphClockCmd(GPIOB_RCC,ENABLE);	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin  = PIN ;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(PORT ,&GPIO_InitStructure);
}


//红外人体感应功能测试
//感应到人体输出高电平,离开感应区域输出低电平
//下面的判断语句中根据自己的功能来进行修改
void  infrared_test(void)
{
	if( Read_STATE() == RESET)
	{
		printf("NO People\n");
		close_led();	
	}
	else
	{
		printf("People\n");
		open_led();
	}
}
/*===================main.c==================*/
#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"
#include "led.h"
#include "infrared.h"


void Delay(unsigned int t)
{
	unsigned int i,j;
	for(i = 0;i < t;i++)
	{
		for(j = 0;j< 12000;j++);
	}
}

int main(void)
{
	Usart_Init();
	Led_Init();
	Infrared_Init();
	USART_SendStr(USART1,"STM32 Infrared Test\n");
	while(1)
	{
		infrared_test();	
	}

2.合泰HT32驱动HC-SR501

/*=================infrared.h================*/
#ifndef _INFRARED_H_
#define _INFRARED_H_

#include "ht32f5xxxx_ckcu.h"
#include "ht32f5xxxx_gpio.h"
#include "ht32f5xxxx_01.h"

//端口号定义
#define HT_GPIO_PORT_infrared HT_GPIOA

//引脚定义
#define infrared_GPIO_PIN  GPIO_PIN_15
#define Read_STATE() GPIO_ReadInBit(HT_GPIO_PORT_infrared,infrared_GPIO_PIN)   
void Infrared_Init(void);
void  infrared_test(void);
#endif
/*================infrared.c=============*/
#include "infrared.h"
#include "led.h"
#include "uart.h"

void Infrared_Init(void)
{
	CKCU_PeripClockConfig_TypeDef CKCUClock_infrared= {{0}};
	CKCUClock_infrared.Bit.PA = 1;  //开启GPIOB时钟
	CKCU_PeripClockConfig(CKCUClock_infrared, ENABLE);
	GPIO_DirectionConfig(HT_GPIO_PORT_infrared,infrared_GPIO_PIN,GPIO_DIR_IN);
	GPIO_InputConfig(HT_GPIO_PORT_infrared, infrared_GPIO_PIN, ENABLE);
  	GPIO_PullResistorConfig(HT_GPIO_PORT_infrared, infrared_GPIO_PIN, GPIO_PR_DOWN);
}


//红外人体感应功能测试
//感应到人体输出高电平,离开感应区域输出低电平
void  infrared_test(void)
{
	if( Read_STATE() == RESET)
	{
		printf("NO  People\n");
		LED1_OFF();	
	}
	else
	{
		printf("People\n");
		LED1_ON();
	}
}
/*==================main.c==================*/
#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "uart.h"
#include "infrared.h"

/**********************TH32 红外人体感应**********************
Author:小殷

Date:2022-5-4
******************************************************/
int main()
{
	Led_Init();
	USARTx_Init();
	Infrared_Init();
	printf("HT32 INFRARED TEST\n");
	while(1)
	{
		infrared_test();
		delay_ms(1000);
	}
}

总的来说,HC-SR501这款人体感应测试还挺好用的,上述两个Demo 的用法基本一致,只是相应的函数名称和初始化上有点区别。

物联沃分享整理
物联沃-IOTWORD物联网 » HC-SR501人体红外传感器详细解析

发表评论