注意对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
责任编辑 彦 隐