用水量智能监测仪

用 Arduino Nano 实现的洗澡用水量监测仪

Cherry

喜欢

4205
浏览
2
喜欢

> 更多图片

项目状态:已完成
开放度:公开
所属分类:电子
发布时间:2019-08-05
最近更新:2019-08-29

详细说明


智能家居系列已经出过不同的项目。例如帮你管理衣物的《基于RFID的衣柜管理系统》,一手操作的《炫酷的「灭霸手套」家电控制终端》,看家护院的《猫咪走开:计算机视觉喷水驱猫装备》。本期我们来做一个环保节能的项目——喷头水量监测仪。在喷头上安装流器传感器,通过记录用水量、成本等细节,鼓励人们节约用水、提高用水效率。

项目将显示每次洗澡所用水量,水的流量以及水费等数据,是个实用性很强的项目,制作思路也非常严谨。这个功能当然也可以被用在其他需要用水的地方。

链接表


文件库

Lid.stl
[146884 Bytes at 2019-08-14, 31 次下载]

Box.stl
[241684 Bytes at 2019-08-14, 27 次下载]

Shower_Monitor.ino
[4655 Bytes at 2019-08-16, 49 次下载]

Lid.f3d
[167017 Bytes at 2019-08-17, 17 次下载]

Shower_Enclosure_2.obj
[340275 Bytes at 2019-08-17, 20 次下载]

Box.f3d
[62828 Bytes at 2019-08-17, 19 次下载]



教程

组件清单
  • Arduino Nano × 1
  • 流量传感器 × 1
  • 液晶屏显示器 × 1
  • 升压转换器 × 1
  • 锂电池充电器 × 1
  • 防水开关 × 1
  • 防水按钮 × 1
  • M3 螺丝 × 若干
  • M3 螺母 × 若干
  • 铜锣柱 × 4
  • 铜锣柱带螺栓 × 4
  • 3.5mm 母头插座 × 2
  • 3.5mm 公头插头 × 1
  • 3.5mm 3英寸电缆组件 × 若干
  • USB电缆组件 × 若干
  • 1/2英寸 NPS 母对母连接器 × 1
  • 500mAh 3.7V 锂电池 × 1
  • 烙铁×1 × 1
  • 焊锡 × 1
  • 线 × 若干
  • 钳子 × 1
  • 双面胶 × 1
  • 十字螺丝刀 × 1
  • 3D打印机(可选) × 1

材料清单


Arduino Nano × 1
流量传感器 × 1
液晶屏显示器 × 1
升压转换器 × 1
锂电池充电器 × 1
防水开关 × 1
防水按钮 × 1
M3 螺丝 × 若干
M3 螺母 × 若干
铜锣柱 × 4
铜锣柱带螺栓 × 4
3.5mm 母头插座 × 2
3.5mm 公头插头 × 1
3.5mm 3英寸电缆组件 × 若干
USB电缆组件 × 若干
1/2英寸 NPS 母对母连接器 × 1
500mAh 3.7V 锂电池 × 1
烙铁×1 × 1
焊锡 × 1
线 × 若干
钳子 × 1
双面胶 × 1
十字螺丝刀 × 1
3D打印机(可选) × 1

3D 打印外壳

外壳的防水处理应该是这个项目最难的部分。因为节水装置要安装在喷头旁,必须防潮以及偶尔飞溅的水花。你可以有两种选择,自己定制一款 3D 打印外壳或者直接买现成的外壳。我选择自制外壳。


使用 Fusion 360 软件对外壳进行设计。3D 打印文件请在项目文件库中下载。https://make.quwj.com/project/137
所有材料 100% 填充。

外壳底部:三个圆形孔用于安装两个母头 3.5mm 的插孔和一个开关。

外壳盖子:一个 16mm 的孔用于瞬时按钮,一个矩形窗口用于安装屏幕,四个孔用于固定屏幕以及角落上的另外四个孔用于固定外壳的盖子。使用 3M 螺丝。

用于安装屏幕的矩形窗口需要添加防水薄膜防止水分从缝隙中流入。如果你使用的是透明盖子的外壳,则不需要此步骤。

防水薄膜的尺寸大约为 5mm 厚,27x77mm 大的透明塑料矩形。安装时要修剪一下边角,以便不妨碍四周的孔。用强力胶水将防水薄膜粘贴在窗口上。
温馨提示:胶水封口时,用小风扇帮助吹干,最后静置十二个小时,确保它完全干燥。

安装 LCD 屏幕

液晶显示器是 16x2 字符显示器,支持 I2C,接线很简单,两根电源线和两根信号线。

使用了四个 10mm 的铜锣柱来安装屏幕。每个铜锣柱的一端是公头螺丝,另一端是母头螺丝。如图所示逐步安装。
1、将公头螺丝穿过 LCD 并用 M3 螺母柠紧。

2、用四个 M3 螺钉将支座的一端固定在外壳的盖子上。
3、固定好螺柱。注意不要过度拧紧螺丝,以免塑料盖变形。安装 LCD 时,要注意方向,要将带有十六根排针的放于顶部。

安装瞬时按钮

采用的是瞬时按钮,镀铬材质并带有橡胶圈防止湿气通过螺丝进入外壳。

如图所示安装按钮。
1、松开螺母,但橡胶圈要套在上面。

2、将按钮插入盖子上的孔中,然后从背面拧紧螺母。注意不要过度拧紧螺母,防止橡胶圈被破坏而起不到防水的作用。

电源和充电电路

这一步要将电池组件放在一起。包括电池,主开关,锂电池保护板和升压转换器。使用 3.7V 1500 mAh 的单节锂电池,它的大小刚好与外壳匹配。你也可以使用 18650 电池,不过外壳的大小要进行调整。

1、将电池焊接到 TP4056 充电板上。将 JST RCY 连接器焊接到电池和充电器(此步骤可选)。焊接时请注意电池的正负极性,确保安装正确。

2、将电线从充电器的正极输出端口(位于正极电池线旁边)焊接到升压转换器的正极输入端口。然后将负极输出(位于负极电池线旁边)的电线焊接到主开关的公共(中心)针脚。最后,将电线从开关的常开引脚焊接到升压转换器的负极输入。如果将万用表连接到升压转换器的输出并打开主开关,则会显示电压。

3、Arduino、LCD 屏幕和流量传感器都需要 5V 电源,所以升压转换器的输出设置为 5V。使用螺丝刀转动电位器上的按钮来调整。打开主开关,连接电池,让万用表连接到升压转换器的输出,慢慢转动电位器,直到输出读数为 5V。

4、使用 3.5mm 耳机插座用于充电,避免每次打开外壳。将连接器插入外壳最底部的孔中(因为充电的插头,大部分时间会被拔掉,为了防止水溅到里面,孔必须在下方)。安装锁紧垫圈并拧紧螺母后,将两根电线分别焊接到连接器上的“头”和“地”线上。

5、连接器的引脚分布如图所示。将“地”线的另一端焊接到充电器的负极输入端口(在微型 USB 端口旁)。将“头”的线焊接到 USB 端口另一侧的 +5V 焊盘上。不使用充电器上的 USB 端口,因为不能保证防水。

制作充电线



如图所示,自制一根电源适配器,使用一根带有 USB A 插头的线和一根带有 3.5mm 插孔的线,最后将 3.5mm 音频插孔作为充电端口,USB A 作为插头。
1、处理 USB 线。从白色电线上剥下白色线管,露出红线和黑线,然后剥开红线和黑线的绝缘层。有些 USB 线里面有四根线:红线、黑线、绿线和白线。绿线和白线用于数据传输,可以不用管。

2、将 3.5mm 插头连接到 USB 线上。将 USB 的红线连接到中间的焊接脚上,黑线连接到接地端的焊接脚上。


流量传感器



1、流量传感器的工作原理:
流量传感器十分简洁、小巧且防水。传感器带有一个转子组件,根据水流的大小而转动。转子组件上带有磁铁。在传感器的外部带有一个小型 PCB 板并附带一个电阻器、一个霍尔效应传感器。每当磁铁经过霍尔效应传感器时,就会高低切换。也就是说,每当转子组件旋转时,它在 5V 和 0V 之间切换。
为了读取传感器,将红线连在 +5V 上,将黑线连到负极上,从黄线读取数字信号。

如图所示,流量打开时,信号的变化。起初信号始终为零。当流量开始时,脉冲频率快速上升并趋于稳定。
编写程序时需要注意,根据数据显示,传感器每升输出450个脉冲。

2、流量传感器接线
流量传感器配有三针 JST-XH 连接器。由于连接器的导线太短并且带有容易引起短路的暴露点,所以要连到一个带有 3.5mm 音频插头的线上。大约三英寸长,是镀锡线,易于焊接。

打开流量传感器盖子取出电路板,用烙铁加热三根电线并将它们分别焊接到三根电线上。

再将 3.5mm 音频电线焊接到焊盘上。按照电线的颜色来焊接。+5V 在顶端,信号在环上,接地线在地上。与充电端口的设置相同。如果你不小心将充电器插入传感器端口,也不会对设备造成伤害。

3、安装流量传感器

取下喷头,将流量传感器与喷头导管相连,由于传感器两端都是公头,需要制作一个母对母联轴器。用1/2英寸黄铜管制作一个联轴器,其他材质亦可(确保管道与传感器端口的尺寸相匹配)。

将联轴器的一端与流量传感器相连,另一端与管道相连。流量传感器有个箭头代表水流流动的方向。确保不要反向安装,否则测量结果会不准确。最后,将喷头安装到流量传感器的末端。

安装时,为防止漏水,管道之间可以缠绕生胶带。

将 Arduino 安装到电路板


1、取一块 1×2英寸的矩形电路板,将 Arduino Nano 安装到电路板中间并标记了针脚穿过的位置。

2、取两个母头针头,每个带十五个针头。将其焊接到电路板上。Arduino 可以移除便于编程。


注意标记 Arduino USB 端口的方向,以同样的方向插入到电路板上。

组装


组件连接方法如图所示。

1、切割了一些公头排针并将它们焊接到电路板的 +5V 和接地导轨上。再焊接两个排针分别连接到 Arduino 的 A4 引脚和 A5 引脚。使用母对母跳线连接 LCD 屏幕。
2、将升压转换器输出端口的两根线分别焊接到 +5V 和接地导轨上。为 Arduino、LCD 和流量传感器供电。切割两根电线并将它们连接到按钮的端口上。一根电线接到地线,另一根线接到数字引脚 3。

3、焊接流量传感器。由于传感器上已经安装 3.5mm 插头,只需要再安装一个 3.5mm 的母头插孔。首先焊接了三根电线,每一根都标记好。然后将插头插入外壳并用螺母固定到位。将地(sleeve)焊接到接地端,头(tip)焊接到 +5V,环(ring)焊接到数字引脚 2。我将数字引脚 2 和 3 分别连接到按钮和流量传感器,因为它们是中断引脚,易于编程。

4、固定 LCD。需要四根母对母的跳线。将“Vcc”引脚连接到 +5V,将“Gnd”引脚连接到接地端,将“SCL”引脚连接到 A5,将“SDA”引脚连接到 A4。为了使 LCD 屏幕更好的与外壳相吻合,需要向后弯曲引脚。操作时需要小心处理,不要重复弯曲引脚。

Arduino 编程


通过编程实现以下几个功能:
1、LCD 第一行显示水量的总升数,第二行显示水的总成本或流速。
2、打开喷头时,切换按钮时可以别分显示成本和流速。
3、喷头关闭时,按钮清除所有数据并重置屏幕。
4、使用中断程序读取传感器,避免计数误差。
5、更新屏幕时,只更新已改变的值,而不是每次刷新整个屏幕(这会导致闪屏)。

该程序遵循一个简单的结构。通过使用 millis() 函数,创建一个延迟,但不会停止程序的执行。请点击参考这个教程https://www.arduino.cc/en/tutorial/BlinkWithoutDelay ,这是一个关于不使用 delay() 函数的情况下闪烁 LED 的案例。

Arduino 打开后,millis() 函数将返回其毫秒数。通过创建变量“previousMillis”并减去 Millis() -previousMillis(),就可以看到 previous Millis 更新用的时间。
如果希望每秒发生一次,可以编写以下代码:

if((millis() - previousMillis) >= 1000){
    previousMillis = millis();
    toggleLED();
}

这将帮助检查 millis()(当前时间)和 previous Millis(最后一次)之间的差异是否大于或等于 1000 毫秒。如果是,将 previous Millis 设置为当前时间。然后再进行其他步骤。

在该项目中,接下来切换 LED。然后退出这段代码并完成 loop() 函数的其余部分,然后再回到开始并重复。使用这种方式比简单 delay() 函数要好。因为 delay() 在指令之间设置了时间间隔,但没有考虑执行 loop() 函数中的运行其他指令所花费的时间。如果你要做的事情比闪烁 LED 更费时,例如更新 LCD 屏幕,那么它所花费的时间是不可忽视的并且运行几个周期之后它会累积。如果你准备更新时钟上的 LCD 屏幕,它将会出现延迟。

整个程序的结构介绍完毕,现在可以插入指令。请认真查看流程图。每一段 Arduino 代码都有说明,请认真阅读。相关文件请在项目文件库中下载。
https://make.quwj.com/project/137
因为每个城市的水费存在差异,请根据事情情况进行更改,修改每升水的成本。在本市水费每升为0.2523¢。请自行更改:

const float COST_PER_LITRE = 0.2523; // cost per litre, in cents, from city website

如果你选择计量水的单位是加仑而不是升,请将所有“LCD.print()”行中的“L”或“L/s”更改为“G”或“G/s”。然后删除以下行:

const float CONVERSION = 450.0; // keep this uncommented for litres

并取消注释这一行:

const float CONVERSION = 1703.0; // uncomment this and delete the line above for gallons

你会注意到“¢”字符,我不想使用美元,因为大多数情况下成本会显示为“$ 0.01”或更低。因此,我自定义一个特性。以下字节数组用于表示此符号:

byte cent_sign[] = {
  B00100,
  B00100,
  B01111,
  B10100,
  B10100,
  B01111,
  B00100,
  B00100
};

创建此数组后,必须“创建”并存储这个特性。

lcd.createChar(0, cent_sign);

完成后,打印自定义特性,使用以下行:

lcd.write(byte(0)); // print cents sign (¢)

显示屏最多可包含8个自定义特性。了解更多信息:
https://www.arduino.cc/en/Reference/LiquidCrystalCreateChar
同时使用在线工具:
https://maxpromer.github.io/LCD-Character-Creator/
它帮助你使用图形界面绘制自定义特性并自动生成自定义字节数组。

封闭外壳

到目前为止,项目快要完成。将所有电子设备放入壳中并合上外壳。

1、取四根 30mm 连接的铜螺柱。我用四个 M3 螺丝将其固定到外壳底部的孔中。

2、检查所有电子设备是否固定好。将充电器和升压转换器连接到带有双面胶的盖子上。
3、在两个 3.5mm 插孔的外部的金属周围缠上一些胶带,确保连到连接器上不短路。

4、将 Arduino 安装至侧面的左下角,USB 端口朝右。使用双面胶将电池固定在 LCD 屏幕下方,朝向外壳底部。

5、所有组件安装好后,用四个 M3 合上外壳。

测试


1、将 3.5mm 连接器插入流量传感器。再打开设备请进行操作。
2、打开主电源开关。没有水流入时,除了清除总数和清屏外,前板按钮不会执行任何操作。默认总数为零,按钮不会执行任何操作。

3、如果打开喷头时,总量就会开始增加。默认情况下,会显示成本。如果按下前板按钮,水的流量将显示在最后一行。按下前板按钮将切换显示流速和成本。关闭喷头时,按下前按钮将重新测量并清除屏幕。

注意事项

1、如何安装设备将取决于你浴室的布局。可以放置在浴室的铁架上,如果没有可以使用吸盘,但只适合于表面光滑的外壳。
2、故障排除
屏幕打开,背光关闭——确保跳线安装在 I2C 模块侧面的两个引脚上。
屏幕空白,背光打开——通过 I2C 扫描仪 https://playground.arduino.cc/Main/I2cScanner/ 检查 I2C 地址是否正确。
屏幕打开,数值为零——通过测量引脚 2 上的电压来检查传感器是否有信号。如果没有信号,请检查传感器是否连接正确。
屏幕空白,背光关闭——检查 Arduino 上的电源的 LED 是否亮起,并检查屏幕是否有电。
屏幕闪开,然后一切都停止——你可能将升压转换器的电压设置得太高(组件无法承受超过 5V 的电压)。
设备工作,数值不正确——确保你使用的流量传感器具有相同的转换系数,即每升450个脉冲。不同的传感器具有不同的值。

改进方向

目前,该软件运行良好,但还可以添加不同用户(如家庭其他成员,室友等)的能力。该设备将存储每个人的统计数据(总水量和淋浴总数)并显示每个人的平均用水量。这可以鼓励更多人节约用水。

1、添加安装 EEPROM,Arduino 的内置非易失存储器。这样即使在设备关闭后也可以保留数据。我们可以创建一些特定的电子表格,通过查看数据并绘制成图形,这样就可以更清楚明了的看出,一年中人们哪个季节更频繁洗澡和用更长的时间沐浴。
2、添加电池指示器。目前,设备需要充电的唯一指示是电池管理器板切断电源。连接额外的模拟输入以测量电池电压非常的简单。由于电池电压始终小于 5V,不需要安装分压器。