2013 年 6 月,我们不幸遭遇地下室洪水,原因是我们污水泵的断路器跳闸。污水泵可能会出现很多问题。您总是要警惕断电、断路器熔断、污水泵故障、管道堵塞以及可能出现的各种问题,最终可能导致地下室被淹。我需要一种方法,在我不在家时提醒我出现的问题。声音警报器相当便宜,当您在房子里时效果很好。当您在离家十英里的工作地点时,它们就完全失效了。我有一个树莓派,我偶尔会摆弄一下,但一直没有真正用途。我决定尝试让 Pi 作为专用污水坑监控设备工作。希望 Pi 可以在我不在时发送短信警报,提示我出现问题。

由于我没有编程背景,所以我开始寻找一个现有的项目,我可以安装在 Pi 上,作为污水坑监控器。还有其他项目可以监控污水泵的活动;但是,我遇到的所有项目似乎都过于复杂,或者不具备我需要的功能。我需要一些简单的东西,可以定期监测污水坑中的水位,并在出现问题时向我发送短信。如果它还可以显示易于访问的漂亮污水坑活动图,那就更好了。

虽然我多年来在工作中编写了许多脚本,但我从未学习过面向对象编程。我决定学习 Python,几个月后,我开始着手开发一个监控系统。我选择 Python 是因为它有一个活跃的社区,许多树莓派爱好者都将其用作他们的主要脚本语言。树莓派使用基于 Debian 的 Raspbian Linux,所以我已经熟悉了。有了这些工具,本着真正的 Linux 和树莓派精神,我决定构建自己的监控系统,并将其命名为 Raspi-Sump。

Raspi-Sump 是用 Python 编写的污水坑水位监控系统。它使用树莓派和一个 HC-SR04 超声波传感器来监测污水坑中的水位,记录读数,并在水位高于预定义水平时发送短信/电子邮件警报。

在本文中,我展示了创建 Raspi-Sump 使用的方法。我还描述了监控器的物理设置和使其工作的脚本。如果您选择做类似的事情,源代码和安装说明可在 GitHub 上找到。它可以免费使用和修改(请参阅“资源”)。

我确定我需要的监控器应具备以下功能:

  • 每分钟定期读取一次我污水坑中的水深。

  • 将读数记录到逗号分隔的文件中,以便处理图形和历史泵活动。

  • 如果水位超过预定义水平,则自动发送短信/电子邮件警报。

  • 向网站发送当前水位的异地图形报告。

  • 基于 Web 的污水泵活动历史信息。

  • 在意外故障后自动重启 raspisump.py 进程。

物理设置

Raspi-Sump 的完整组件列表包括:

  • 树莓派 B 型和外壳。

  • Raspbian Linux。

  • HC-SR04 超声波传感器。

  • 五英尺长的 Cat5 电缆(需要四股 24AWG 线)。

  • 两个电阻(一个 470R 欧姆和一个 1K 欧姆)。

  • 用于保护焊接连接的热缩管。

  • 用于固定传感器的塑料支架。

  • 一根两英尺长的木条,用于将塑料支架安装在坑中。

  • 一个从旧 PC 上拆卸下来的软驱四针电源连接器。

  • 两个机箱风扇电源连接器,也从同一台 PC 上拆卸下来。

材料的总成本,包括几个备用传感器,为 80 美元。

我选择的超声波传感器是 HC-SR04,它有四个连接,连接到树莓派的 GPIO 引脚。在 Python 脚本的帮助下,安装在污水坑内面向水的传感器会发送一个声波脉冲,该脉冲从水面反射回传感器。该脚本监控声波脉冲弹回传感器所需的时间。它通过测量脉冲以声速返回所需的时间来计算距离。这为您提供了传感器和水之间的距离的读数。该距离用于计算水深,并将带有时间戳的结果记录到 CSV 文件中。

图 1 显示了连接的更详细视图。

图 1. 接线图

传感器上的四个引脚按如下方式连接到树莓派:

  • 引脚 1 VCC 连接到 5V 引脚 2。

  • 引脚 2 Trig 连接到 GPIO17 引脚 11。

  • 引脚 3 Echo 连接到 GPIO27 引脚 13。

  • 引脚 4 接地连接到引脚 6 接地。

我选择了 GPIO17 和 27,但只要在 Python 脚本中正确识别,您就可以使用 Pi 上的任何可用 GPIO 引脚。

引脚 1 为 HC-SR04 传感器提供 5V 电源。在 GPIO17 (Trig) 上启动一个命令,该命令将引脚的值设置为 True 10 微秒。这会导致传感器在该短时间内向水中发射一系列声波脉冲。连接到 GPIO27 的 Echo 引脚会监听返回脉冲。脉冲的发送和返回之间的差异给出了时间测量值。该测量值用于计算水的距离。

这会导致一个小问题,因为树莓派 GPIO 引脚的额定电压仅为 3.3V。传感器将 5V 电流发送回 GPIO27。需要一种方法将电流限制为 3.3V,这样才不会损坏 Pi。为了保护 Pi 免受损坏,只需在传感器和 Pi 之间的 Echo 线上插入一个分压器即可。

分压器

分压器的目的是减少从一个组件发送到另一个组件的电流。如图 1 所示,我在 Echo 线上焊接了一个 470R 欧姆电阻,并在 Echo 和接地线之间桥接了一个 1K 欧姆电阻。这样可以防止将 5V 电压发送到额定电压仅为 3.3V 的引脚。使用这些电阻器,电压实际上略高,为 3.4V,这在可接受的水平内。所有焊接连接都用热缩管覆盖,以避免短路。

计算所需的电阻类型超出了本文的范围,但有许多方便的基于 Web 的分压器计算器可用于确定您的需求。在此示例中,1K 和 2K 欧姆电阻会将电流降低到 3.333V。

接线

树莓派通过五英尺长的 CAT5 电缆连接到传感器。因为有四个连接,所以只使用了八根双绞线中的四根。在选定导线的每一端,我焊接了与传感器引脚和 Pi 上的引脚兼容的连接器。旧的 3.5 英寸软驱电源连接器非常适合传感器连接(图 2)。我使用了几个从旧 PC 上拆卸下来的双针 PC 机箱风扇连接器,用于连接 Pi 的引脚。这些连接器可以在网上找到,但您可以从旧 PC 上找到的任何东西都非常有用。

图 2. 软驱连接器

安装

HC-SR04 连接到一个塑料外壳上,并用螺丝固定在一块木条上。木条插入到面向下的污水坑中,并且可以根据需要轻松调整和拆卸。Cat5 电缆牢固地用胶带固定到污水泵的 ABS 管道和一个开放的墙壁立柱上,以防止在拆卸污水坑盖时电缆缠绕和断开。

图 3. 打开的污水坑视图

最后,将树莓派安装在墙壁立柱上,并插入到 UPS 设备中。图 4 显示了完成的视图。

图 4. 完成的坑视图

Raspi-Sump

Raspi-Sump 程序目前由三个 Python 脚本组成。主脚本是 raspisump.py。该脚本非常简单,只有大约 100 行代码。它首先设置污水坑的变量,如深度 (72 厘米)、临界水位 (35 厘米) 和前面提到的 GPIO 引脚分配。然后,该脚本每分钟采集 11 个水位读数样本,并将中值样本用作最佳读数(稍后会详细介绍)。一旦确定了读数,该脚本就会确定水位是否处于安全或临界水平。安全级别记录到 CSV 文件中,脚本等待一分钟以进行下一次读取。临界级别传递给一个函数,该函数将级别记录到同一个 CSV 文件中,并向我的手机发送短信/电子邮件(图 5)。我使用 Python smtplib 模块来处理电子邮件警报。您可以配置任何电子邮件服务器来处理警报,包括 Pi 上的 localhost 邮件服务器(如果您的 ISP 允许端口 25 流量)。如果您使用 Gmail 帐户,也可以使用 ISP 的 SMTP 服务器或 Google 的 Gmail SMTP 服务器。

图 5. 短信警报

用于在 Pi 和传感器之间进行通信的关键 Python 模块称为 RPi.GPIO。该模块可用于控制您的 Pi 的许多不同类型的设备。在不深入研究 RPi.GPIO 的“螺母和螺栓”的情况下,该模块可帮助您通过打开和关闭引脚来控制引脚。这使您可以控制所有类型的设备,例如传感器和 LED。

您可以在 water_level() 函数中的 raspisump.py 脚本中查看 GPIO 代码。许多其他与 Pi 的 GPIO 引脚通信的项目都使用类似的代码。Adam Lappin 的 Byte Creation Blog 提供了一个很好的示例,帮助我学习了如何在此项目中使用 RPi.GPIO 模块(请参阅“资源”)。

通过将此行添加到 /etc/rc.local 中最后一行 exit 0 之前,Raspi-Sump 在树莓派启动时自动启动。


/home/pi/raspi-sump/raspisump.py &

与符号 (&) 将脚本作为后台进程启动。

访问 GPIO 引脚需要 Pi 上的提升权限。 要手动启动脚本,请发出以下命令:


sudo /home/pi/raspisump/raspisump.py &

图 6 显示了如何使用 tail 命令来演示 raspisump.py 实时更新 CSV 文件。

图 6. raspisump.py 实时更新 CSV 文件

图 6 中显示的内容非常奇怪。 水位深度上下波动。 您会期望每次读数时水位都持续升高。 原因是每次读数都存在一厘米的差异。 Linux 是一个多任务操作系统,而不是一个实时操作系统。 它不是与传感器通信并返回精确结果等实时应用程序的最佳选择。 我能想到的最好原因是,操作系统正忙于执行其他任务,并允许 raspisump.py 在完成处理这些其他进程后记录读数。

这让我想到了我使用排序样本的中值读数的原因。 有时,脚本会给出无效读数,偏差可能很大。 即使水位低于我的临界值,这也会触发错误的警告短信提醒。 但是,这些读数很少见。 通过使用排序样本,我可以删除高低端的那些边缘读数(如果它们发生)。 中值读数始终在实际水位的 1 厘米范围内是准确的。 对于住宅系统,我并不关心毫米级的精度。 读数中的小差异仍然可以安全地报告水位。 这也有助于解释定期生成并发送到 Web 服务器的图表中锯齿状线条的原因。

图 7. todaychart.py 生成的图表

我使用的第二个脚本是 todaychart.py。 如图 7 所示,此脚本从我的 CSV 日志文件中生成水位活动图表。 它使用 Python matplotlib 和 NumPy 模块来生成图表。 rsync over SSH 每小时通过 cron 脚本将图表和 CSV 日志文件复制到我的 Web 服务器。 我选择在 Pi 上而不是 Web 服务器上生成图表,因为不同的 Linux 发行版打包了不同版本的 matplotlib 和 NumPy。 我更喜欢使用打包版本以简化操作。 无论您为异地组件使用哪个发行版,始终使用 Raspberry Pi 都会呈现更一致的图表。

第三个也是最后一个脚本是 checkpid.py。 其目的是监控 raspisump.py 进程的健康状况,并在进程停止时重新启动它。 Cron 定期运行该脚本并查找三种结果之一。 如果脚本返回 0,则表示进程失败。 然后,checkpid.py 启动一个重启命令。 如果脚本返回 1,则表示进程正常,并且脚本干净退出。 如果该数字大于 1,则表示存在多个 raspisump.py 进程。 在这种情况下,将启动 killall 09 raspisump.py 指令,并重新启动该进程。

Raspi-Sump 的其他问题

HC-SR04 传感器具有相当宽的声纳场。 用户手册指出,它在 30° 角时效果最佳。 我的污水坑是一个繁忙的地方。 它有一个备用泵,该泵位于 2x6 螺柱上高于主泵的位置。 每个泵都有一个浮球在坑中弹跳。 当传感器拾取进入其场中的物体时,这会导致错误读数。 可以通过将传感器策略性地放置在远离这些物体的位置来缓解此问题。 如果这不可能,您可以将 3 英寸或更大的 PVC 管垂直插入污水坑中,并强制传感器读取空管中的数据。 这将集中脉冲并隐藏坑中引起问题的物体。

结论

Raspi-Sump 仍处于开发的早期阶段。 我想添加其他功能,例如:

  • 一个手动电源按钮,用于启动和关闭 Raspberry Pi,而无需登录。

  • 一个小型 LCD 显示屏,用于显示当前水位,而无需打开盖子。

  • 一个使用 Python Web 框架的基于 Web 的报告系统。

  • Pi 上的 Raspi-Sump 的基于 Web 的管理界面(如家用路由器)。

  • 一个 GSM 模块组件,用于使用蜂窝网络进行警报,而不是使用 Internet。

  • 一个配置文件,用于存储变量,而不是在脚本中存储变量。

  • 用于安装 Raspi-Sump 的软件包管理。

污水坑监控器只是您可以用来帮助避免地下室被淹没的一种工具。 它不能替代包含单独断路器上的备用泵的完整策略。 燃气发电机对于长时间停电也是必不可少的。 此外,我保留了我那便宜的 Home Depot 声音警报器。 如果我睡得很熟,凌晨两点的短信警报毫无用处。 我想要一个“全力以赴”的尖叫声来唤醒我。

欢迎就此项目提供所有反馈。 我不是专业的程序员,我确信我可以大大改进代码或添加我什至没有考虑过的有用功能。

虽然它并不完美,但我现在拥有一个有效的系统,可以在我离开时给我额外的安心。 如果您正在寻找类似的解决方案,我希望您可以使用、修改和改进 Raspi-Sump 以满足您的需求。 如果你这样做,我很乐意收到你的来信。

致谢

特别感谢 Ron Hiller(GitHub 用户 @rhiller)不知疲倦地回答我关于分压器以及他自己的污水泵监视器 pi-distance 的问题:https://github.com/rhiller/pi-distance

资源

Raspi-Sump 网站:http://www.linuxnorth.org/raspi-sump

源代码:https://github.com/alaudet/raspi-sump

加载 Disqus 评论