人群检测,人流进出构思
想在门口只做一个检测人流量的多少,和监控室内进出人群
就用一个人体红外感应器来触发中断,用两个红外传感器来判断人是进入还是出去(不用光敏电阻,不够灵敏)
大概就是这样检测,因为人体红外的广域检测,红外传感是直线的,所以人体红外来触发中断
构思示意图
连线示意图
三个gpio口,两个负责红外的输入检测,一个负责人体的中断
代码上手
硬件连接
使用这三个gpio接口,图中红色的接口好像已经被占用,强行转换输出会报错
驱动编写poll中断
设置等待队列
设置定时器
poll中断的特色,没有中断发生,到时间也会自己查询
设置中断函数
在里面进行有中断发生的时候,对io口的检测,判断人的进出
按键初始化
初始化三个口为输出口,其中为一个口注册中断---->上升沿才触发(说明有人来了才会开始检测)
大概就是这些改动,其他的都是根据按键驱动进行的改写
app应用编写
在里面copy_form_user() 对人来人往进行检测,判断人的走向,统计人的数量
代码
写的不是很完整,很多冗余的,但是能用,改改还是很美观
buttondrv.c
/*************************************************
*头文件
*************************************************/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/sched.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>
#include <asm/mach-types.h>
#include <asm/gpio.h>
#include <asm/delay.h>
#include <mach/gpio.h>
#include <mach/soc.h>
#include <mach/platform.h>
#define DEVICE_NAME "gecBt" //设备名字
static int get_number ;
//按键结构体
struct button_desc {
int gpio;
int number;
char *name;
struct timer_list timer;
int right_and_left;
};
//按键的管脚,编号,名字
static struct button_desc buttons[] = {
{
(PAD_GPIO_B + 9 ), 0, "KEY0" },//B9
{
(PAD_GPIO_B + 29), 1, "KEY1" },//人体红外
//{ (PAD_GPIO_B + 9), 2, "KEY2" },//左边 第四个
//{ (PAD_GPIO_A + 28), 3, "KEY3" },//右边 第三个
};
//赋按键的初始值
static volatile int key_values[] = {
2, 2, 2, 2
};
//等待队列申请
static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
static volatile int ev_press = 0; //判断中断的发生
/*************************************************
*定时器
*************************************************/
static void x6818_buttons_timer(unsigned long _data)
{
struct button_desc *bdata = (struct button_desc *)_