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 嵌入式开发

Download history 2/week @ 2024-04-04

每月下载 57

MIT 协议

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 > 100motion_time_period < 1000minimal_triggering_number > 2),您可以使用此库有效地去除它们。请随意尝试您自己的值。

请注意,这些设置可能相互影响,例如:非常短的 sensor_refresh_rate 可以通过增加 motion_time_periodminimal_triggering_number 的值来减少。

 

在您的项目中使用

请参阅 examples/ 目录中的示例

 

贡献

欢迎贡献。

为此库提供了单元测试,可以通过

cargo测试 ----nocapture

如果您做出贡献,请别忘了为您的更改添加测试用例。

 

待办事项

很快。

依赖关系

~8–17MB
~211K SLoC