本帖最后由 eltonchang2001 于 2022-5-25 14:26 编辑
HC-SR501人体红外传感器今天分享的是HC-SR501人体红外传感器的使用,下面我会结合stm32以及正在做的合泰HT32这两个型号的芯片进行例程讲解。 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 的用法基本一致,只是相应的函数名称和初始化上有点区别。
|