6个版本 (稳定版)
2.0.2 | 2023年5月18日 |
---|---|
2.0.1 | 2023年5月15日 |
2.0.0 | 2023年4月18日 |
1.0.0 | 2023年4月4日 |
0.1.2 | 2023年3月4日 |
#614 in 嵌入式开发
每月下载 57 次
21KB
225 行
pir-motion-sensor
pir-motion-sensor是一个Rust库,主要用于与Raspberry Pi平台上的PIR运动传感器交互。该库主要在Raspberry Pi 400和Raspberry Pi 4B上的HC-SR501运动传感器上进行测试,并在我的公寓和我家人的家中广泛使用 - 用于智能警报目的(其余代码将发布)以及一些家庭活动,例如根据运动检测开关各种设备。
该库利用tokio运行时,支持同时使用多个传感器(我测试了同时使用20个),资源占用低,这对于较老的Raspberry Pi或Pi Zero版本尤其重要。
为什么使用这个库?
HC-SR501 PIR价格非常便宜,且非常普遍,是一种红外运动传感器,并且非常适合基于Arduino/raspberry/stm32等项目的各种项目。
然而,由于它非常便宜,它有时会检测到“噪音”,这意味着在没有实际运动在其检测范围内的情况下发生检测 - 这是一种假阳性检测。
为了消除这个问题,我创建了这个简单的库,该库允许用各种参数初始化这个传感器,从而改变其检测特征。根据传感器配置,库可以“忽略”这些假检测,并帮助使这些传感器非常可靠。
HC-SR501 PIR可能不是唯一可以被库支持的红外传感器 - 如果您测试了其他运动传感器,请让我知道。
数字微波传感器,如DFRobot SEN0192,也受到支持,但请注意,SEN0192在检测发生时从High
状态变为Low
状态,因此您必须在电路中通过适当的晶体管简单地反转这个信号,以利用这个库。目前我没有任何计划来实现此类传感器的替代逻辑。
测试设备
Raspberry Pi
- Raspberry Pi 4B 4 GB RAM - Raspbian GNU/Linux 11 (bullseye)
- Raspbbery Pi 400 4 GB RAM - Raspbian GNU/Linux 11 (bullseye)
测试运动传感器
- HC-SR501 红外线人体红外感应器
- HC-SR505(红外线 - 由于无法更改此简单传感器的出厂值,因此仅提供基本支持)
- DFRobot SEN0192(微波)
先决条件
请使用此参考手册了解HC-SR501 PIR:https://lastminuteengineers.com/pir-sensor-arduino-tutorial/
基于此手册,您应该
- 将灵敏度调整黄色螺丝拧至最长范围
- 将时间延迟调整黄色螺丝拧至最短时间
- 将触发选择跳线设置为多触发模式,默认情况下可能设置为单触发
以上所有设置都可以通过此库编程更改,因此在此操作之后,您无需再触摸跳线和螺丝。
如果您不确定是否操作正确 - 将您的传感器连接到VCC(5V)、树莓派的GND,以及带有电阻(1-10 kΩ)的简单LED二极管到传感器的OUT信号,并根据LED检查这些调整后传感器的运行情况。请注意,当传感器检测到运动时,它的OUT引脚会设置约5V,这是它的最高状态。
不同型号的运动传感器
如果您有不同的PIR运动传感器(或微波传感器)型号,该传感器完全是数字的(仅在检测到运动时将其引脚信号设置为高电平),则此库也适用于它。
工作原理
在此说明中有一个术语 有效检测
- 这是此库将其分类为 有效 的检测 - 这可能与传感器的OUT引脚状态不同 - 一切都取决于您的配置。
换句话说:根据传感器配置,传感器可以做出许多检测(在此定义为将它的OUT引脚设置为高电平),但这并不意味着将有一个单一的 有效检测
被分类。
配置
要初始化您的传感器,请考虑以下参数
-
GPIO引脚编号(显而易见的事情),测试时不需要,有关更多信息,请参阅
tests/valid_detections.rs
。 -
传感器刷新率
这不是传感器的刷新率,而是循环读取传感器PIN状态的刷新率。较短的时间允许更频繁地从传感器读取数据,从而提高传感器的“刷新率”,但可能会略微增加系统负载(当您有多个传感器和RPi 2/3或Zero时可能会很重要)。此参数的值较高可能会导致“错过”一些快速检测。
-
运动时间周期
这是一个时间限制,应用程序将其分类为有效检测
。如果此周期较短,则意味着在指定时间内检测到运动的难度更大。 -
最小触发次数
当传感器检测到运动(或类似情况)时,它将它的OUT引脚设置为高电平。如果您正确地进行了初始调整,这可能会每秒发生几次,这是正常的。此设置是要求在运动时间周期
内设置高电平的次数,以分类单个有效检测
。此选项对于排除 >1 的“噪声”检测特别有用。
简要总结这些参数:基于 传感器刷新率
时间,库定期读取传感器 OUT 引脚的状态。如果有检测(在此定义为传感器信号线上高电平状态),库将尝试在 最小触发次数
内计数这些高电平状态,直到 运动时间周期
时间。如果在 运动时间周期
内达到 最小触发次数
,则我们得到 有效检测
。
设置这些参数可以让您决定传感器的灵敏度和准确性。因为“噪声”检测通常非常短,因此如果您设置不过于灵敏(良好的测试值:sensor_refresh_rate > 100,
motion_time_period < 1000,
minimal_triggering_number > 2
),您可以使用此库有效地去除它们。请随意尝试您自己的值。
请注意,这些设置可能相互影响,例如:非常短的 sensor_refresh_rate
可以通过增加 motion_time_period
和 minimal_triggering_number
的值来减少。
在您的项目中使用
请参阅 examples/
目录中的示例
贡献
欢迎贡献。
为此库提供了单元测试,可以通过
cargo测试 ----nocapture
如果您做出贡献,请别忘了为您的更改添加测试用例。
待办事项
很快。
依赖关系
~8–17MB
~211K SLoC