本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于树莓派的物联网河流流量计

发布时间:2022-01-12
分享到:

基于树莓派的物联网河流流量计

发布时间:2022-01-12
分享到:

该项目演示了如何构建一个连接互联网的流量计,该流量计可以连续测量河流的流量并在线向用户提供实时数据。

该系统可以通过一次性设置部署到偏远的河流,并且可以自行运行,自动收集数据而无需用户在场。可以在整个河流中放置多个仪表以收集许多数据点。

测量数据通过系统的蜂窝网络连接推送到云端,由 Soracom Global SIM 卡启用,并可通过 Soracom Harvest 在线查看。AWS IoT 和 CloudWatch 服务用于在河流流量达到临界水平时向用户发送电子邮件通知。

背景

背景

河流的流速测量随着时间流过特定点的水量。随着降雨中的水流入和流出河流系统,该速率会上升和下降。

测量河流的流速可以为各种目的提供有价值的信息:

  • 水文:流速的长期趋势可以深入了解为河流供水的流域系统及其随时间的变化。
  • 生态:河水的流速决定了它是否可以养活不同种类的植物或动物。
  • 洪水预警:流量峰值可以为即将到来的洪水提供早期预警,并且可以与降雨报告相关联。
  • 娱乐安全:实时测量可以警告独木舟/皮划艇运动员沿河旅行是否安全。

目前,测量偏远河流地区的流量是一个非常实际的过程。测量员需要携带他们的测量设备徒步到感兴趣的河流,设置它,进行测量,拆卸它,然后徒步返回。

由于收集测量值需要付出努力,因此仅对某些河流定期进行。如果没有持续监控,流量提供的许多洞察力就会丢失。

该项目旨在通过使流量数据更容易收集和更容易为需要它的用户提供来解决这个问题。

如何运行

物联网流量计由传感器和电子设备组成,连接到 PVC 管道支撑结构,可部署到河流以收集流量数据。

流量计传感器以可调节的高度连接到结构的垂直管道,该管道被浸没在水下。电子设备包含在水外结构顶部的上部外壳中。

该系统采用 YF-S201 液体流量计传感器,其中包含一个由进水旋转的磁性风车。

随着更多的水进入传感器,轮子旋转得更快,这个旋转速度(Hz)可以用来计算每分钟有多少升水流过传感器(L/min),称为流量。

注意:此流量仅表示通过传感器本身的水升数,而不是整条河流。传感器的流量与河流的实际流量密切相关,但不是直接测量的。物联网流量计仅提供传感器的流量,并将其用作整条河流的近似值。

一个 3D 打印的支架用于将传感器连接到 PVC 管道结构上,一个 3D 打印的漏斗将河水引导到传感器的入口。

该系统的电子设备包括一个 Raspberry Pi、带有 Soracom Global SIM 的 3G USB 调制解调器和外部电池,这些都包含在一个 3D 打印的外壳中。传感器通过水封跨接线连接到 Pi,这些跨接线将垂直管道的长度延伸到外壳中。

Pi 运行 Python 脚本,每分钟都会从传感器收集流量测量值,并使用调制解调器和 SIM 卡提供的蜂窝连接将其推送到云端。

该脚本向 Soracom 的统一端点发出 HTTP POST 请求,该端点将数据转发到两个服务:Soracom Harvest 和 Soracom Funnel。

Soracom Harvest 允许对传入数据进行轻松的实时可视化。控制台显示一个实时图表,显示更新的数据值,因为它们流入。用户可以监控数据在选定的时间窗口内如何变化。

Soracom Funnel 获取数据并通过将其发送到 AWS IoT 端点进一步转发,然后使用 AWS IoT 规则将数据推送到 AWS CloudWatch。

CloudWatch 警报配置为监控流量何时超过临界值,并自动向任何订阅用户发送电子邮件通知,让他们知道警报已被触发。此功能允许用户随时了解河流流量的重要变化,而无需实时监控。

架构和卓越运营

物联网流量计旨在解决传统上需要更多动手、昂贵的设备来收集数据的问题。虽然这个原型已经表明它可以派上用场并提供结果,但在转向生产版本时还有更多的事情需要考虑。

成本:该系统的总成本约为 120 美元,其中最大的开支是 Raspberry Pi(35 美元)和 3G 调制解调器(60 美元)。这个价格可能会随着批量供应而下降。考虑到使用此物联网设备而不是支付测量员/工程师手动收集测量值所节省的工时,这个总成本是合理的。

可扩展性:系统可以根据需求扩展到更多单元。通过过渡到包含所有必要电子设备的预制电路并开发更好的预组装管道结构,构建大量单元将变得更加容易。

如果扩展到全球运行的 1000 台设备,Soracom 和 AWS IoT 仍可能是数据收集和分发方式的支柱。可能需要为每个用户设置个人账户和访问权限,AWS IoT 可以通过 IAM 用户组来实现这一点,IAM 用户组仅向特定用户授予查看/编辑数据的权限。

可靠性:反映实际流量的一致和准确的测量对于这个问题很重要。需要进行更多测试以更好地了解可能影响传感器读数的不同影响,例如深度和河流中的位置。

该系统还依赖于可靠的蜂窝网络。目前,如果由于网络超时而对 Soracom 的请求尝试失败,则该数据将丢失。该工具的进一步更新将包括备份测量结果,以便在重新建立连接时将其保存并推送到云端。

安全性:物联网流量计设计为无人值守,这使其物理安全面临风险。目前,如果系统离线或丢失,无法确定系统会发生什么情况,但未来的版本可能会包含一个 GPS 模块,该模块包含系统在每次数据推送时的当前坐标。这将有助于随时跟踪系统的位置。

构建说明
以下是有关如何原型化、构建和接收来自 IoT 流量计的通知的说明。

通过首先构建一个原型电路来测试液体流量计的功能、启用互联网连接并将测量结果推送到云端,开始这个项目。接下来构建管道结构并附加组件,以便可以部署。最后,设置 AWS CloudWatch 并在出现关键流量时订阅电子邮件警报。

这些说明假设您可以通过 SSH 或键盘/鼠标/显示器设置访问 Rasberry Pi 的终端。Pi 还必须通过 WiFi 或以太网连接互联网以进行初始设置。

原型电路

第 1 步:设置测试电路

使用公对母跳线,从 YF-S201 液体流量计的电线到 Raspberry Pi GPIO 引脚进行以下连接:

  • 红色(直流电源)到引脚 1 (3.3V)
  • 黑色(接地)到引脚 6(接地)
  • 黄色(输出)到引脚 7 (GPIO4)

第 2 步:测试传感器测量值

可以运行 Python 脚本以从现在连接的传感器获取读数。打开 Raspberry Pi 终端并输入以下命令以创建并导航到Pi 桌面上将存储脚本的flowmeter目录:

使用 Python 的 IDLE 或其他文本编辑器,复制以下 Python 代码并将其保存flowmeter.py在刚刚创建的文件夹中:

import json
import time
from datetime import datetime
import RPi.GPIO as GPIO
  
class FlowMeter():
    ''' Class representing the flow meter sensor which handles input pulses
        and calculates current flow rate (L/min) measurement
    '''
    
    def __init__(self):
        self.flow_rate = 0.0
        self.last_time = datetime.now()
  
    def pulseCallback(self, p):
        ''' Callback that is executed with each pulse 
            received from the sensor 
        '''
       
        # Calculate the time difference since last pulse recieved
        current_time = datetime.now()
        diff = (current_time - self.last_time).total_seconds()
       
        # Calculate current flow rate
        hertz = 1. / diff
        self.flow_rate = hertz / 7.5
       
        # Reset time of last pulse
        self.last_time = current_time
    
    def getFlowRate(self):
        ''' Return the current flow rate measurement. 
            If a pulse has not been received in more than one second, 
            assume that flow has stopped and set flow rate to 0.0
        '''
       
        if (datetime.now() - self.last_time).total_seconds() > 1:
            self.flow_rate = 0.0
        
        return self.flow_rate
  
def main():
    ''' Main function for repeatedly collecting flow rate measurements
        and sending them to the SORACOM API
    '''
   
    # Configure GPIO pins
    INPUT_PIN = 7
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(INPUT_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
   
    # Init FlowMeter instance and pulse callback
    flow_meter = FlowMeter()
    GPIO.add_event_detect(INPUT_PIN,
                          GPIO.RISING,
                          callback=flow_meter.pulseCallback,
                          bouncetime=20)
   
    # Begin infinite loop
    while True:
  
        # Get current timestamp and flow meter reading
        timestamp = str(datetime.now())
        flow_rate = flow_meter.getFlowRate()
        print('Timestamp: %s' % timestamp)
        print('Flow rate: %f' % flow_rate)
       
        # Delay
        time.sleep(5)
  
if __name__ == '__main__':
   main()

该脚本定义了一个FlowMeter()对象类,用于跟踪在其风车旋转时从传感器接收到的脉冲并计算当前流量。

每个新脉冲都会触发该pulseCallback()方法,其中每秒脉冲的速率 (Hz) 除以常数以计算以升/分钟 (L/min) 为单位的流速。这种转换在传感器的数据表中定义。该getFlowRate()方法返回当前流量。

该main()函数在脚本启动时调用,定义传感器使用的 GPIO 引脚,并启动类的实例FlowMeter()。

进入一个无限循环,每次通过时都会收集流速测量值及其时间戳并将其打印到控制台。控制循环之间延迟的time.sleep(5)语句设置为 5 秒。循环将持续运行,直到被用户取消。

在将最终的 IoT 流量计部署到河流之前,请编辑此脚本以将此睡眠时间调整为您想要收集河流测量值的频率。值 60 将每隔一分钟进行一次测量。

使用以下命令启动 Python 脚本:

流速测量值和时间戳每 5 秒打印一次到控制台:

当传感器的风车停止时,流速应为零。尝试向传感器吹气以旋转轮子并观察流速值如何变化。

按Ctrl+C停止脚本。

第 3 步:启用蜂窝连接

随着传感器的工作,下一步是将其读数发送到云端。这是通过带有 Soracom Global SIM 卡的 3G USB 调制解调器实现的,该 SIM 卡插入 Pi 和 Soracom 的 Harvest 服务。

Soracom 自己的IoT 状态机套件教程提供了有关使用 Soracom 帐户进行设置、配置 USB 调制解调器和启用 Harvest 服务的良好说明。从他们的教程中完成以下部分:

设置您的 Soracom 帐户
设置 3G USB 调制解调器
启用 Soracom Harvest
第 4 步:将数据发送到 Soracom Harvest

该flowmeter.py脚本现在可以使用额外的代码更新发送测量Soracom收获。

首先安装requestsPython 包,它允许从 Python 发出 HTTP 请求,使用以下命令:

打开flowmeter.py并将以下行添加到导入语句列表中:

main()在语句上方的函数内添加以下代码time.sleep(5):

此附加代码将时间戳和流速值包装到 JSON 字符串中,并使用 POST 请求将其发送到 Soracom 统一端点。

本教程附有一个完整的版本flowmeter.py。使用以下命令再次运行脚本:

随着 Harvest 控制台打开,您应该开始看到数据流入。流量数据绘制在图表上,每次收到新值时都会更新。

第 5 步:在启动时运行脚本

在此项目的最终设置中,Raspberry Pi 将与显示器、鼠标和键盘断开连接,并由外部电池供电。因此,Python 脚本有必要在没有用户交互的情况下自动启动。

通过编辑文件将 Pi 配置为在启动时运行脚本/etc/rc.local。使用以下命令编辑此文件:

在文件的最后一行上方添加以下行exit 0:

按Ctrl+X、Y和Enter保存并关闭文件。

flowmeter.py需要完整路径,因为 Pi 在flowmeter启动时不会在目录中。在行尾包含&确保脚本作为自己的进程运行,并且在运行时不会阻塞其他启动进程。

断开 Pi 与任何显示器、键盘和鼠标的连接,并将外部电池组插入 Pi 的微型 USB 端口。Pi 启动和 USB 调制解调器连接可能需要一些时间。连接后,打开 Soracom Harvest 控制台以查看传入数据。

组装结构
第 1 步:构建结构基础

PVC 管结构将组件固定在适当的位置,使传感器保持在水下,电子设备保持在水面上。

首先使用手锯将 PVC 管道切割成四个 15.5 英寸的部分和两个 7 英寸的部分。使用三通接头,将它们组装到结构的“H”型底座中。

使用一根 5' 英尺的 PVC 管作为插入“H”型底座中心的垂直条。

第 2 步:防水传感器

由于流量传感器将浸没在水下,因此需要保护它免受任何水损坏。其连接线的长度也需要延长,以将垂直管道向上延伸到电子设备外壳中。

首先从连接线上切断端盖。然后,使用三根 4 英尺长的跳线,将直流电源(红色)、接地(黑色)和输出(黄色)线的末端焊接在一起,从而延长它们的长度。使用小型热缩管单独包裹每个焊接连接。

全长电线的末端应分别连接到母跳线端盖,以便它们可以轻松连接到 Raspberry Pi 的 GPIO 引脚。剪下 3 根公对母跳线并将母跳线端盖焊接到三根全长电线上。用热缩管单独包裹每个连接。

使用 4 英尺长的热缩管来包裹现在从传感器出来的所有三根全长电线。确保管道一直延伸到传感器底部,有助于防止水进入传感器外壳。

将传感器连接到 3D 支架上,方法是从传感器上拧下面板螺丝,将传感器放入支架内,然后使用相同的螺丝将其连接到支架壁上。

硅胶填缝剂应放置在传感器的外观和电线开口周围,以增加防水保护。

将支架和传感器连接到垂直管道结构上,并使用尼龙扎带将延长线固定在管道上。将 3D 打印的漏斗放在传感器的嘴上。

第 3 步:电子外壳

电子外壳 3D 打印后,使用刚性导管带和 1/4" 六角螺栓和螺母将其连接到垂直管道的顶部。螺栓将穿过外壳背面的带孔。

准备好部署传感器后,将 Rasberry Pi、电池、USB 延长线和 3G USB 调制解调器放入外壳并打开 Raspberry Pi 电源。将传感器的热缩接线送入外壳底部的孔中,并连接到 Pi 的引脚。

使用 4-40 1/2" 螺钉将面板连接到外壳盒上。

该结构现在已准备好放入河中。找一个能让房屋保持在水面之上的地方,以及一个底部相对平坦的地方,这样结构才能保持稳定。

电子邮件通知
第 1 步:在 AWS 中创建新的托管用户

首先创建一个新的托管用户,该用户将被授予以编程方式访问 AWS IoT 的权限。Soracom Funnel 将通过该用户访问 AWS IoT。

打开 AWS IAM 管理控制台并单击左侧菜单中的“用户”,然后单击“添加用户”。

输入“用户名”(例如漏斗)并在“访问类型”部分选中“程序访问”,然后单击“下一步:权限”。

单击“直接附加现有策略”并在搜索框中键入“iotdata”。从结果中,检查“AWSIoTDataAccess”权限。在接下来的页面中单击“下一步:标签”,然后单击“下一步:审核”和“创建用户”。

在下一页上,将“访问密钥 ID”和“秘密访问密钥”复制到文本文件中。

第2步:获取 AWS IoT 终端节点

打开AWS IoT 控制台并单击左侧菜单中的“设置”。从“自定义端点”部分复制“端点”URL。

第 3 步:配置 Soracom 漏斗

打开Soracom 用户控制台并单击用于该项目的 SIM 卡的组名称。在“Soracom 漏斗”部分中,通过单击切换按钮以“开启”来启用该服务。

选择“AWS IoT”作为“服务”。

将“Destination”设置为“ <your_custom_endpoint> /funnel/ flowmeter ”,替换上一步复制的自定义 url(不带引号)。这是数据将被转发到的端点和 AWS 主题(漏斗/流量计)。

单击“+”按钮注册新的凭据集。

在弹出窗口中,将“凭证集 ID”设置为新 ID(例如 Soracom)并填写“描述”(例如 AWS IoT 中的 Soracom IAM 用户)。

选择“AWS 凭证”作为“类型”并将从步骤 1 复制的 AWS 访问密钥 ID 和 AWS 秘密访问密钥粘贴到相应的字段中。

单击“注册”按钮。

从“凭证集”下拉列表中,选择刚刚注册的凭证(例如 Soracom(AWS IoT 中的 Soracom IAM 用户))。

单击“保存”按钮。

第 4 步:查看 AWS IoT 中的数据

通过订阅我们在上一步中分配的主题,验证数据是否从 Soracom Funnel 转发到 AWS IoT。

打开AWS IoT 控制台并单击左侧菜单中的“测试”。在 MQTT 客户端窗口中输入“漏斗/流量计”作为“订阅主题”,然后单击“订阅主题”。

从漏斗发布到该主题的消息应该开始出现。这些消息包含来自传感器的原始有效负载,以及来自 Soracom 的一些额外元数据。

第 5 步:将数据发送到 CloudWatch

下一步是将此传入数据作为自定义指标发送到 AWS CloudWatch。CloudWatch 允许可视化指标和通知。

打开AWS IoT 控制台,然后单击左侧菜单中的“Act”。在以下屏幕上单击“创建”。

从“创建规则”菜单中,输入规则“名称”(例如 CloudWatch)和“描述”。

在“规则查询语句”中输入以下语句:SELECT * FROM 'funnel/flowmeter'。此语句将将此规则应用于发送到“漏斗/流量计”主题的所有消息。

单击“添加操作”。在下一个屏幕上选择“将消息数据发送到 CloudWatch”,然后单击“配置操作”。

在下一个菜单中填写以下内容:

  • 指标名称: flow_rate
  • 指标命名空间: flowmeter
  • 单元: None
  • 价值: ${payloads.flow_rate}

单击“创建角色”并键入新角色的名称(例如 CloudWatchRole),再次单击“创建角色”,然后使用“选择”按钮从下拉菜单中选择新创建的角色。

单击“添加操作”按钮。来自传入消息的flow_rate数据将转发到 CloudWatch。

第 6 步:设置通知

打开AWS CloudWatch 控制台,单击左侧菜单中的“指标”。在“自定义命名空间”下单击“流量计”。

点击“没有维度的指标”,然后选择“flow_rate”。CloudWatch 图表将填充所选时间窗口的流速值。可以将图表设置为自动更新,以便在流入时绘制新数据。

单击“铃铛图标”为该指标设置警报。在下一个屏幕上填写警报“名称”(例如 FlowRateAlarm)和“描述”。

“警报详细信息”部分定义度量值何时处于警报状态。对于这个项目,这意味着当 flow_rate 达到一个让用户知道的重要值时。对于此示例,选择了 1.0 的值,但可以通过查看传入数据来确定更实际的数字,以确定正常河流流量生成的流量,并将其设置为高于该数字。

在“操作”部分中,选择“新列表”并输入新通知列表组的名称(例如 cloudwatch_alarm)。选择该列表并输入您希望包含在此列表中的任何电子邮件地址。

将向这些地址发送一封确认电子邮件,以确认他们订阅通知。

单击“创建警报”按钮。

现在警报已创建,CloudWatch 将持续监控此指标的传入数据,如果它进入警报状态(例如 flow_rate >= 1.0),它将向订阅用户发送一封通知电子邮件。

如果您对此项目有任何想法、意见或问题,请在下方留言。

原文链接丨以上内容来源网络,如涉及侵权可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论