Arduino 第十六章:pir红外人体传感器练习

Arduino 第十六章:PIR 传感器练习

一、引言

在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动照明等场景。通过本次练习,我们将深入了解 PIR 传感器与 Arduino 的结合使用,学会如何读取传感器数据并根据数据做出相应的反应。

二、所需材料

  1. Arduino 开发板:推荐使用 Arduino Uno,它是初学者常用且功能丰富的开发板。
  2. PIR 传感器:常见的如 HC-SR501 型号,这是一款比较容易获取且价格实惠的 PIR 传感器。
  3. 杜邦线:若干,用于连接 Arduino 开发板和 PIR 传感器。
  4. LED 灯:一个,用于直观显示 PIR 传感器的检测结果。
  5. 面包板:方便进行电路连接和布线。

三、PIR 传感器介绍

PIR 传感器的工作原理基于人体发出的红外线。当有人进入传感器的检测范围时,人体发出的红外线会使传感器内部的热释电元件产生变化,从而输出一个电信号。一般来说,PIR 传感器有三个引脚:VCC(电源正极)、GND(接地)和 OUT(信号输出)。

以 HC-SR501 为例,它还具有一些可调节的参数,比如检测灵敏度和延迟时间。通过调节传感器上的电位器,可以改变这些参数以适应不同的使用场景。

四、硬件连接

  1. 将 PIR 传感器的 VCC 引脚通过杜邦线连接到 Arduino 开发板的 5V 引脚,为传感器提供电源。
  2. 把 PIR 传感器的 GND 引脚连接到 Arduino 开发板的 GND 引脚,实现接地。
  3. 将 PIR 传感器的 OUT 引脚连接到 Arduino 开发板的一个数字引脚上,比如数字引脚 2。这样,传感器的输出信号就可以被 Arduino 读取。
  4. 把 LED 灯的正极通过一个限流电阻(例如 220 欧姆)连接到 Arduino 开发板的数字引脚 13,负极连接到 GND 引脚。限流电阻的作用是防止电流过大损坏 LED 灯。
    在这里插入图片描述

五、代码编写

打开 Arduino IDE,新建一个项目,输入以下代码:

const int pirPin = 5; // 定义 PIR 传感器连接的引脚为数字引脚 5
const int ledPin = 4; // 定义 LED 灯连接的引脚为数字引脚 4
int pirState = LOW; // 初始化 PIR 传感器状态为低电平
int val = 0; // 用于存储读取到的 PIR 传感器的值void setup() {pinMode(pirPin, INPUT); // 将 PIR 传感器引脚设置为输入模式pinMode(ledPin, OUTPUT); // 将 LED 灯引脚设置为输出模式Serial.begin(9600); // 初始化串口通信,波特率为 9600
}void loop() {val = digitalRead(pirPin); // 读取 PIR 传感器的值if (val == HIGH && pirState == LOW) {// 如果检测到高电平且之前状态为低电平,说明有人进入检测范围pirState = HIGH;digitalWrite(ledPin, HIGH); // 点亮 LED 灯Serial.println("Motion detected!"); // 通过串口打印检测到运动的信息} else if (val == LOW && pirState == HIGH) {// 如果检测到低电平且之前状态为高电平,说明人离开检测范围pirState = LOW;digitalWrite(ledPin, LOW); // 熄灭 LED 灯Serial.println("Motion stopped!"); // 通过串口打印运动停止的信息}delay(100); // 延迟 100 毫秒,避免频繁检测
}

六、代码解释

  1. 变量定义
    • const int pirPin = 5;:定义 PIR 传感器连接的引脚为数字引脚 2。
    • const int ledPin = 4;:定义 LED 灯连接的引脚为数字引脚 13。
    • int pirState = LOW;:初始化 PIR 传感器的状态为低电平,用于记录传感器的当前状态。
    • int val = 0;:用于存储从 PIR 传感器读取到的值。
  2. setup()函数
    • pinMode(pirPin, INPUT);:将 PIR 传感器连接的引脚设置为输入模式,以便读取传感器的信号。
    • pinMode(ledPin, OUTPUT);:将 LED 灯连接的引脚设置为输出模式,用于控制 LED 灯的亮灭。
    • Serial.begin(9600);:初始化串口通信,设置波特率为 9600,方便通过串口打印信息。
  3. loop()函数
    • val = digitalRead(pirPin);:读取 PIR 传感器的值,并将其存储在变量 val 中。
    • if (val == HIGH && pirState == LOW):当读取到的传感器值为高电平且之前传感器状态为低电平时,说明有人进入了检测范围。此时将传感器状态更新为高电平(pirState = HIGH;),点亮 LED 灯(digitalWrite(ledPin, HIGH);),并通过串口打印检测到运动的信息(Serial.println("Motion detected!");)。
    • else if (val == LOW && pirState == HIGH):当读取到的传感器值为低电平且之前传感器状态为高电平时,说明人离开了检测范围。此时将传感器状态更新为低电平(pirState = LOW;),熄灭 LED 灯(digitalWrite(ledPin, LOW);),并通过串口打印运动停止的信息(Serial.println("Motion stopped!");)。
    • delay(100);:添加一个 100 毫秒的延迟,避免频繁检测,减少资源消耗。

七、测试与调试

  1. 将编写好的代码上传到 Arduino 开发板。
  2. 确保 PIR 传感器和 LED 灯的连接正确,并且 PIR 传感器的检测范围没有被遮挡。
  3. 打开 Arduino IDE 的串口监视器,设置波特率为 9600。
  4. 当有人进入 PIR 传感器的检测范围时,LED 灯应该点亮,并且串口监视器会显示“Motion detected!”的信息;当人离开检测范围时,LED 灯熄灭,串口监视器会显示“Motion stopped!”的信息。
  5. 如果程序没有按照预期运行,可以检查硬件连接是否正确,代码是否存在语法错误,或者尝试调整 PIR 传感器的灵敏度和延迟时间。

八、拓展应用

  1. 安防报警系统:将 PIR 传感器与蜂鸣器结合,当检测到有人进入时,不仅点亮 LED 灯,还让蜂鸣器发出警报声,实现简单的安防报警功能。
  2. 自动照明系统:在一些需要自动控制照明的场景中,如走廊、卫生间等,当 PIR 传感器检测到有人时,自动打开灯光,人离开后一段时间自动关闭灯光,达到节能的目的。
  3. 智能家居控制:将 PIR 传感器的检测结果与其他智能家居设备(如智能插座、智能窗帘等)集成,实现更智能化的家居控制,比如当检测到有人进入房间时,自动打开空调和窗帘。

通过本次对 PIR 传感器的练习,相信你已经对它的工作原理和在 Arduino 中的应用有了更深入的了解。希望你能够发挥创意,利用 PIR 传感器开发出更多有趣和实用的项目。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Data JPA 基本用法笔记整理

写在前面&#xff1a; 之前一直写MyBatis&#xff0c;去年开始做的这个新项目用的是JPA&#xff0c;整理了一些基本使用方法 1、 集成方法&#xff1a; 1.1 引入依赖 <!--spring data 依赖--> <dependency><groupId>org.springframework.data</groupI…

leetcode-495.提莫攻击

leetcode-495.提莫攻击 文章目录 leetcode-495.提莫攻击一.题目描述二.代码提交三.解释 一.题目描述 二.代码提交 #include <vector> using namespace std;int findPoisonedDuration(vector<int>& timeSeries, int duration) {int total 0;for (int i 0; i …

团队没有测试人员,要快速完成测试?

有同学提问:产品没有专职的测试人员,要怎么才能快速完成测试? 先说结论,这个问题并没有标准答案 没有测试岗位只是没有专门负责这个职能的人员,但测试这个事并没有消失 快速完成测试,其实应该换种说法,就是快速建立质量信心。 因为测试无穷尽,所以没有绝对的完成测试…

光学相位---描述周期性波动现象

相位是描述周期性波动现象的一个重要物理量&#xff0c;用来表示波在某一时刻或位置上的振荡状态。它是时间、空间和频率的函数&#xff0c;通常用角度&#xff08;单位为度或弧度&#xff09;来表示。对于光波而言&#xff0c;其相位可以通过波的传播距离、波长以及波数来定义…

一、通义灵码插件保姆级教学-IDEA(安装篇)

JetBrains IDEA 中安装教学 第一步&#xff1a;事先准备 支持系统&#xff1a;Windows 7 ~ Windows 11、Linux、macOS&#xff1b;下载并安装兼容的 JetBrains IDEA 2020.3 及以上版本&#xff1b; 第二步&#xff1a;在 IntelliJ IDEA 中安装通义灵码 方法 1&#xff1a;通…

系统之间数据对接怎么做

系统之间数据对接怎么做&#xff1a;数据同步功能详解 在当今数字化时代&#xff0c;企业往往依赖于多个系统来管理不同的业务流程。这些系统可能包括客户关系管理&#xff08;CRM&#xff09;、企业资源规划&#xff08;ERP&#xff09;、供应链管理&#xff08;SCM&#xff…

Java NIO ByteBuffer 详解

什么是 ByteBuffer ByteBuffer 是 Buffer 的一个具体实现&#xff0c;专门用于存储和操作字节数据。它提供了高效的、基于内存的 I/O 数据处理方式。 Buffer 类是构建 Java NIO 的基础&#xff0c;其中 ByteBuffer 类是 Buffer 子类中最受欢迎的。这是因为字节类型是最通用的…

OnlyOffice编辑器下载失败排查与解决方案

OnlyOffice编辑器下载失败排查与解决方案 问题描述原因分析&#xff1a;1. 检查后端服务地址是否正确2. 使用内部IP地址访问后端服务 其他常见问题 在使用OnlyOffice编辑器时&#xff0c;常见的问题之一是无法正确显示图片或打开文档。 具体表现为提示图片URL地址不正确或打开…

栈的实现-

栈 栈的概念及结构 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一端称为栈顶&#xff0c;另一端称为栈底。栈中元素遵循**后进先出 LIFO&#xff08;Last In First Out&#xff09;**的原则。 压栈&#xff1a;栈的…

在vivado中对数据进行延时,时序对齐问题上的理清

在verilog的ISP处理流程中&#xff0c;在完成第一个模块的过程中&#xff0c;我经常感到困惑&#xff0c;到底是延时了多少个时钟&#xff1f;今日对这几个进行分类理解。 目录 1.输入信号激励源描述 1.1将数据延时[9]个clk 1.2将vtdc与hzdc延时[9]个clk(等价于单bit的数据…

singleTaskAndroid的Activity启动模式知识点总结

一. 前提知识 1.1. 任务栈知识 二. Activity启动模式的学习 2.1 standard 2.2 singleTop 2.3.singleTask 2.4.singleInstance 引言&#xff1a; Activity作为四大组件之一&#xff0c;也可以说Activity是其中最重要的一个组件&#xff0c;其负责调节APP的视图&#xff…

Tetragon:一款基于eBPF的运行时环境安全监控工具

关于Tetragon Tetragon是一款基于eBPF的运行时环境安全监控工具&#xff0c;该工具可以帮助广大研究人员检测并应对安全重大事件&#xff0c;例如流程执行事件、系统调用活动、I/O活动&#xff08;包括网络和文件访问等&#xff09;。 在 Kubernetes 环境中使用时&#xff0c;…

提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评

提升编程效率&#xff0c;体验智能编程助手—豆包MarsCode一键Apply功能测评 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 引言豆包…

卷积定理理解:如何将系数多项式乘法降到n*log n的复杂度?

目标 两个向量&#xff08;每个向量各自对应一个多项式&#xff09;的简单相乘&#xff08;时间复杂度 O ( n 2 ) O(n^2) O(n2)&#xff09;可以通过两个向量各自对应的离散傅里叶变换的相乘&#xff08;时间复杂度 O ( n ⋅ lg n ) O(n\cdot \text{lg }n) O(n⋅lg n)&#xf…

【devops】 Git仓库如何fork一个私有仓库到自己的私有仓库 | git fork 私有仓库

一、场景说明 场景&#xff1a; 比如我们Codeup的私有仓库下载代码 放入我们的Github私有仓库 且保持2个仓库是可以实现fork的状态&#xff0c;即&#xff1a;Github会可以更新到Codeup的最新代码 二、解决方案 1、先从Codeup下载私有仓库代码 下载代码使用 git clone 命令…

解析 JavaScript 面试题:`index | 0` 确保数组索引为整数

文章目录 一、JavaScript 中的数字类型二、按位或运算符 | 的作用&#xff08;一&#xff09;对于整数&#xff08;二&#xff09;对于小数&#xff08;三&#xff09;对于非数字值 三、用于数组索引的意义 在 JavaScript 面试中&#xff0c;常常会涉及到一些看似简单却蕴含着深…

考研操作系统----操作系统的概念定义功能和目标(仅仅作为王道哔站课程讲义作用)

目录 操作系统的概念定义功能和目标 操作系统的四个特征 操作系统的分类 ​编辑 操作系统的运行机制 系统调用 操作系统体系结构 操作系统引导 虚拟机 操作系统的概念定义功能和目标 什么是操作系统&#xff1a; 操作系统是指控制和管理整个计算机系统的软硬件资源&…

基于SpringBoot+ Vue实现在线视频点播系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

【Java常用】注解与反射_2.反射

目录标题 1.Java反射机制概述1.静态 VS 动态语言1.1动态语言举例展示JavaScript作为动态语言的特性1. 运行时代码生成和执行2.动态变量创建3.对比静态语言&#xff08;如 Java&#xff09;&#xff1a; 1.2 静态语言 2.理解Class类并获取Class实例3.类的加载与ClassLoader4.创建…

MySQL主从同步+binlog

一、简介 MySQL内建的复制功能是构建大型&#xff0c;高性能应用程序的基础 通过将MySQL的某一台主机&#xff08;master&#xff09;的数据复制到其他主机&#xff08;slaves&#xff09;上&#xff0c;并重新执行一遍来执行 复制过程中一台服务器充当主服务器&#xff0c;而…