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