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