运动传感器

news2024/10/6 23:45:45

运动传感器

当你走近一些自动开关门、自动开关灯泡或自动启动自动扶梯的地方时,你是否会产生这样的疑问:**"它是怎么做到的? **它是怎么做到的? 如果有,本教程不仅会回答,还会告诉你如何制作。 让我们开始吧!

在本教程中,我们将学习

  • HC-SR501 运动传感器的工作原理
  • 如何将 HC-SR501 运动传感器连接到 Arduino
  • 如何对 Arduino 进行编程以读取 HC-SR501 运动传感器的状态
  • 如何使用 Arduino 和 HC-SR501 运动传感器检测人的进入并据此采取行动。

关于 HC-SR501 运动传感器

HC-SR501 Motion Sensor

HC-SR501 PIR 传感器是一种能检测到人(或动物)运动的传感器。 它在许多应用中被广泛用于探测人的存在(自动开启/关闭灯泡、开门/关门、启动/关闭自动扶梯、探测入侵者…)。

引脚

HC-SR501 运动传感器有 3 个引脚:

  • GND pin: 需要连接至 GND(0V)

  • VCC pin: 需要连接至 VCC(5V)

  • OUTPUT pin: 是一个输出引脚: 未检测到运动时为低电平,检测到运动时为高电平。 该引脚需要连接到 Arduino 的输入引脚。

HC-SR501 还有一个跳线和两个电位器,用于调整传感器的设置。 首先,保持默认设置。 详细说明请参阅 "高级用途 " 部分。

HC-SR501 Motion Sensor Pinout

如何使用

HC-SR501 传感器根据移动物体的红外辐射变化来检测运动。 要被 HC-SR501 传感器检测到,物体必须满足两个条件:

  • 移动或摇晃

  • 正在发射红外线。

So:

  • 如果物体在移动,但没有发射红外线(如机器人或车辆玩具),传感器就检测不到它。

  • 如果物体发出红外线但没有移动(如人静止不动),传感器就检测不到它。

人类和动物会自然发出红外线。 因此,传感器可以检测到人类和动物的移动。

OUTPUT pin’s state:

  • 当传感器检测范围内没有人(或动物)移动时,传感器的输出引脚为低电平。

  • 当有人(或动物)进入传感器的检测范围时,传感器的输出引脚将从低电平变为高电平。 (⇒ motion detected).

  • 当有人(或动物)离开传感器的检测范围时,传感器的输出引脚会从高电平变为低电平。 (⇒ motion ended).

在实际应用中,运动传感器的工作原理略有不同,具体取决于传感器的设置

检测人类的存在

传感器本身并不能检测到人的存在,传感器只是检测运动。 我们使用 Arduino(或 MCU),根据传感器的运动检测,按照以下规则推断人类的存在:

  • 如果检测到运动,则说明有人类存在

  • 如果未检测到运动,则表示人类不在现场

在实际情况中,这条规则是不正确的:人在传感器范围内,但没有移动。 因此检测不到运动。 Arduino (或 MCU)推断出人类不在。

例如,您的会议室使用运动传感器自动开关灯,当有人进入会议室时,灯就会自动打开。 在会议期间,如果每个人都坐着不动,就不会检测到运动 ⇒ 人不在场 ⇒ 灯会自动关闭。 要开灯,需要有人移动。

不过,这个问题并不严重,传感器也很便宜。 因此,该传感器在许多应用中被广泛用于探测人体。

Arduino - HC-SR501 运动传感器

当 Arduino 的引脚被配置为数字输入时,它可以读取所连接的任何设备的状态(低电平或高电平)。

通过将 Arduino 的引脚与 HC-SR501 传感器的 OUTPUT 引脚连接,我们可以使用 Arduino 代码来检查 OUTPUT 引脚的值,从而检测运动。

接线图

Arduino Motion Sensor Wiring Diagram

This image is created using Fritzing. Click to enlarge image

Initial Setting

延时调节器逆时针方向拧到底。
检测范围调节器顺时针方向拧到底。
重复触发选择器如图所示放置跳线。

a

How To Program For Motion Sensor

  • 使用 pinMode() 函数将 Arduino 引脚配置为数字输入模式
pinMode(PIN_TO_SENSOR, INPUT);
  • 使用 digitalRead() 函数读取传感器 OUTPUT 引脚的状态。
pinStateCurrent = digitalRead(PIN_TO_SENSOR);
  • 检测运动开始(引脚状态从低电平变为高电平)
pinStatePrevious = pinStateCurrent; // store old state
pinStateCurrent = digitalRead(PIN_TO_SENSOR);   // read new state

if (pinStatePrevious == LOW && pinStateCurrent == HIGH) {   // pin state change: LOW -> HIGH
  Serial.println("Motion detected!");
}

  • 检测运动停止(引脚状态从高电平变为低电平)
pinStatePrevious = pinStateCurrent; // store old state
pinStateCurrent = digitalRead(PIN_TO_SENSOR);   // read new state

if (pinStatePrevious == HIGH && pinStateCurrent == LOW) {   // pin state change: HIGH -> LOW
  Serial.println("Motion stopped!");
}

Arduino Code

/*
 * Created by ArduinoGetStarted.com
 *
 * This example code is in the public domain
 *
 * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-motion-sensor
 */

const int PIN_TO_SENSOR = 2;   // the pin that OUTPUT pin of sensor is connected to
int pinStateCurrent   = LOW; // current state of pin
int pinStatePrevious  = LOW; // previous state of pin

void setup() {
  Serial.begin(9600);            // initialize serial
  pinMode(PIN_TO_SENSOR, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor
}

void loop() {
  pinStatePrevious = pinStateCurrent; // store old state
  pinStateCurrent = digitalRead(PIN_TO_SENSOR);   // read new state

  if (pinStatePrevious == LOW && pinStateCurrent == HIGH) {   // pin state change: LOW -> HIGH
    Serial.println("Motion detected!");
    // TODO: turn on alarm, light or activate a device ... here
  }
  else
  if (pinStatePrevious == HIGH && pinStateCurrent == LOW) {   // pin state change: HIGH -> LOW
    Serial.println("Motion stopped!");
    // TODO: turn off alarm, light or deactivate a device ... here
  }
}

Quick Steps

  • Copy the above code and open with Arduino IDE

  • Click Upload button on Arduino IDE to upload code to Arduino

  • Open Serial Monitor

  • Move your hand in front of sensor range

  • See the output in Serial Monitor

Video Tutorial

the videos.

高级用法

本节为深入知识。 不懂的地方不用担心。 如果本节内容过多,请忽略本节内容,改天再来学习。 继续阅读下一节。

如上所述,我们可以通过一个跳线和两个电位器来调整传感器的设置。

Detection Range Adjuster

该电位器用于调节检测范围(约 3 米至 7 米)。

  • 如果完全按顺时针方向拧紧,检测范围约为 3 米。

  • 如果完全按逆时针方向拧紧,探测距离约为 7 米。

Motion Sensor Detection Range

我们可以调节电位器,以达到所需的范围(数值介于 3 米和 7 米之间)。

Time Delay Adjuster

该电位器用于调节时间延迟。

  • 如果完全按顺时针方向拧紧,则延时约为 5 分钟。

  • 如果完全按逆时针方向拧紧,则延时约为 3 秒。

下一部分将结合重复触发器解释时间延迟的含义。

motion sensor adjust time delay

重复触发选择器

跳线用于选择触发模式:单次触发或可重复触发。

motion sensor trigger selection

我们把时间延迟设置(通过时间延迟调节器设置)称为 time_delay。 假设您在传感器范围内持续移动了很长时间(称为 motion_time)(比 time_delay 长好几倍)

  • 单次触发模式: OUTPUT 引脚的状态在低电平和高电平之间切换多次。 高电平持续时间等于延时。 低电平持续时间固定为 3 秒。

motion sensor single trigger mode

  • 可重复触发模式 在(运动时间 + 延迟时间)期间,OUTPUT 引脚的状态保持高电平。

motion sensor repeatable trigger mode

Testing

为了了解触发模式的工作原理,我们来做个测试。 将时间延迟调节器逆时针调到 3 秒。

  • 单次触发模式:

    • 设置跳线以选择单次触发模式
    • 手在传感器前移动约 10 秒钟。
    • 将手移出传感器范围
    • 等待 3 秒钟,您将在串行监视器中看到如下输出:
      在这里插入图片描述
  • 可重复触发模式

    • 设置跳线以选择可重复触发模式
    • 手在传感器前移动约 10 秒钟。
    • 将手移出传感器范围
    • 等待 3 秒钟,您将在串行监视器中看到如下输出:

在这里插入图片描述

我们可以看到,在单次触发模式下,传感器会触发两到三次。 在可重复触发模式下,传感器只触发一次。

※ 注意:

在这两种情况下,在 LOW(3 秒)时间内(固定值和不可调值),传感器无法检测到任何运动。 换言之,传感器在此期间处于闭锁状态。 实际上,这不会造成任何问题。

建议使用可重复触发模式。

在许多实际应用中:

  • 人类出现后,我们立即打开或激活设备/机器

  • 人不在场时,我们不会立即关闭或停用设备/机器。 我们会在超时后关闭或停用设备/机器。

如何使用延时器

当检测到不存在人类时,自动化系统将在延迟一段时间后采取行动。

时间延迟可通过运动传感器和 Arduino 代码进行设置:

  • 运动传感器:最小 3 秒,最大 5 分钟。

  • 关于 Arduino 代码:任何数值,通过编码完成

如果我们不在 Arduino 代码中设置超时,超时时间就等于传感器设置中的延迟时间。

如果我们在 Arduino 代码中设置超时,超时时间就是传感器设置中的时间延迟与 Arduino 代码中的时间延迟之和。

在 Arduino 代码中设置时间延迟

/*
 * Created by ArduinoGetStarted.com
 *
 * This example code is in the public domain
 *
 * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-motion-sensor
 */

const int PIN_TO_SENSOR = 2;   // the pin that OUTPUT pin of sensor is connected to
int pinStateCurrent   = LOW; // current state of pin
int pinStatePrevious  = LOW; // previous state of pin
const unsigned long DELAY_TIME_MS = 30000; // 30000 miliseconds ~ 30 seconds
bool delayEnabled = false;
unsigned long delayStartTime;

void setup() {
  Serial.begin(9600);            // initialize serial
  pinMode(PIN_TO_SENSOR, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor
}

void loop() {
  pinStatePrevious = pinStateCurrent; // store state
  pinStateCurrent = digitalRead(PIN_TO_SENSOR);   // read new state

  if (pinStatePrevious == LOW && pinStateCurrent == HIGH) {   // pin state change: LOW -> HIGH
    Serial.println("Motion detected!");
    Serial.println("Turning on / activating");
    delayEnabled = false; // disable delay
    // TODO: turn on alarm, light or activate a device ... here
  }
  else
  if (pinStatePrevious == HIGH && pinStateCurrent == LOW) {   // pin state change: HIGH -> LOW
    Serial.println("Motion stopped!");
    delayEnabled = true; // enable delay
    delayStartTime = millis(); // set start time
  }

  if (delayEnabled == true && (millis() - delayStartTime) >= DELAY_TIME_MS) {
    Serial.println("Turning off / deactivating");
    delayEnabled = false; // disable delay
    // TODO: turn off alarm, light or deactivate a device ... here
  }
}

假设设置了可重复触发模式。 该代码中的延迟时间设置为 30 秒。 这意味着延迟时间等于 30 秒加上根据传感器设置(通过时间延迟调节器)设定的 time_delay。

挑战自我

使用运动传感器完成以下项目之一:

  • 进入房间时自动开灯,离开 30 秒后自动关灯。 提示: Refer to Arduino - Relay.

  • 当有人接近您的贵重物品时,自动发出警报。 提示:请参考Arduino - Piezo Buzzer.

Function References

  • pinMode()

  • digitalRead()

  • Serial

The Best Arduino Starter Kit

  • See the best Arduino kit for beginner

See Also

  • Arduino - Motion Sensor - LED

  • Arduino - Motion Sensor - Relay

  • Arduino - Motion Sensor - Piezo Buzzer

  • Arduino - Motion Sensor - Servo Motor

  • Arduino - Motion Sensor - MP3 Player

  • Arduino - Motion Sensor - LED Strip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2193198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】Hash类型的常用命令

背景:redis中存储数据采取key-value键值对的形式,而hash内部也是键值对,为了区别这两个东西,hash内部的键值对称为:field-value,而redis的为key-value,这里的value包括:field-value。…

基于pytorch的手写数字识别

import pandas as pd import numpy as np import torch import matplotlib import matplotlib.pyplot as plt from torch.utils.data import TensorDataset, DataLoadermatplotlib.use(tkAgg)# 设置图形配置 config {"font.family": serif,"mathtext.fontset&q…

如何在华为云服务器查看IP地址,及修改服务器登录密码!!!

1.在华为云服务器查看IP地址 (1).第一步: 先找到控制台 (2).第二步: 点击华为云Flexus云服务 (3)第三步: 找到公网IP,就找到华为云服务器IP地址啦。 注意:在操作以上步骤的前提是要已注册华为云账号及购买云服务器…

PPPoE协议个人理解+报文示例+典型配置-RFC2516

个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。 因此本文将在PPPoE协议报文的基础上进行介绍。 PPPoE协议发展 关于PPPoE基本原理,可参考1999年发布的《RFC2516-A Method fo…

class 031 位运算的骚操作

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. 左程云的个人空间-左程云个人主页-哔哩哔哩视频…

8649 图的广度遍历

### 思路 1. **图的邻接表存储结构**:使用邻接表存储图的顶点和边信息。 2. **基本操作函数**:包括创建图、查找顶点、获取顶点值、获取第一个邻接顶点、获取下一个邻接顶点等。 3. **广度优先遍历(BFS)**:从某个顶点出…

LPDDR6 来之未远

很多朋友可能还没用上DDR5,但不好意思的是,DDR6 可能马上就要出现了。 三星和海力士较早开始DDR6 的设计,预计2025年商业化。 DDR6 速度 来源: 半导体观察 DDR6的速度将是主流的DDR4的四倍,将是现有DDR5的两倍,DDR6传输速度可达12800 Mbps。 LPDDR6 来源:快科技 L…

OpenAI董事会主席Bret Taylor的Agent公司Sierra:专注于赋能下一代企业用户体验

本文由readlecture.cn转录总结。ReadLecture专注于音、视频转录与总结,2小时视频,5分钟阅读,加速内容学习与传播。 视频来源 youtube: https://www.youtube.com/watch?vriWB5nPNZEM&t47s 大纲 介绍 欢迎与介绍 介绍Bret Taylor&#x…

功耗电流图的对比技巧

电流波形对比 使用系统画图工具的反色和透明设置项目,就可以将2张图合在一块看 方法【系统画图工具】 例如在相同的测试用例,可以对比电流和耗电量的差异

3.使用条件语句编写存储过程(3/10)

引言 在现代数据库管理系统中,存储过程扮演着至关重要的角色。它们是一组为了执行特定任务而编写的SQL语句,这些语句被保存在数据库中,可以被重复调用。存储过程不仅可以提高数据库操作的效率,还可以增强数据的安全性和一致性。此…

Python3 爬虫 中间人爬虫

中间人(Man-in-the-Middle,MITM)攻击是指攻击者与通信的两端分别创建独立的联系,并交换其所收到的数据,使通信的两端认为其正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中…

LCD屏入门(基于ESP-IDF、SPI屏)

主要参考资料: ESP32-S3 开发 SPI 屏【DIY 智能手表】: https://www.bilibili.com/video/BV1Yc411y7bb/?spm_id_from333.337.search-card.all.click&vd_sourcedd284033cd0c4d1f3f59a2cd40ae4ef9 使用 SPI 屏和 I2C 触屏运行 SquareLine Studio 提供的手表 UI 示…

突触可塑性与STDP:神经网络中的自我调整机制

突触可塑性与STDP:神经网络中的自我调整机制 在神经网络的学习过程中,突触可塑性(Synaptic Plasticity)是指神经元之间的连接强度(突触权重)随着时间的推移而动态变化的能力。这种调整机制使神经网络能够通…

链动 2+1 模式 S2B2C 商城小程序:交易转化的创新引擎

摘要 在数字化商业时代,电商行业竞争激烈,交易转化成为核心问题。链动 21 模式 S2B2C 商城小程序源码作为创新电商模式,通过独特的推荐与分享机制、丰富奖励机制、AI 智能名片及 S2B2C 商城的个性化定制与供应链协同等,在交易转化…

redis+mysql数据一致性+缓存穿透解决方案

在分布式事务中我们知道有cap定理,即 我们保证高可用的情况下,必然要牺牲一些一致性,在保证强一致性的情况下,必然会牺牲一些可用性。而我们redismysql数据一致性的使用策略就是在我们保证可用性的情况下尽量保证数据的一致性。想…

MySql的基本语法操作

查看数据库和表 查看所有的数据库 show databases; 建立一个新的数据库 create database database_name; 也可以是 create database if not exists database_name; 表示这个数据库不存在才建立 而不会打断其他sql语句的执行,而如果没有加的话,创建…

神经网络及大模型科普揭秘

一、生物神经元及神经元构成的神经网络 下图是生物神经元的示意图: 生物神经元由细胞体、树突、轴突、轴突末梢四部分构成。 下图是生物神经网络的一个简单示意图: 生物神经元通过电信号在彼此间传递信号,神经元的各个树突接收输入信号,经过细胞体汇总,如果最终总和高…

【动态规划-最长公共子序列(LCS)】力扣97. 交错字符串

给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 … sn t t1 t2 … tm |n - m| < 1 交错 是 s1…

【微服务】服务注册与发现 - Eureka(day3)

CAP理论 P是分区容错性。简单来说&#xff0c;分区容错性表示分布式服务中一个节点挂掉了&#xff0c;并不影响其他节点对外提供服务。也就是一台服务器出错了&#xff0c;仍然可以对外进行响应&#xff0c;不会因为某一台服务器出错而导致所有的请求都无法响应。综上所述&…

网络安全概述:从认知到实践

一、定义 网络安全&#xff0c;即致力于保护网络系统所涵盖的硬件、软件以及各类数据&#xff0c;切实保障其免遭破坏、泄露或者篡改等不良情形的发生。 二、重要性 个人层面&#xff1a;着重于守护个人隐私以及财产安全&#xff0c;为个人在网络世界中的各项活动提供坚实的保…