当前位置: 首页 > news >正文

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 传感器开发出更多有趣和实用的项目。

相关文章:

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 检查服务已经恢复正常,不过以上只是临时修改&#xff…...

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)是一种结构型设计模式,它通过将对象放入包含行为的特殊封装对象中,动态地…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【位运算】消失的两个数字(hard)

消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...