HC-SR501是基于红外线技术的自动控制模块,采用德国原装进口
LHI778 探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品。实物图如下所示:
这个模块有很多的应用范围,可用在走廊、楼道、卫生间、地下室、仓库、车库等场所的自动照明、排气扇的自动抽风以及其它电器(白炽灯、荧光灯、蜂鸣器、自动门、电风扇、烘干机和自动洗衣机)特别适用于企业,宾馆、商场、库房敏感区域或安全区域和报警系统。还可用于防盗等用途。
该模块的电气参数如下:
模块支持延时响应调节,感应距离调节。
1、调节距离电位器顺时针旋转,感应距离增大(约7米),反之,感应距离减小(约3米)。
2、调节延时电位器顺时针旋转,感应延时加长(约300S),反之,感应延时减短(约0.5S)。
由于模块只需要用到三个引脚,即VCC、OUT、GND,VCC可连接精英板上的5V引脚,OUT与板上的PB7脚连接。
参考的代码如下:
#include "HC-SR501/bsp_HC-SR501.h"
void HC_SR501_GPIO_Init(void)
{
/* 定义IO硬件初始化结构体变量 */
GPIO_InitTypeDef GPIO_InitStruct;
/* 使能(开启)HC_SR501引脚对应IO端口时钟 */
HC_SR501_RCC_CLK_ENABLE();
/* 设定HC_SR501对应引脚IO编号 */
GPIO_InitStruct.Pin = HC_SR501_GPIO_PIN;
/* 设定HC_SR501对应引脚IO操作速度*/
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
/* 设定HC_SR501对应引脚IO为浮空输入模式 */
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull= GPIO_PULLDOWN;
/* 初始化HC_SR501对应引脚IO */
HAL_GPIO_Init(HC_SR501_GPIO, &GPIO_InitStruct);
}
static void HC_SR501_ScanDelay(void)
{
uint32_t i,j;
for(i=0;i<10;++i)
for(j=0;j<100;++j){ }
}
HC_SR501_State_TypeDef HC_SR501_StateRead(void)
{
/* 读取模块输出信号,若此时输出的是高电平 ,则进入下一步判断*/
if(HAL_GPIO_ReadPin(HC_SR501_GPIO,HC_SR501_GPIO_PIN)==HC_SR501_ACTIVE_LEVEL)
{
/* 延时一小段时间,消除抖动 */
HC_SR501_ScanDelay();
/* 延时时间后再来判断引脚状态,如果还是高电平那么确实就是高电平 */
if(HAL_GPIO_ReadPin(HC_SR501_GPIO,HC_SR501_GPIO_PIN)==HC_SR501_ACTIVE_LEVEL)
{
/* 按键扫描完毕,确定有人,返回有人状态(高电平) */
return HC_SR501_HIGH;
}
}
/* 没人,返回没人状态 */
return HC_SR501_LOW;
}
#include "stm32f1xx_hal.h"
typedef enum
{
HC_SR501_LOW = 0,
HC_SR501_HIGH = 1,
}HC_SR501_State_TypeDef;
#define HC_SR501_RCC_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define HC_SR501_GPIO_PIN GPIO_PIN_7
#define HC_SR501_GPIO GPIOB
#define HC_SR501_ACTIVE_LEVEL 1
void HC_SR501_GPIO_Init(void);
HC_SR501_State_TypeDef HC_SR501_StateRead(void);
#include "stm32f1xx_hal.h"
#include "usart/bsp_debug_usart.h"
#include "led/bsp_led.h"
#include "HC-SR501/bsp_HC-SR501.h"
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 外部晶振,8MHz
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 9倍频,得到72MHz主时钟
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 系统时钟:72MHz
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟:72MHz
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1时钟:36MHz
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟:72MHz
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); // 配置并启动系统滴答定时器
/* 系统滴答定时器时钟源 */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* 系统滴答定时器中断优先级配置 */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
int main(void)
{
/* 复位所有外设,初始化Flash接口和系统滴答定时器 */
HAL_Init();
/* 配置系统时钟 */
SystemClock_Config();
LED_GPIO_Init();
HC_SR501_GPIO_Init();
/* 初始化串口并配置串口中断优先级 */
MX_DEBUG_USART_Init();
printf("正点原子精英板\n");
printf("HC-SR501人体红外模块检测\n");
/* 无限循环 */
while (1)
{
if(HC_SR501_StateRead()==HC_SR501_LOW)
{
LED1_OFF;
printf("未发现人体信号\n");
}
else
{
LED1_ON;
printf("HC-SR501检测到人体信号\n");
}
HAL_Delay(500);
}
}
编译下载后,感应效果展示如下视频:
更多回帖