sr501人体红外传感器

sr501人体红外传感器

持续更新中

1.介绍

模块信息介绍来自百问网,仅供学习和参考

​ 人体都有恒定的体温,一般在 37 度,所以会发出特定波长 10uM 左右的红外线,被动式红外探头就是靠探测人体发射的 10uM 左右的红外线而进行工作的。人体发射的 10uM 左右的红外线通过菲泥尔滤光片增强后聚集到红外感应源上。红外感应源通常采用热释电元件,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经检测处理后就能产生报警信号。

​ 人体红外模块是一种能够检测人或动物发射的红外线而输出电信号的传感器。广泛应用于各种自动化控制装置中。比如常见的楼道自动开关、防盗报警等。如果有人在量程内运动, DO 引脚将会输出有效信号。

实物和使用方法如下图所示,可以设置探测距离、延迟控制等 :

在这里插入图片描述

2.使用方法

​ 通过跳线来设置是否可以重复触发,默认为 L。其中 L 表示不可重复, H 表示可重复。

​ 含义如下:

​ ① 不可重复触发方式:感应到人体并输出高电平后,延时时间一结束,输出将自动从高电平变为低电平。

​ ② 重复触发方式:感应到人体后输出高电平后,在延时时间段内,如果有人体在其感应范围内活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。

​ 可以通过电位器实现封锁时间和检测距离的调节:

​ ① 调节检测距离:即有效距离的远近。调节距离电位器顺时针旋转,感应距离增大(约 7 米);反之,感应距离减小(约 3 米)。

​ ② 封锁时间:感应模块在每一次感应输出后(高电平变为低电平),可以紧跟着设置一个封锁时间,在此时间段内感应器不接收任何感应信号。

​ 此功能可以实现(感应输出时间和封锁时间)两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。

​ 调节延时电位器顺时针旋转,感应延时加长(约 300S),反之,感应延时减短(约 0.5S)。

在这里插入图片描述

3.示例代码

注解:这里中断只需要一个gpio号就可以,设备树获取方式里面的很多API都是为了获取这个值,因此,只要你知道你的设备连接的是哪个gpio,linux文件系统里面对应的序列号是多少就可以不用写设备树信息
关键点如下:
irq_dev->irq_no = gpio_to_irq(irq_dev->gpio_no);
未贴出代码:
static irq_ctrl_t sr501 = {
	.dev_name = DEV_NAME,
	.gpio_no = 115,
};
再啰嗦一点:
这个115数值的来历,如果你知道一个某个gpio的基值是多少,就可以通过差值相加算出其他gpio对应引脚的gpio_no值比如参照gpio值为106,
对应gpio口是gpio第4组第2个,那么gpio第6组第3个的gpiono值就是106+差值,差值怎么算呢?16-2+16*1+3=31,所以gpio第6组第3个的gpiono值为137

.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");
后续项目集成过程中会添加该模块的其他控制逻辑,此处,暂只使能该模块的功能

调试现象:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值