費(fèi)文緒/編譯
安裝家用無線水表
費(fèi)文緒/編譯

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