[开发板] 【CW32L031CxTx StartKit评估板测评】HC-SR501检测

[复制链接]
 楼主| yinwuqing110 发表于 2023-10-31 00:01 | 显示全部楼层 |阅读模式
#申请原创# 人体红外传感器HC-SR501相信大伙都不陌生,这类传感器功耗低,常用于智能家居,红外监控的项目上。其工作原理也比较简单,人体会发出特定波长为10um左右的红外线,HC-SR501模块集成了红外感应源,该感应源通常采用热释电元件,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经检测处理后就能产生报警信号。
     下面来看看这个功能模块,实物图如下图所示:
红外HC-SR501人体感应模块.jpg
      模块的功能特点:
①、全自动感应:人进入其感应范围则输出高电平, 人离开感应范围则自动延时关闭高电平,输出低电平。
②、光敏控制(可选择,出厂时未设)可设置光敏控制,白天或光线强时不感应。
③、温度补偿(可选择,出厂时未设):在夏天当环境温度升高至30~32℃,探测距离稍变短,温度补偿可作一定的性能补偿。
④、两种触发方式:(可跳线选择)
      a、不可重复触发方式:即感应输出高电平后,延时时间段一结束,输出将自动从高电平变成低电平;
      b、可重复触发方式:即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。
⑤、具有感应封锁时间(默认设置:2.5S 封锁时间):感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号。此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。(此时间可设置在零点几秒—几十秒钟)。
⑥、工作电压范围宽:默认工作电压DC4.5V-20V。
⑦、微功耗:静态电流<50 微安,特别适合干电池供电的自动控制产品。
⑧、输出高电平信号:可方便与各类电路实现对接。

      HC-SR501功能模块带有可调节旋钮,两个可调节旋钮实物图如下所示:
旋钮示意图.png
     距离调节:调节距离电位器顺时针旋转,感应距离增大(约7 米),反之,感应距离减小(约3 米)。
     延时调节:调节延时电位器顺时针旋转,感应延时加长(约200S),反之,感应延时减短(约8S )。
     关于该模块的软件部分,实现也比较简单,代码展示如下:
  1. #include "../inc/main.h"
  2. #include "bsp_HC-SR501.h"

  3. #define LED_GPIO_PORT CW_GPIOB
  4. #define LED_GPIO_PINS GPIO_PIN_8 | GPIO_PIN_9

  5. void Delay(uint16_t nCount);

  6. int32_t main(void)
  7. {
  8.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  9.                 HC_SR501_GPIO_Init();

  10.     RCC_HSI_Enable(RCC_HSIOSC_DIV6);
  11.     __RCC_GPIOC_CLK_ENABLE();

  12.     GPIO_InitStruct.IT = GPIO_IT_NONE;
  13.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  14.     GPIO_InitStruct.Pins = LED_GPIO_PINS;

  15.     GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);

  16.     while (1)
  17.     {
  18. if(HC_SR501_StateRead()==HC_SR501_LOW)
  19.                                 {
  20.                                          GPIO_WritePin(LED_GPIO_PORT,LED_GPIO_PINS,GPIO_Pin_RESET);
  21.                                                                 Delay(0xFFFF);
  22.                                 }
  23.                                 else
  24.                                 {
  25.                                         GPIO_WritePin(LED_GPIO_PORT,LED_GPIO_PINS,GPIO_Pin_SET);
  26.                                                                 Delay(0xFFFF);
  27.                                 }

  28.     }
  29. }

  30. void Delay(__IO uint16_t nCount)
  31. {
  32.     /* Decrement nCount value */
  33.     while (nCount != 0)
  34.     {
  35.         nCount--;
  36.     }
  37. }
  1. /* 包含头文件 ----------------------------------------------------------------*/
  2. #include "bsp_HC-SR501.h"


  3. /**
  4.   * 函数功能: 人体红外感应模块IO引脚初始化.
  5.   * 输入参数: 无
  6.   * 返 回 值: 无
  7.   * 说    明:对人体红外感应模块接入的引脚进行初始化
  8.   *           
  9.   */
  10. void HC_SR501_GPIO_Init(void)
  11. {
  12.    /* 定义IO硬件初始化结构体变量 */
  13.   GPIO_InitTypeDef GPIO_InitStruct;
  14.        
  15.         /* 使能(开启)HC_SR501引脚对应IO端口时钟 */  
  16.         __RCC_GPIOA_CLK_ENABLE();
  17.    
  18.         //GPIO_InitStruct.IT = GPIO_IT_HIGH;
  19.         /* 设定HC_SR501对应引脚IO为浮空输入模式 */
  20.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  
  21.   /* 设定HC_SR501对应引脚IO编号 */
  22.   GPIO_InitStruct.Pins = HC_SR501_GPIO_PIN;  

  23.   /* 初始化HC_SR501对应引脚IO */
  24.   GPIO_Init(HC_SR501_GPIO, &GPIO_InitStruct);
  25. }

  26. /**
  27.   * 函数功能: 简单粗暴的延时函数
  28.   * 输入参数: time;延时时间设置
  29.   * 返 回 值: 无
  30.   * 说    明:软件消抖
  31.   */
  32. static void HC_SR501_ScanDelay(void)
  33. {  
  34.   uint32_t i,j;
  35.   for(i=0;i<10;++i)
  36.     for(j=0;j<100;++j){ }               
  37. }

  38. /**
  39.   * 函数功能: 读取引脚的状态
  40.   * 输入参数:无
  41.   * 返 回 值: HC_SR501_HIGH:有人;
  42.   *           HC_SR501_LOW:没人
  43.   * 说    明:无。
  44.   */
  45. HC_SR501_State_TypeDef HC_SR501_StateRead(void)
  46. {
  47.   /* 读取模块输出信号,若此时输出的是高电平 ,则进入下一步判断*/
  48.   if(GPIO_ReadPin(HC_SR501_GPIO,HC_SR501_GPIO_PIN)==HC_SR501_ACTIVE_LEVEL)
  49.   {
  50.     /* 延时一小段时间,消除抖动 */
  51.     HC_SR501_ScanDelay();
  52.     /* 延时时间后再来判断引脚状态,如果还是高电平那么确实就是高电平 */
  53.     if(GPIO_ReadPin(HC_SR501_GPIO,HC_SR501_GPIO_PIN)==HC_SR501_ACTIVE_LEVEL)
  54.     {      
  55.        /* 按键扫描完毕,确定有人,返回有人状态(高电平) */
  56.       return HC_SR501_HIGH;
  57.     }
  58.   }
  59.   /* 没人,返回没人状态 */
  60.   return HC_SR501_LOW;
  61. }

  1. #ifndef __BSP_HC_SR501_H__
  2. #define __BSP_HC_SR501_H__

  3. /* 包含头文件 -----------------------------------------------------------*/
  4. #include "../inc/main.h"

  5. /* 类型定义 --------------------------------------------------------------*/
  6. typedef enum
  7. {
  8.   HC_SR501_LOW   = 0,
  9.   HC_SR501_HIGH = 1,
  10. }HC_SR501_State_TypeDef;

  11. /* 宏定义 --------------------------------------------------------------------*/
  12. #define HC_SR501_RCC_CLK_ENABLE()         _RCC_GPIOA_CLK_ENABLE()
  13. #define HC_SR501_GPIO_PIN                 GPIO_PIN_7
  14. #define HC_SR501_GPIO                     CW_GPIOA
  15. #define HC_SR501_ACTIVE_LEVEL             1

  16. /* 函数声明 ------------------------------------------------------------------*/
  17. void HC_SR501_GPIO_Init(void);
  18. HC_SR501_State_TypeDef HC_SR501_StateRead(void);

  19. #endif  
     编译完成后,下载到CW32L031CxTx StartKit开发板中,然后使用手挥动触发人体红外感应,演示的效果见下面视频展示。大体上感觉还算比较灵敏。当然这个红外感应模块还是存在些缺点的,1)容易受各种热源、光源干扰;2)被动红外穿透力差,人体的红外辐射容易被遮挡,不易被探头接收;3)易受射频辐射的干扰;4)环境温度和人体温度接近时,探测和灵敏度明显下降,有时造成短时失灵。
HC-SR501人体感应模块.pdf (700.89 KB, 下载次数: 0)


您需要登录后才可以回帖 登录 | 注册

本版积分规则

106

主题

1098

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部

106

主题

1098

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部