参考:Arduino-PIR运动传感器(2)

11.1 PIR简介

热释电红外运动传感器能检测运动的人或动物身上发出的红外线,输出开关信号,可以应用于各种需要检测运动人体的场合。PIR传感器可以让你感知运动。它们用于检测人是否进入或离开传感器的范围。通常出现在家庭或企业使用的电器和小工具中。它们通常被称为PIR,“被动红外”,“热电”或“IR运动”传感器。

11.1.1 产品参数
名称参数
输入电压:3.3~5V,最大6V
工作电流:15uA
工作温度:-20~85℃
输出电压:高电平3V,低电平0V
输出延迟时间(高电平):2.3~3秒左右
感应角度:100°
感应距离:7米
输出指示灯:高电平点亮
输出引脚极限电流:100mA
连线接口:PH2.0-3
模块尺寸:30mm×22mm
11.1.2应用
  • 入侵报警器
  • 非接触红外自动开关

11.2 PIR详细说明

11.2.1 组成

PIR
pir接口引脚
PIR由热电传感器制成,圆形金属罐中央有一个矩形晶体,可以检测红外辐射的水平。所有东西都发射出低水平的辐射,而东西越热发射的辐射就越多。运动检测器中的传感器分成两半。这是为了检测运动(变化)而不是平均IR水平。

11.2.2 引脚说明

引脚说明

11.2.3 探头概述

这款热释电红外运动传感器是一个将数字智能控制电路与人体探测敏感元都集成在电磁屏蔽罩内的热释电红外探头。人体探测敏感元将感应到的人体移动信号通过一个甚高阻抗差分输入电路耦合到数字智能集成电路芯片上,数字智能集成电路将信号转化成15位ADC数字信号,当PIR信号超过选定的数字阀值时就会有延时的高电平输出。所有的信号处理都在一个芯片上完成。

11.2.4 触发模式

在检测范围内,当探头接收到的热释电红外信号超过探头内部的触发阈值之后,内部会产生一个计数脉冲。当探头再次接收到这样的信号,它会认为是接收到了第二个脉冲,一旦在4 秒钟之内接收到2 个脉冲以后,探头就会产生报警信号,同时输出引脚输出高电平。另外,只要接收到的信号幅值超过触发阈值的5 倍以上,那么只需要一个脉冲就能触发输出端的高电平输出。下图为触发逻辑图示例。对于多次触发情况,输出高电平的维持时间从最后一次有效脉冲开始计时。
PIR sequential.jpg

11.2.5 调整延迟

本款红外热释电运动传感器默认的高电平延时时间为2.3~3秒左右,取AM412最短的延迟时间,但保留了修改延迟时间的设计。如示意图所示:
在右下角,修改R2电阻的阻值即可修改延迟时间。默认R1=1MΩ,R2=0Ω。具体的电阻值请参考数字热释电传感器AM412数据手册第4页。电阻封装为0603。

11.2.6 可调设置

pir
PIR具有可调设置,并在3引脚ground/out/power板上安装了一个接头。
对于许多需要在人们离开或进入该区域进行检测的基础项目或产品,PIR传感器是非常有用的。请注意,PIR不会告诉你周围的人数或与传感器的距离。镜头通常固定在有一定距离的扫描范围内,有时候它们会被房子里的宠物带走。
调节pir
可以通过位于传感器板底部的两个可变电阻器来调节传感器灵敏度和延迟时间

11.3 动手做一

  1. 必需的组件
  • 1 × Breadboard 面包板
  • 1 × Arduino Uno R3
  • 1 × PIR传感器(MQ3)
  1. 电路图
    PIR传感器有三个端子:Vcc,OUT和GND。按如下所示连接传感器:
  • 将+Vcc连接到Arduino板上的+5v。
  • 将OUT连接到Arduino板上的数字引脚2。
  • 将GND连接到Arduino上的GND。

电路图
3. 程序

#define pirPin 2
int calibrationTime = 30;
long unsigned int lowIn;
long unsigned int pause = 5000;
boolean lockLow = true;
boolean takeLowTime;
int PIRValue = 0;

void setup() {
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
}

void loop() {
  PIRSensor();
}

void PIRSensor() {
  if (digitalRead(pirPin) == HIGH) {
    if (lockLow) {
      PIRValue = 1;
      lockLow = false;
      Serial.println("Motion detected.");
      delay(50);
    }
    takeLowTime = true;
  }
  if (digitalRead(pirPin) == LOW) {
    if (takeLowTime) {
      lowIn = millis(); takeLowTime = false;
    }
    if (!lockLow && millis() - lowIn > pause) {
      PIRValue = 0;
      lockLow = true;
      Serial.println("Motion ended.");
      delay(50);
    }
  }
}
  1. 说明
    一旦传感器检测到任何运动,Arduino将通过串口发送一条消息,表示检测到运动。PIR感测运动将延迟一定时间以检查是否存有新的运动。如果没有检测到运动,Arduino将发送一条新消息,说明运动已经结束。

11.4 动手做二

在这里插入图片描述

byte sensorPin = 2;
byte indicator = 13;
void setup()
{
  pinMode(sensorPin, INPUT);
  pinMode(indicator, OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  byte state = digitalRead(sensorPin);
  digitalWrite(indicator, state);
  if (state == 1)Serial.println("Somebody is in this area!");
  else if (state == 0)Serial.println("No one!");
  delay(500);
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐