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); } }
编译下载后,感应效果展示如下视频: