Arduino 第十六章:pir红外人体传感器练习
Arduino 第十六章:PIR 传感器练习
一、引言
在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动照明等场景。通过本次练习,我们将深入了解 PIR 传感器与 Arduino 的结合使用,学会如何读取传感器数据并根据数据做出相应的反应。
二、所需材料
- Arduino 开发板:推荐使用 Arduino Uno,它是初学者常用且功能丰富的开发板。
- PIR 传感器:常见的如 HC-SR501 型号,这是一款比较容易获取且价格实惠的 PIR 传感器。
- 杜邦线:若干,用于连接 Arduino 开发板和 PIR 传感器。
- LED 灯:一个,用于直观显示 PIR 传感器的检测结果。
- 面包板:方便进行电路连接和布线。
三、PIR 传感器介绍
PIR 传感器的工作原理基于人体发出的红外线。当有人进入传感器的检测范围时,人体发出的红外线会使传感器内部的热释电元件产生变化,从而输出一个电信号。一般来说,PIR 传感器有三个引脚:VCC(电源正极)、GND(接地)和 OUT(信号输出)。
以 HC-SR501 为例,它还具有一些可调节的参数,比如检测灵敏度和延迟时间。通过调节传感器上的电位器,可以改变这些参数以适应不同的使用场景。
四、硬件连接
- 将 PIR 传感器的 VCC 引脚通过杜邦线连接到 Arduino 开发板的 5V 引脚,为传感器提供电源。
- 把 PIR 传感器的 GND 引脚连接到 Arduino 开发板的 GND 引脚,实现接地。
- 将 PIR 传感器的 OUT 引脚连接到 Arduino 开发板的一个数字引脚上,比如数字引脚 2。这样,传感器的输出信号就可以被 Arduino 读取。
- 把 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 毫秒,避免频繁检测
}
六、代码解释
- 变量定义:
const int pirPin = 5;:定义 PIR 传感器连接的引脚为数字引脚 2。const int ledPin = 4;:定义 LED 灯连接的引脚为数字引脚 13。int pirState = LOW;:初始化 PIR 传感器的状态为低电平,用于记录传感器的当前状态。int val = 0;:用于存储从 PIR 传感器读取到的值。
setup()函数:pinMode(pirPin, INPUT);:将 PIR 传感器连接的引脚设置为输入模式,以便读取传感器的信号。pinMode(ledPin, OUTPUT);:将 LED 灯连接的引脚设置为输出模式,用于控制 LED 灯的亮灭。Serial.begin(9600);:初始化串口通信,设置波特率为 9600,方便通过串口打印信息。
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 毫秒的延迟,避免频繁检测,减少资源消耗。
七、测试与调试
- 将编写好的代码上传到 Arduino 开发板。
- 确保 PIR 传感器和 LED 灯的连接正确,并且 PIR 传感器的检测范围没有被遮挡。
- 打开 Arduino IDE 的串口监视器,设置波特率为 9600。
- 当有人进入 PIR 传感器的检测范围时,LED 灯应该点亮,并且串口监视器会显示“Motion detected!”的信息;当人离开检测范围时,LED 灯熄灭,串口监视器会显示“Motion stopped!”的信息。
- 如果程序没有按照预期运行,可以检查硬件连接是否正确,代码是否存在语法错误,或者尝试调整 PIR 传感器的灵敏度和延迟时间。
八、拓展应用
- 安防报警系统:将 PIR 传感器与蜂鸣器结合,当检测到有人进入时,不仅点亮 LED 灯,还让蜂鸣器发出警报声,实现简单的安防报警功能。
- 自动照明系统:在一些需要自动控制照明的场景中,如走廊、卫生间等,当 PIR 传感器检测到有人时,自动打开灯光,人离开后一段时间自动关闭灯光,达到节能的目的。
- 智能家居控制:将 PIR 传感器的检测结果与其他智能家居设备(如智能插座、智能窗帘等)集成,实现更智能化的家居控制,比如当检测到有人进入房间时,自动打开空调和窗帘。
通过本次对 PIR 传感器的练习,相信你已经对它的工作原理和在 Arduino 中的应用有了更深入的了解。希望你能够发挥创意,利用 PIR 传感器开发出更多有趣和实用的项目。
相关文章:
Arduino 第十六章:pir红外人体传感器练习
Arduino 第十六章:PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动…...
鸿蒙面试题
1.0penHarmony的系统架构是怎样的? 2.电话服务的框架? 3.OpenHarmony与HarmonyOS有啥区别?...
Rust 语言入门(一):打印与格式化输出
对于初学者来说,掌握 Rust 的基本 I/O 操作是入门的第一步。本篇博客将介绍 Rust 语言的打印机制,包括基本的 print!、println! 宏,格式化输出方式,并探讨其底层原理。 Rust 的基本打印 在 Rust 中,最常见的输出方式…...
vue3.x 的 toRef详细解读
在 Vue 3.x 中,toRef 是一个用于创建响应式引用的工具函数。它可以将一个响应式对象的某个属性转换为一个独立的 ref 对象,同时保持与原始属性的响应式连接。以下是 toRef 的详细解读和示例。 1. toRef 的作用 核心功能 toRef 用于从响应式对象&#x…...
wordpress资讯类网站整站打包
wordpress程序,内置了价值499元的模板.但是有了模板没有全自动采集相信大多数人都搞不懂,目录那么多,全靠原创几乎是不可能的事情,除非你是大公司,每人控制一个板块, 这套源码里面最有价值的应该是这个采集…...
GitHub基本操作及Git简单命令
GitHub简介 GitHub就是一个远程仓库,远程仓库可以理解为就是一个可以保存自己代码的地方,在实际开发当中一个项目往往是有多个人来共同协作开发完成的,那么就需要一个统一代码保存的地方,而GitHub就是起到一个共享和汇总代码的作…...
记一次MySQL故障解决
记一次MySQL故障解决 1 故障现象2 故障排查2.1 查看MySQL服务状态2.2 查看服务日志 3 解决方法3.1 增加 wait_timeout 和 interactive_timeout 参数的值,确保连接不会因超时而被关闭:3.2 检查服务已经恢复正常,不过以上只是临时修改ÿ…...
DeepSeek-R1私有化部署教程 | Linux服务器搭建AI大语言模型
**云服务器用LinuxDockerOllamaOpenWebUI部署DeepSeek-R1大语言模型(LLMs),DeepSeek本地化部署教程(在自己电脑上部署也可以参考此教程)。**超详细教程,手把手。 在当今数字化时代,大型语言模型…...
「软件设计模式」桥接模式(Bridge Pattern)
深入解析桥接模式:解耦抽象与实现的艺术 一、模式思想:正交维度的优雅解耦 桥接模式(Bridge Pattern)通过分离抽象(Abstraction)与实现(Implementation),使二者可以独立…...
【Flink快速入门-5.流处理之多流转换算子】
流处理之多流转换算子 实验介绍 前面实验中介绍的算子已经能够满足我们的大部分开发需求了,但是在实际工作中有时候还会遇到一些业务场景,例如需要摄入多个输入流并将其合并处理,或者需要将一条输入流分割为多条子流,在不同的子…...
react传递函数与回调函数原理
为什么 React 允许直接传递函数? 回调函数核心逻辑 例子:父组件控制 Modal 的显示与隐藏 // 父组件 (ParentComponent.tsx) import React, { useState } from react; import { Modal, Button } from antd; import ModalContent from ./ModalContent;co…...
华为云kubernetes基于keda自动伸缩deployment副本(监听redis队列长度)
1 概述 KEDA(Kubernetes-based Event-Driven Autoscaler,网址是https://keda.sh)是在 Kubernetes 中事件驱动的弹性伸缩器,功能非常强大。不仅支持根据基础的CPU和内存指标进行伸缩,还支持根据各种消息队列中的长度、…...
Spring源码分析のBean扫描流程
文章目录 前言一、scanCandidateComponents1.1 isCandidateComponent1.1.1、排除/包含过滤器1.1.2、条件装配1.1.3、重载一1.1.4、重载二1.1.5、补充:Lookup注解 总结 前言 原生的Spring在构造ApplicationContext时,会调用refresh方法。其中就包含了扫描…...
Ubuntu安装docker:docker-desktop : 依赖: docker-ce-cli 但无法安装它、无法定位软件包 docker-ce-cli
具体错误 sudo apt-get install ./docker-desktop-amd64.deb [sudo] password for weiyu: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 注意,选中 docker-desktop 而非 ./docker-desktop-amd64.de…...
基于大数据的奥运会获奖数据分析系统设计与实现
【大数据】基于大数据的奥运会获奖数据分析系统设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统通过集成先进的数据抓取、处理、存储与可视化技术,为深入理解奥运会…...
数据结构 堆和priority_queue
一、堆的定义 堆(heap),是⼀棵有着特殊性质的完全⼆叉树,可以⽤来实现优先级队列(priorityqueue)。 堆需要满⾜以下性质: 1. 是⼀棵完全⼆叉树; 2. 对于树中每个结点,如…...
Dockerfile 编写推荐
一、导读 本文主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法。 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是不正当的 Dockerfile 使用也会导致很多问题。 docker 镜像太大。如果你经常使用镜像或者…...
【抽象代数】1.2. 半群与群
群的定义 群非空集合二元运算性质 定义1. 设 为一个非空集合,上有二元运算,满足结合律,则称或为一个半群。 定义2. 设 为半群,若元素 满足 ,则称 为 的左幺元(右幺元:)&#…...
Django中实现简单易用的分页工具
如何在Django中实现简单易用的分页工具?📚 嗨,小伙伴们!今天我们来看看如何在 Django 中实现一个超简单的分页工具。无论你是在处理博客文章、产品列表,还是用户评论,当数据量一大时,分页显得尤…...
「软件设计模式」装饰者模式(Decorator)
深入解析装饰者模式:动态扩展功能的艺术(C实现) 一、模式思想与应用场景 1.1 模式定义 装饰者模式(Decorator Pattern)是一种结构型设计模式,它通过将对象放入包含行为的特殊封装对象中,动态地…...
5分钟掌握智能订阅工具:RSSHub Radar浏览器扩展使用指南
5分钟掌握智能订阅工具:RSSHub Radar浏览器扩展使用指南 【免费下载链接】RSSHub-Radar 🧡 Browser extension that simplifies finding and subscribing RSS and RSSHub 项目地址: https://gitcode.com/gh_mirrors/rs/RSSHub-Radar RSSHub Radar…...
揭秘印刷厂“黑科技”:手把手教你用JS脚本为Illustrator开发自动化刀版插件(附源码解析)
从零构建Illustrator刀版插件:JS脚本开发实战指南 在包装设计领域,刀版图是印刷工艺中不可或缺的一环。传统手工绘制刀版不仅耗时耗力,还容易因人为因素导致尺寸偏差。本文将带你深入探索如何利用JavaScript为Adobe Illustrator开发自动化刀版…...
使用 taotoken cli 工具一键配置团队开发环境与密钥
使用 Taotoken CLI 工具一键配置团队开发环境与密钥 1. 安装 Taotoken CLI 工具 Taotoken CLI 工具提供两种安装方式,适合不同使用场景。对于个人开发者或临时使用场景,推荐通过 npx 直接运行,无需全局安装: npx taotoken/taot…...
【AISMM医疗行业实践黄金标准】:基于2026奇点大会12家头部厂商实测报告,锁定唯一通过NMPA III类证预审的架构范式
更多请点击: https://intelliparadigm.com 第一章:AISMM医疗行业实践黄金标准的诞生背景与战略意义 近年来,全球医疗健康数据呈指数级增长,AI模型在影像诊断、药物发现、电子病历分析等场景深度落地,但模型开发、验证…...
浏览器沙箱环境构建:安全执行与结构化回显的实现原理
1. 项目概述:一个浏览器内的指令回显工具最近在折腾一些前端自动化测试和交互原型开发时,我常常遇到一个需求:需要快速验证浏览器环境下的指令执行结果,或者想直观地看到某个JavaScript API在特定上下文中的行为。手动打开控制台敲…...
游戏AI行为树与状态机设计:从LeetCode算法到智能决策的完整指南
游戏AI行为树与状态机设计:从LeetCode算法到智能决策的完整指南 【免费下载链接】leetcode LeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解,记录自己的leetcode解题之路。) 项目地址: https://gitcode.com/gh_mirrors/le…...
告别手动配置!基于STM32 UID的RS485从机地址自动分配实战(附完整代码)
工业物联网实战:基于STM32 UID的RS485设备即插即用方案设计 在工业自动化现场部署传感器网络时,最令人头疼的莫过于给每个RS485从机设备手动配置地址。想象一下这样的场景:生产线需要新增20个温湿度传感器,工人不得不逐个拆开设备…...
保姆级教程:用Qt和QSsh库在Windows上打造你的第一个SSH客户端(附完整源码)
从零构建Qt SSH客户端:QSsh库编译与实战开发指南 对于需要远程管理Linux服务器的开发者而言,图形化SSH工具能显著提升工作效率。本文将手把手带你用Qt和QSsh库打造一个功能完整的SSH客户端,涵盖从环境搭建到功能实现的完整链路。不同于市面上…...
没有专业暗室怎么办?用示波器+电流钳给你的产品做个骚扰功率‘体检’(附估算方法与避坑指南)
低成本EMC预检方案:用示波器与电流钳实现骚扰功率快速评估 当你的硬件团队正在为新产品熬夜调试时,最令人沮丧的莫过于EMC实验室发回的那份不合格报告——特别是当问题出在38MHz频点超标这种本可早期发现的基础性问题上。我们曾为某医疗设备客户节省了23…...
从买票看算法:用‘折半搜索’解决洛谷P4799冰球赛购票难题(附C++代码)
从买票看算法:用‘折半搜索’解决洛谷P4799冰球赛购票难题(附C代码) 想象你正站在冰球赛售票处,手握有限的预算,面对40场不同价格的比赛门票。如何快速计算出所有可能的观赛组合?这个看似生活化的问题&…...
