費文緒/編譯
安裝家用無線水表
費文緒/編譯

●注意對Arduino微控制器和樹莓派(Raspberry Pi,基于Linux系統的單板機電腦)的使用。
我曾經住過的加利福尼亞州干旱嚴重,幸虧我現在居住的北卡羅來納州更為濕潤,不過即便這里,也曾有數年時間缺水,要求人們節約用水。
大多數人都樂意遵守這樣的要求,但是,當你的用水信息只是通過每月一次的水費單來了解時,節約用水并不是那么容易做到。當然,你可以通過定期關注你家的水表讀數來更精細地跟蹤用水量,但是誰能堅持這么做呢?所以,我自己組裝了一個用水量監測器,能實時顯示我家的用水量。
我的監測系統不需要改建水管,而且通過我家的無線網傳輸信息,所以,我能在家中任何一臺聯網的設備上看到用水量。現在,當我十幾歲大的孩子們在淋浴中恣意揮霍用水時,我就可以用定量的測量數據訓斥他們。
為了測量市政供水流量,我使用了一個數字指南針(一個2軸磁力計),是我以前從電子產品零售商SparkFun Electronics購買的,作為定向儀使用。現在SparkFun不再出售該組件,但是你只需花更少的錢(15美元),就能買到一個3軸磁力計,和以前的2軸磁力計一樣好用甚至更好用。
因為機械水表的工作方式,磁力計在這里很有價值。在實際中,為了把水表的齒輪與水隔離開來,轉子通常連到分離室的磁鐵中,水流通過該分離室流動。當水轉動轉子時,這塊磁鐵會轉動水表齒輪箱中的另一塊磁鐵。如此一來,這些成對的磁鐵就在水表周圍形成了一個磁場,磁場會隨著水流快慢而變化。
我推斷,由磁耦合機制導致的磁場變化會在水表外部提供一個強烈的信號。而實際上,磁信號相當微弱,很可能是由于如下幾個原因:水表的鋼鐵外殼可能屏蔽了水表的內部磁場,而且水表內部的移動零件很可能包括各種鋼鐵成分,會以更高的頻率產生以假亂真的磁場。至少我是這么懷疑的,不管怎么說,我不得不處理一片混亂的信號。
為了遠程監測流過我家水表的水流,我在水表上附加了一個磁力計,并用一個Arduino微控制器讀取和處理原始數據。Arduino通過電線向樹莓派發送數據,樹莓派會生成一個簡單的網頁顯示用水量,我能在我家的Wi-Fi網絡中訪問該網頁。
所以我面臨的第一個挑戰是給一個連到磁力計上的Arduino編程,把充滿噪音的磁信號轉換成水的流速。我原本構想的是利用傅立葉變換挑選出與水流速相對應的主頻率,但是我反而選擇了自相關,也就是,程序把信號的短樣本乘以其時延樣本,然后進行求和。為了找到主頻率,Arduino的代碼增加了兩個樣本之間的時延,然后在求和結果中尋找一個峰值。這種算法所需的運算量少得多,似乎對于噪聲和諧波相當管用。
對花園里的水管進行的測試顯示,這樣安排能辨別潺潺流水和噴涌而出的水之間的流速不同。所測水流速的低值受限于Arduino收集數據的時間(數據處理之前的時間)。我設定的時間大約是3秒鐘,這讓我能測量小到滴水的流速。但是在監測最高的水流速方面(比如當我使用一個沒有連接軟管的室外水龍頭時),我的系統就夠嗆了。
你可能以為高流速會產生一個比低流速更易測量的信號,但是事實并非如此。當水流速真的很高時,水表內部的磁鐵旋轉速度會超過磁力計的最快采樣速度,導致混疊現象。結果,超過某個流速之后測量到的數據其實是無效的。
不過,由于很少遇到水管爆裂的情況,我家還沒有人的用水速率會達到或超過那個閾值,所以我們決定不擔心這個限制,繼續研究如何進行信息通信。同樣涉及的問題是如何為我放在水表里的Arduino和磁力計供電,而水表跟我的房子是分離的。
解決方法是用一根15米長的四芯電話線,兩根芯把9伏直流電通到Arduino,另兩根芯把數字信號輸出到樹莓派(利用SparkFun的另一種電板轉換到RS-232電壓電平),我把樹莓派放在門廊上一個常用的交流電源插座旁邊。從那里,很容易讓兩個“壁瘤”(即壁式電源)給樹莓派和Arduino供電,而且樹莓派離我的路由器足夠近,能聯上我家的無線網。
我用Python語言(一種面向對象、解釋型計算機程序設計語言)給樹莓派編程,生成一個單獨的網頁,利用Flask框架創建網頁應用程序。網頁顯示了水流速和總用水量,每10秒鐘更新數據,并且有一個按鈕讓用水量計數器復位清零。
我尚未嘗試使我的設置標準化,從而使流速以合理的單位顯示,比如每分鐘多少升。所以,總用水量的數字現在也是以任意單位給出的。但是,Arduino和樹莓派聯合起來完成了一件了不起的事情,那就是告訴我相對的水流速。現在我們全家可以在淋浴時互相比賽,看看誰用水最少。
[資料來源:IEEE Spectrum][責任編輯:彥隱]