該項目演示了如何構建一個連接互聯(lián)網(wǎng)的流量計,該流量計可以連續(xù)測量河流的流量并在線向用戶提供實時數(shù)據(jù)。
該系統(tǒng)可以通過一次性設置部署到偏遠的河流,并且可以自行運行,自動收集數(shù)據(jù)而無需用戶在場。可以在整個河流中放置多個儀表以收集許多數(shù)據(jù)點。
測量數(shù)據(jù)通過系統(tǒng)的蜂窩網(wǎng)絡連接推送到云端,由 Soracom Global SIM 卡啟用,并可通過 Soracom Harvest 在線查看。AWS IoT 和 CloudWatch 服務用于在河流流量達到臨界水平時向用戶發(fā)送電子郵件通知。
河流的流速測量隨著時間流過特定點的水量。隨著降雨中的水流入和流出河流系統(tǒng),該速率會上升和下降。
測量河流的流速可以為各種目的提供有價值的信息:
水文:流速的長期趨勢可以深入了解為河流供水的流域系統(tǒng)及其隨時間的變化。
生態(tài):河水的流速決定了它是否可以養(yǎng)活不同種類的植物或動物。
洪水預警:流量峰值可以為即將到來的洪水提供早期預警,并且可以與降雨報告相關聯(lián)。
娛樂安全:實時測量可以警告獨木舟/皮劃艇運動員沿河旅行是否安全。
目前,測量偏遠河流地區(qū)的流量是一個非常實際的過程。測量員需要攜帶他們的測量設備徒步到感興趣的河流,設置它,進行測量,拆卸它,然后徒步返回。
由于收集測量值需要付出努力,因此僅對某些河流定期進行。如果沒有持續(xù)監(jiān)控,流量提供的許多洞察力就會丟失。
該項目旨在通過使流量數(shù)據(jù)更容易收集和更容易為需要它的用戶提供來解決這個問題。
如何運行
物聯(lián)網(wǎng)流量計由傳感器和電子設備組成,連接到 PVC 管道支撐結構,可部署到河流以收集流量數(shù)據(jù)。
流量計傳感器以可調節(jié)的高度連接到結構的垂直管道,該管道被浸沒在水下。電子設備包含在水外結構頂部的上部外殼中。
該系統(tǒng)采用 YF-S201 液體流量計傳感器,其中包含一個由進水旋轉的磁性風車。
隨著更多的水進入傳感器,輪子旋轉得更快,這個旋轉速度(Hz)可以用來計算每分鐘有多少升水流過傳感器(L/min),稱為流量。
注意:此流量僅表示通過傳感器本身的水升數(shù),而不是整條河流。傳感器的流量與河流的實際流量密切相關,但不是直接測量的。物聯(lián)網(wǎng)流量計僅提供傳感器的流量,并將其用作整條河流的近似值。
一個 3D 打印的支架用于將傳感器連接到 PVC 管道結構上,一個 3D 打印的漏斗將河水引導到傳感器的入口。
該系統(tǒng)的電子設備包括一個 Raspberry Pi、帶有 Soracom Global SIM 的 3G USB 調制解調器和外部電池,這些都包含在一個 3D 打印的外殼中。傳感器通過水封跨接線連接到 Pi,這些跨接線將垂直管道的長度延伸到外殼中。
Pi 運行 Python 腳本,每分鐘都會從傳感器收集流量測量值,并使用調制解調器和 SIM 卡提供的蜂窩連接將其推送到云端。
該腳本向 Soracom 的統(tǒng)一端點發(fā)出 HTTP POST 請求,該端點將數(shù)據(jù)轉發(fā)到兩個服務:Soracom Harvest 和 Soracom Funnel。
Soracom Harvest 允許對傳入數(shù)據(jù)進行輕松的實時可視化??刂婆_顯示一個實時圖表,顯示更新的數(shù)據(jù)值,因為它們流入。用戶可以監(jiān)控數(shù)據(jù)在選定的時間窗口內如何變化。
Soracom Funnel 獲取數(shù)據(jù)并通過將其發(fā)送到 AWS IoT 端點進一步轉發(fā),然后使用 AWS IoT 規(guī)則將數(shù)據(jù)推送到 AWS CloudWatch。
CloudWatch 警報配置為監(jiān)控流量何時超過臨界值,并自動向任何訂閱用戶發(fā)送電子郵件通知,讓他們知道警報已被觸發(fā)。此功能允許用戶隨時了解河流流量的重要變化,而無需實時監(jiān)控。
架構和卓越運營
物聯(lián)網(wǎng)流量計旨在解決傳統(tǒng)上需要更多動手、昂貴的設備來收集數(shù)據(jù)的問題。雖然這個原型已經(jīng)表明它可以派上用場并提供結果,但在轉向生產(chǎn)版本時還有更多的事情需要考慮。
成本:該系統(tǒng)的總成本約為 120 美元,其中最大的開支是 Raspberry Pi(35 美元)和 3G 調制解調器(60 美元)。這個價格可能會隨著批量供應而下降??紤]到使用此物聯(lián)網(wǎng)設備而不是支付測量員/工程師手動收集測量值所節(jié)省的工時,這個總成本是合理的。
可擴展性:系統(tǒng)可以根據(jù)需求擴展到更多單元。通過過渡到包含所有必要電子設備的預制電路并開發(fā)更好的預組裝管道結構,構建大量單元將變得更加容易。
如果擴展到全球運行的 1000 臺設備,Soracom 和 AWS IoT 仍可能是數(shù)據(jù)收集和分發(fā)方式的支柱。可能需要為每個用戶設置個人賬戶和訪問權限,AWS IoT 可以通過 IAM 用戶組來實現(xiàn)這一點,IAM 用戶組僅向特定用戶授予查看/編輯數(shù)據(jù)的權限。
可靠性:反映實際流量的一致和準確的測量對于這個問題很重要。需要進行更多測試以更好地了解可能影響傳感器讀數(shù)的不同影響,例如深度和河流中的位置。
該系統(tǒng)還依賴于可靠的蜂窩網(wǎng)絡。目前,如果由于網(wǎng)絡超時而對 Soracom 的請求嘗試失敗,則該數(shù)據(jù)將丟失。該工具的進一步更新將包括備份測量結果,以便在重新建立連接時將其保存并推送到云端。
安全性:物聯(lián)網(wǎng)流量計設計為無人值守,這使其物理安全面臨風險。目前,如果系統(tǒng)離線或丟失,無法確定系統(tǒng)會發(fā)生什么情況,但未來的版本可能會包含一個 GPS 模塊,該模塊包含系統(tǒng)在每次數(shù)據(jù)推送時的當前坐標。這將有助于隨時跟蹤系統(tǒng)的位置。
構建說明
以下是有關如何原型化、構建和接收來自 IoT 流量計的通知的說明。
通過首先構建一個原型電路來測試液體流量計的功能、啟用互聯(lián)網(wǎng)連接并將測量結果推送到云端,開始這個項目。接下來構建管道結構并附加組件,以便可以部署。最后,設置 AWS CloudWatch 并在出現(xiàn)關鍵流量時訂閱電子郵件警報。
這些說明假設您可以通過 SSH 或鍵盤/鼠標/顯示器設置訪問 Rasberry Pi 的終端。Pi 還必須通過 WiFi 或以太網(wǎng)連接互聯(lián)網(wǎng)以進行初始設置。
原型電路
第 1 步:設置測試電路
使用公對母跳線,從 YF-S201 液體流量計的電線到 Raspberry Pi GPIO 引腳進行以下連接:
紅色(直流電源)到引腳 1 (3.3V)
黑色(接地)到引腳 6(接地)
黃色(輸出)到引腳 7 (GPIO4)
第 2 步:測試傳感器測量值
可以運行 Python 腳本以從現(xiàn)在連接的傳感器獲取讀數(shù)。打開 Raspberry Pi 終端并輸入以下命令以創(chuàng)建并導航到Pi 桌面上將存儲腳本的flowmeter目錄:
使用 Python 的 IDLE 或其他文本編輯器,復制以下 Python 代碼并將其保存flowmeter.py在剛剛創(chuàng)建的文件夾中:
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()對象類,用于跟蹤在其風車旋轉時從傳感器接收到的脈沖并計算當前流量。
每個新脈沖都會觸發(fā)該pulseCallback()方法,其中每秒脈沖的速率 (Hz) 除以常數(shù)以計算以升/分鐘 (L/min) 為單位的流速。這種轉換在傳感器的數(shù)據(jù)表中定義。該getFlowRate()方法返回當前流量。
該main()函數(shù)在腳本啟動時調用,定義傳感器使用的 GPIO 引腳,并啟動類的實例FlowMeter()。
進入一個無限循環(huán),每次通過時都會收集流速測量值及其時間戳并將其打印到控制臺??刂蒲h(huán)之間延遲的time.sleep(5)語句設置為 5 秒。循環(huán)將持續(xù)運行,直到被用戶取消。
在將最終的 IoT 流量計部署到河流之前,請編輯此腳本以將此睡眠時間調整為您想要收集河流測量值的頻率。值 60 將每隔一分鐘進行一次測量。
使用以下命令啟動 Python 腳本:
流速測量值和時間戳每 5 秒打印一次到控制臺:
當傳感器的風車停止時,流速應為零。嘗試向傳感器吹氣以旋轉輪子并觀察流速值如何變化。
按Ctrl+C停止腳本。
第 3 步:啟用蜂窩連接
隨著傳感器的工作,下一步是將其讀數(shù)發(fā)送到云端。這是通過帶有 Soracom Global SIM 卡的 3G USB 調制解調器實現(xiàn)的,該 SIM 卡插入 Pi 和 Soracom 的 Harvest 服務。
Soracom 自己的IoT 狀態(tài)機套件教程提供了有關使用 Soracom 帳戶進行設置、配置 USB 調制解調器和啟用 Harvest 服務的良好說明。從他們的教程中完成以下部分:
設置您的 Soracom 帳戶
設置 3G USB 調制解調器
啟用 Soracom Harvest
第 4 步:將數(shù)據(jù)發(fā)送到 Soracom Harvest
該flowmeter.py腳本現(xiàn)在可以使用額外的代碼更新發(fā)送測量Soracom收獲。
首先安裝requestsPython 包,它允許從 Python 發(fā)出 HTTP 請求,使用以下命令:
打開flowmeter.py并將以下行添加到導入語句列表中:
main()在語句上方的函數(shù)內添加以下代碼time.sleep(5):
此附加代碼將時間戳和流速值包裝到 JSON 字符串中,并使用 POST 請求將其發(fā)送到 Soracom 統(tǒng)一端點。
本教程附有一個完整的版本flowmeter.py。使用以下命令再次運行腳本:
隨著 Harvest 控制臺打開,您應該開始看到數(shù)據(jù)流入。流量數(shù)據(jù)繪制在圖表上,每次收到新值時都會更新。
第 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 控制臺以查看傳入數(shù)據(jù)。
組裝結構
第 1 步:構建結構基礎
PVC 管結構將組件固定在適當?shù)奈恢?,使傳感器保持在水下,電子設備保持在水面上。
首先使用手鋸將 PVC 管道切割成四個 15.5 英寸的部分和兩個 7 英寸的部分。使用三通接頭,將它們組裝到結構的“H”型底座中。
使用一根 5‘ 英尺的 PVC 管作為插入“H”型底座中心的垂直條。
第 2 步:防水傳感器
由于流量傳感器將浸沒在水下,因此需要保護它免受任何水損壞。其連接線的長度也需要延長,以將垂直管道向上延伸到電子設備外殼中。
首先從連接線上切斷端蓋。然后,使用三根 4 英尺長的跳線,將直流電源(紅色)、接地(黑色)和輸出(黃色)線的末端焊接在一起,從而延長它們的長度。使用小型熱縮管單獨包裹每個焊接連接。
全長電線的末端應分別連接到母跳線端蓋,以便它們可以輕松連接到 Raspberry Pi 的 GPIO 引腳。剪下 3 根公對母跳線并將母跳線端蓋焊接到三根全長電線上。用熱縮管單獨包裹每個連接。
使用 4 英尺長的熱縮管來包裹現(xiàn)在從傳感器出來的所有三根全長電線。確保管道一直延伸到傳感器底部,有助于防止水進入傳感器外殼。
將傳感器連接到 3D 支架上,方法是從傳感器上擰下面板螺絲,將傳感器放入支架內,然后使用相同的螺絲將其連接到支架壁上。
硅膠填縫劑應放置在傳感器的外觀和電線開口周圍,以增加防水保護。
將支架和傳感器連接到垂直管道結構上,并使用尼龍扎帶將延長線固定在管道上。將 3D 打印的漏斗放在傳感器的嘴上。
第 3 步:電子外殼
電子外殼 3D 打印后,使用剛性導管帶和 1/4“ 六角螺栓和螺母將其連接到垂直管道的頂部。螺栓將穿過外殼背面的帶孔。
準備好部署傳感器后,將 Rasberry Pi、電池、USB 延長線和 3G USB 調制解調器放入外殼并打開 Raspberry Pi 電源。將傳感器的熱縮接線送入外殼底部的孔中,并連接到 Pi 的引腳。
使用 4-40 1/2” 螺釘將面板連接到外殼盒上。
該結構現(xiàn)在已準備好放入河中。找一個能讓房屋保持在水面之上的地方,以及一個底部相對平坦的地方,這樣結構才能保持穩(wěn)定。
電子郵件通知
第 1 步:在 AWS 中創(chuàng)建新的托管用戶
首先創(chuàng)建一個新的托管用戶,該用戶將被授予以編程方式訪問 AWS IoT 的權限。Soracom Funnel 將通過該用戶訪問 AWS IoT。
打開 AWS IAM 管理控制臺并單擊左側菜單中的“用戶”,然后單擊“添加用戶”。
輸入“用戶名”(例如漏斗)并在“訪問類型”部分選中“程序訪問”,然后單擊“下一步:權限”。
單擊“直接附加現(xiàn)有策略”并在搜索框中鍵入“iotdata”。從結果中,檢查“AWSIoTDataAccess”權限。在接下來的頁面中單擊“下一步:標簽”,然后單擊“下一步:審核”和“創(chuàng)建用戶”。
在下一頁上,將“訪問密鑰 ID”和“秘密訪問密鑰”復制到文本文件中。
第2步:獲取 AWS IoT 終端節(jié)點
打開AWS IoT 控制臺并單擊左側菜單中的“設置”。從“自定義端點”部分復制“端點”URL。
第 3 步:配置 Soracom 漏斗
打開Soracom 用戶控制臺并單擊用于該項目的 SIM 卡的組名稱。在“Soracom 漏斗”部分中,通過單擊切換按鈕以“開啟”來啟用該服務。
選擇“AWS IoT”作為“服務”。
將“Destination”設置為“ 《your_custom_endpoint》 /funnel/ flowmeter ”,替換上一步復制的自定義 url(不帶引號)。這是數(shù)據(jù)將被轉發(fā)到的端點和 AWS 主題(漏斗/流量計)。
單擊“+”按鈕注冊新的憑據(jù)集。
在彈出窗口中,將“憑證集 ID”設置為新 ID(例如 Soracom)并填寫“描述”(例如 AWS IoT 中的 Soracom IAM 用戶)。
選擇“AWS 憑證”作為“類型”并將從步驟 1 復制的 AWS 訪問密鑰 ID 和 AWS 秘密訪問密鑰粘貼到相應的字段中。
單擊“注冊”按鈕。
從“憑證集”下拉列表中,選擇剛剛注冊的憑證(例如 Soracom(AWS IoT 中的 Soracom IAM 用戶))。
單擊“保存”按鈕。
第 4 步:查看 AWS IoT 中的數(shù)據(jù)
通過訂閱我們在上一步中分配的主題,驗證數(shù)據(jù)是否從 Soracom Funnel 轉發(fā)到 AWS IoT。
打開AWS IoT 控制臺并單擊左側菜單中的“測試”。在 MQTT 客戶端窗口中輸入“漏斗/流量計”作為“訂閱主題”,然后單擊“訂閱主題”。
從漏斗發(fā)布到該主題的消息應該開始出現(xiàn)。這些消息包含來自傳感器的原始有效負載,以及來自 Soracom 的一些額外元數(shù)據(jù)。
第 5 步:將數(shù)據(jù)發(fā)送到 CloudWatch
下一步是將此傳入數(shù)據(jù)作為自定義指標發(fā)送到 AWS CloudWatch。CloudWatch 允許可視化指標和通知。
打開AWS IoT 控制臺,然后單擊左側菜單中的“Act”。在以下屏幕上單擊“創(chuàng)建”。
從“創(chuàng)建規(guī)則”菜單中,輸入規(guī)則“名稱”(例如 CloudWatch)和“描述”。
在“規(guī)則查詢語句”中輸入以下語句:SELECT * FROM ’funnel/flowmeter‘。此語句將將此規(guī)則應用于發(fā)送到“漏斗/流量計”主題的所有消息。
單擊“添加操作”。在下一個屏幕上選擇“將消息數(shù)據(jù)發(fā)送到 CloudWatch”,然后單擊“配置操作”。
在下一個菜單中填寫以下內容:
指標名稱: flow_rate
指標命名空間: flowmeter
單元: None
價值: ${payloads.flow_rate}
單擊“創(chuàng)建角色”并鍵入新角色的名稱(例如 CloudWatchRole),再次單擊“創(chuàng)建角色”,然后使用“選擇”按鈕從下拉菜單中選擇新創(chuàng)建的角色。
單擊“添加操作”按鈕。來自傳入消息的flow_rate數(shù)據(jù)將轉發(fā)到 CloudWatch。
第 6 步:設置通知
打開AWS CloudWatch 控制臺,單擊左側菜單中的“指標”。在“自定義命名空間”下單擊“流量計”。
點擊“沒有維度的指標”,然后選擇“flow_rate”。CloudWatch 圖表將填充所選時間窗口的流速值??梢詫D表設置為自動更新,以便在流入時繪制新數(shù)據(jù)。
單擊“鈴鐺圖標”為該指標設置警報。在下一個屏幕上填寫警報“名稱”(例如 FlowRateAlarm)和“描述”。
“警報詳細信息”部分定義度量值何時處于警報狀態(tài)。對于這個項目,這意味著當 flow_rate 達到一個讓用戶知道的重要值時。對于此示例,選擇了 1.0 的值,但可以通過查看傳入數(shù)據(jù)來確定更實際的數(shù)字,以確定正常河流流量生成的流量,并將其設置為高于該數(shù)字。
在“操作”部分中,選擇“新列表”并輸入新通知列表組的名稱(例如 cloudwatch_alarm)。選擇該列表并輸入您希望包含在此列表中的任何電子郵件地址。
將向這些地址發(fā)送一封確認電子郵件,以確認他們訂閱通知。
單擊“創(chuàng)建警報”按鈕。
現(xiàn)在警報已創(chuàng)建,CloudWatch 將持續(xù)監(jiān)控此指標的傳入數(shù)據(jù),如果它進入警報狀態(tài)(例如 flow_rate 》= 1.0),它將向訂閱用戶發(fā)送一封通知電子郵件。
-
互聯(lián)網(wǎng)
+關注
關注
54文章
11073瀏覽量
102614 -
流量計
+關注
關注
10文章
1455瀏覽量
53361
發(fā)布評論請先 登錄
相關推薦
評論