sr501人体红外传感器
文章目录
- sr501人体红外传感器
- 1.介绍
- 2.使用方法
- 3.示例代码
持续更新中
1.介绍
模块信息介绍来自百问网,仅供学习和参考
人体都有恒定的体温,一般在 37 度,所以会发出特定波长 10uM 左右的红外线,被动式红外探头就是靠探测人体发射的 10uM 左右的红外线而进行工作的。人体发射的 10uM 左右的红外线通过菲泥尔滤光片增强后聚集到红外感应源上。红外感应源通常采用热释电元件,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经检测处理后就能产生报警信号。
人体红外模块是一种能够检测人或动物发射的红外线而输出电信号的传感器。广泛应用于各种自动化控制装置中。比如常见的楼道自动开关、防盗报警等。如果有人在量程内运动, DO 引脚将会输出有效信号。
实物和使用方法如下图所示,可以设置探测距离、延迟控制等 :
2.使用方法
通过跳线来设置是否可以重复触发,默认为 L。其中 L 表示不可重复, H 表示可重复。
含义如下:
① 不可重复触发方式:感应到人体并输出高电平后,延时时间一结束,输出将自动从高电平变为低电平。
② 重复触发方式:感应到人体后输出高电平后,在延时时间段内,如果有人体在其感应范围内活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。
可以通过电位器实现封锁时间和检测距离的调节:
① 调节检测距离:即有效距离的远近。调节距离电位器顺时针旋转,感应距离增大(约 7 米);反之,感应距离减小(约 3 米)。
② 封锁时间:感应模块在每一次感应输出后(高电平变为低电平),可以紧跟着设置一个封锁时间,在此时间段内感应器不接收任何感应信号。
此功能可以实现(感应输出时间和封锁时间)两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。
调节延时电位器顺时针旋转,感应延时加长(约 300S),反之,感应延时减短(约 0.5S)。
3.示例代码
.h
#ifndef __IRQ_SR501_H__
#define __IRQ_SR501_H__
#include <linux/module.h>
#include <linux/poll.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <linux/gpio/consumer.h>
#include <linux/platform_device.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/slab.h>
#include <linux/fcntl.h>
#include <linux/timer.h>
#define DEV_NAME "sr501"
#define KMD_ERR(str) \
printk("%s %s line: %d %s \n", __FILE__, __FUNCTION__, __LINE__, str);
typedef struct my_irq
{
char *dev_name;
struct device_node *irq_node;
unsigned int gpio_no;
unsigned int irq_no;
int irq_num;
int irq_status; // irq开关状态
int Level_state; // 电平状态
struct timer_list mytimer; // 分配定时器
} irq_ctrl_t;
int __init irq_sr501_init(irq_ctrl_t * irq_dev);
void __exit irq_sr501_exit(irq_ctrl_t * irq_dev);
#endif
.c
#include "irq_sr501.h"
irqreturn_t irq_handler(int irqno, void *dev)
{
printk("sr501 irq hapended\n");
return IRQ_HANDLED; //中断被正常执行了
}
int __init irq_sr501_init(irq_ctrl_t * irq_dev)
{
int ret;
irq_dev->irq_no = gpio_to_irq(irq_dev->gpio_no);
if(irq_dev->irq_no < 0)
{
KMD_ERR("gpio_to_irq ERR");
ret = irq_dev->irq_no;
goto ERR1;
}
ret = request_irq(irq_dev->irq_no, irq_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
irq_dev->dev_name, irq_dev);
if(ret)
{
KMD_ERR("request_irq err");
goto ERR1;
}
return 0;
ERR1:
return ret;
}
void __exit irq_sr501_exit(irq_ctrl_t * irq_dev)
{
free_irq(irq_dev->irq_no,irq_dev);
}
MODULE_DESCRIPTION("irq_sr501_driver");
MODULE_LICENSE("GPL");
后续项目集成过程中会添加该模块的其他控制逻辑,此处,暂只使能该模块的功能
调试现象: