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)
{
GPIO_InitTypeDef GPIO_InitStruct;
HC_SR501_RCC_CLK_ENABLE();
GPIO_InitStruct.Pin = HC_SR501_GPIO_PIN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull= GPIO_PULLDOWN;
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;
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;
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;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
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)
{
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);
}
}
编译下载后,感应效果展示如下视频:
感应效果演示
|