虽然能源价格每天都在上涨,但与天然气和电力相比,水的价格(仍然)适中。然而,节约用水是有充分理由的,例如,当您意识到淋浴时会使用大量热水并且加热水会消耗能源时。换句话说:每天都有大量的能量被冲走。
虽然您可以在仪表本身上看到用水量,但它并不能告诉您淋浴或冲马桶或浇灌花园里的植物所用的水量。
在互联网上,您可以找到几种出售的水表(有时价格不菲),也有一些 DIY 水表的出版物。这些 DIY 设计为制作提供了很好的指导,但始终基于设计师的特定知识、技能和可用手段。
这就是为什么我开始这个项目是为了自己设计和建造一个智能水表,当然要考虑到其他人已经发布的解决方案和信息。感谢开源社区。
这里描述的设计自然也是由我自己可用的手段和技能驱动的,但我希望它可以帮助您构建自己的版本,或者至少它可以激发您进行自己的设计。
智能水表的设计基于以下要求:
这些要求是开发完整智能水表的基础,因此产生了以下硬件产品:
嵌入式软件已使用 ARDUINO IDE 进行编程并闪存到 ESP32 微控制器,内置于上述外壳中,该外壳只是作为现有水表的夹子制成。
该项目的一个基本要素是使用 BLYNK 作为 IOT 服务器。
使用 Blynk,该设备连接到 Internet,并创建了一个 Web 仪表板以及在手机上使用的仪表板。因此,智能水表可以在世界任何地方进行监控。
在 PC/笔记本电脑或平板电脑上生成的 Blynk 仪表板示例如下所示:
为了在手机上使用,创建了以下仪表板:
在这两种类型的仪表板上,可以观察到以升/分钟为单位的瞬时水流以及目前使用的以升为单位的水量:
如果您不在家并且有水流,可以生成警报,作为平板电脑或手机上的推送通知:
也可以在 Blynk 中进行自动化,例如当今天的用水量超过每日平均值时发出警告(通过将年总消耗量除以 365 减去假期来计算):
我项目中使用的现有水表是SENSUS 620型号,如下图:
该模型最显着的特点是:
旋转表盘上的金属板是这个项目最重要的项目,因为它开启了在设计中使用以下传感器的可能性:
这是一款能够在距离顶部最大 8 毫米处感应金属的传感器。
它最重要的特点是:
我在自行设计的 3D 打印支架中构建传感器。支架可以放在现有水表的“2根”顶部。对于初始实验,传感器连接到带有 Mini ESP32 TTGO T7 V1.3 的面包板设置。
一个重要方面是传感器与旋转金属板的正确对齐。为此,支架设计有一个槽,可以将传感器定位在支架内。为了正确的检测行为,传感器不应正好位于旋转板上方。
传感器的轴心应稍微偏离升数刻度盘的旋转轴:
此图在 Fusion360 中制作,构成传感器支架的基础草图。
设计的 3D 打印结果如下所示:
为了测试正确的定位,可以将传感器连接到 5V DC 并监控当升表盘的金属部分从下方通过时传感器顶部的红色 LED 是否闪烁。
下图显示了智能水表使用的项目:
不可见的是带电缆的 5V USB 适配器。应切割焊板以适合 3D 打印外壳。
水表设备将通过 Mini ESP32 微控制器 (MCU) 的板载 Wi-Fi 功能持续连接到互联网。因此,在此应用中使用电池并不是一个非常实用的解决方案。传感器和 MCU 的功率要求很低,因此使用 1A(最大电流)的 5V DC USB 充电器绰绰有余。在测试期间使用连接到 USB 充电器的简单 USB 功率计显示,在正常情况下电流低于 10 mA。在通过 WiFi 测量和传输数据流期间,在 20mA 和最大 50mA 之间会有短暂的波动。
该系统的主要元件是 ESP32 微控制器 (MCU)、接近传感器和 5V 电源。
蓝色 LED 用于指示与最近的接入点 (AP) 的 Wi-Fi 连接状态。红色 LED 用作开机指示灯,黄色 LED 将指示传感器何时被触发。
除 5V 充电器外,所有电子设备都将构建在 3D 打印外壳内。外壳有一个开口,用于将微型 USB 插头连接到 MCU,以便在需要时修改软件。
智能水表使用以下材料:
电子设计如下图所示:
上图是使用 EasyEDA 制作的。
请注意,ESP32 的管脚布局,如上图所示,与实际不同。它已被修改以使图表更易于理解。实际管脚分配如下图所示:
请注意,引脚 27 实际上是 GPIO27(而不是打印的 GPIO17)
用于使用 ARDUINO IDE 测试和构建软件的面包板设置如下图所示:
仔细看看迷你 ESP32:
让我们仔细看看结合光电耦合器(PC817)的电感式接近传感器LJ18A3-8ZBX(检测金属或不检测金属)金属传感器。
威廉希尔官方网站 图的相关部分如下所示。
如果没有金属检测,传感器的数据输出将为LOW ,这意味着在 PCF817 光耦合器内部,IR 二极管将不会辐射,因此 IR 接收“晶体管”将不会导通。由于 GPIO 04 使用“上拉”电阻进行编程,因此 ESP32 MCU 上运行的固件会将 GPIO 04 视为高电平。
当有金属检测时,会发生相反的过程。换句话说,当水表中的刻度盘顺时针旋转时,GPIO 04 的状态会从 HIGH 变为 LOW,然后过一会儿又回到 HIGH。
可以使用特定的 Arduino 代码以微秒为单位测量两次转换之间的持续时间。该持续时间取决于刻度盘的旋转速度,因此是瞬时水流(流速)的量度。
此属性可用于确定以升/秒或升/分钟为单位的瞬时水流量!
当然,同时可以通过计算 GPIO 04 从 HIGH 变为 LOW 的次数来测量用水量(以升为单位)。
这种方法有一个问题,那就是当表盘停止旋转,传感器下方的金属板时,GPIO04 保持低电平。
幸运的是,这可以在软件中解决。
同时,光耦有助于解决传感器数据输出端5V高电平的问题。当直接连接到 ESP32 GPIO 引脚时,5V 会立即炸掉该 GPIO。光耦合器将 5V 电平降至 3.3V,可由 GPIO 引脚(使用内部 PULLUP 编程)处理。
另一个需要注意的方面是 RST 引脚和 GND 之间的 10uF 电容。当将新代码从 PC 上的 Arduino IDE 刷新到 ESP32 时,这将启用启动过程(无需按下其板载启动按钮)。
可焊接原型板 (5 * 7 cm) 可安装在外壳内:
面包板上的组件被转移到一个小的(5 * 7 厘米)单面原型板上,然后安装在 3D 打印外壳内。
然后用 2 个螺钉将外壳和传感器支架固定在一起,并定位在现有水表的 2 个短柱上。
该项目的关键要素是使用 BLYNK 作为物联网服务器。
使用 Blynk,您可以将您的设备连接到 Internet,并创建移动和 Web 仪表板,以便从世界任何地方控制您的设备。
设备通常是 ESP32、Arduino 等微控制器 (MCU)。它们可以使用 Wi-Fi 连接到 Internet。您可以将传感器和执行器连接到此 MCU,并使用 Blynk 远程监控或控制它们。
如果您是 Blynk 的新手,则需要创建一个 Blynk 帐户才能将其用于此项目。免费的 Blynk 帐户使您可以使用其基本功能和最多 2 个在线设备(这对于本项目中的应用程序来说已经足够了)。
事实上,你可以用 Blynk 做一些令人惊奇的事情,它有很好的文档记录,甚至还有一个示例代码生成器可以帮助你快速入门。
成为有经验的用户后,有可能以合理的费用获得很多额外的功能。
此后,您应该对仪表板上的模板、设备、数据流和小部件之间的关系有更多的了解。
复制模板 ID、设备名称和身份验证令牌并将数据存储在临时 TXT 文件中,保存此文件以备后用。
现在打开为此项目提供的 Arduino 草图,并在创建自己的模板时填写前 3 行代码,其中包含从 Blynk 获得的日期:
#define BLYNK_TEMPLATE_ID "Own TMPL-code" // put here your own template code as obtained from BLYNK
#define BLYNK_DEVICE_NAME "My Smart Watermeter" // put here the name of your own device
#define BLYNK_AUTH_TOKEN "My template token code" // put here your TOKEN code
此后,Arduino 中包含以下库:
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
接下来,您必须在 Arduino 草图中填写以下几行:
char auth[] = BLYNK_AUTH_TOKEN; // variable using the above defined TOKEN code specific to your device
char ssid[] = "my WIFI"; // your own WiFi credentials
char pass[] = "my password"; // Set the password of your own WiFi, set as "" for an open netwerk
下表给出了为您的智能水表制作的数据流的数据,这些数据与 Arduino Sketch 中使用的代码相匹配。
必须先定义这些数据流,然后才能开始使用自己的 Web 仪表板版本。
下面是我为自己的智能水表创建的仪表板示例。我没有找到制作仪表板副本并将其作为文件提供的方法,因此这是您必须自己完成的工作。习惯 UI 需要一些时间,但经过一段时间的使用后,您会发现制作漂亮的仪表板实际上是多么容易(您可以在世界任何地方的笔记本电脑或平板电脑上看到) )。在这里您可以找到制作自己的仪表板所需的所有信息:https ://docs.blynk.io/en/getting-started/template-quick-setup
示例 Web 仪表板。
移动仪表板示例
为了在手机上使用,Blynk 中还有另一个工具“Mobile Dashboard”,它使您能够创建一个适合手机小显示屏的漂亮仪表板。这个工具使用起来有点困难,但是经过一段时间的演奏,您将能够获得良好的结果。
在 Blynk 中,还可以进行“自动化”,例如,可用于向您的手机发送推送通知和/或向您在 Blynk 个人资料中设置的电子邮件地址发送电子邮件。例如,如果在 Web Dashboard 中设置了离开家的开关按钮时检测到水流。
推送通知示例
或者这个:
示例电子邮件
现在是时候仔细看看 Arduino Sketch。
使用以下常量:
const int Liter_count_Pin = 4;
const int B_LEDPin = 27;
const int Or_LEDPin = 25;
float Flowrate_factor = 288330.00;
前 3 个用于将所需的 GPIO 引脚分配给命名参数。Flowrate_factor 是一个数字,用于计算以升/秒或升/分钟为单位的正确水流量。正确校准后,需要调整此数字。这是如何完成的,将进一步解释。
接下来定义以下全局变量:
int LitCount = 0;
int PastMinuteUse = 0;
int PrevLitCount = 0;
int Stopcount = 0;
float FlowLitPerSec = 0.00;
float FlowLitPerMin = 0.00;
int UpTimeMin = 0;
double UpTimeHr = 0.00;
double UpTimeDay = 0.00;
int DayCount = 1;
int TodayUse = 0;
int PastDayUse = 0;
int PrevDayLitCount = 0;
int PastYearCub = 0;
boolean WaterFlow_state = false;
boolean Home = true;
unsigned long Count_Duration = 0.00;
BlynkTimer timer;
Arduino Sketch 中列出的注释更详细地进一步阐明了这些变量的目的和含义。
最重要的变量是最后一个变量:“ Count_Duration ”,它将保持“ Liter_count_Pin ”变为“ LOW ”和再次返回“ HIGH ”之间的时间(以微秒为单位)。
这个测量的时间在草图中用于计算以升/秒为单位的瞬时水流。这是一种独特的方法,因为它可以即时测量水流量,从而计算“ FlowLitPerSec ”和“ FlowLitPerMin ”的值。
同时,当检测到从 HIGH 到 LOW 时,将通过将变量“ LitCount ”增加 +1 来计算一升水。
接下来,将创建一个 Blynk Timer 对象:
BlynkTimer timer;
这似乎是一个简单的陈述,但实际上它是 BLYNK 巨大优势的关键,即能够为许多不同的功能创建单独的计时器。
在此草图中,以下计时器用于以下功能:
timer.setInterval(10000L, MEASUREWATER); // Set the function MEASUREWATER to excute every 10 seconds
timer.setInterval(60000L, SendPeriodicWaterUse); // Set the function SendPeriodicWaterUse to excute every 60s
timer.setInterval(86400000L, SendDailyUseData); // Set the function SendDailyUseData to excute every 24 hours
函数“ MEASUREWATER ”每 10 秒调用一次,同样,函数“ SendPeriodicWaterUse ”每 60 秒调用一次,函数“ SendDailyUseData ”每 24 小时(或 86400000 毫秒)调用一次。
在每个函数中,许多全局变量都会收到一个新值。这些变量被分配给所谓的“虚拟引脚”编号,例如“ LitCount ”的“ V5 ” ,然后发送到 BLYNK 云进行定期更新。
此功能是草图中最重要的功能。它检测是否有水流,以升/秒和升/分钟为单位计算流量,并在云端设置“不在家”指示器时触发“水警报”。
函数的第一部分,负责升数和流量计算:
这个函数的一个重要部分是这一行:
Count_Duration = pulseInLong(Liter_count_Pin, LOW, 9000000);
在这种情况下,函数将读取 Liter_count_Pin 上的脉冲(变为低电平)。该函数测量引脚转换为低电平和再次变为高电平之间的时间(以微秒为单位)。当引脚在 9 秒(9000000 微秒)的超时限制内没有变为高电平时,函数将放弃并返回值 0。:
else if (Count_Duration == 0) {
这种情况可能发生在低于 33 毫升/秒 (2 L/min) 的非常低的水流或旋转升刻度盘停止在传感器下方的情况下,
if (digitalRead(Liter_count_Pin) == LOW) {
这很容易发生。在这两种情况下,这种效果都会导致 1 升被计算一次:
if (Stopcount == 0) {
为了指示一升的计数,橙色 LED(连接到 GPIO25 的 330 欧姆的黄色 LED)通过以下方式“打开”:
digitalWrite(Or_LEDPin,HIGH);
并在函数结束时切换到“关闭”:
digitalWrite(Or_LEDPin,LOW);
每次向 Blynk 传输数据之前,蓝色 LED 都会“打开”,其中:
digitalWrite(B_LEDPin,HIGH);
并在此类传输结束时“关闭”。
“ MEASUREWATER ”功能的第二部分负责设置水流警报。:
if (!Home && WaterFlow_state ) {
Blynk.virtualWrite(V4, true);
Blynk.logEvent("WaterAlarm", "There is waterflow and nobody is home");}
else
{Blynk.virtualWrite(V4, false); }
如果检测到水流,(“ WaterFlow_state ” == “ true ”),而布尔“ Home ”为“ 0 ”,换句话说,当条件“ !Home ”(不是 Home )== “ true ”时,在 Blynk 云中, Virtual Pin V4将设置为“true”。
将创建一个 logEvent 以使 Blynk 能够向智能水表的所有者发送推送通知或电子邮件。
如果“Home”为“true”或“WaterFlow_state”为“false”,V4将设置为“false”
“Home”状态如下:
使用 Blynk 控制台构建 Blynk 仪表板时,可以将“切换”小部件添加到仪表板。
完成后,转到小部件的“设置”并设置以下属性:
不要忘记“保存并应用”更改。
现在“ V0 ”的值已经与DataStream名称“Home”连接,可以控制为“Home”或“Not Home”,并赋予值“1”或“0”。
在 Arduino Sketch 中,您将看到以下代码行:
BLYNK_WRITE(V0) {
int value = param.asInt(); // assign incomming value of pin V0 to variable "value"
if(value == 1) // excute this code in case value is "1" (meaning Home is on)
{ Home = true; } // make boolean Home true
else // excute this code in case value is "0" (meaning Home is off)
{ Home = false; } // make boolean Home false
Blynk.virtualWrite(V1, value); // Update Home state on the Blynk dashboard
}
此代码的效果是,每当通过 PC/笔记本电脑或平板电脑上的 Blynk 仪表板更改开关状态时,V0 的更改值将发送到智能水表设备,其布尔变量“Home”的值将进行相应修改。
如果完成,更改将通过虚拟引脚“ V1 ”报告回 Blynk 云。在仪表板上,分配给 V1 的“LED”小部件将更改其状态(在本示例中,从“绿色”变为“白色”,反之亦然。
在“测量水”功能结束时,橙色 LED 和蓝色 LED 都将关闭
digitalWrite(Or_LEDPin,LOW);
digitalWrite(B_LEDPin,LOW);
这个函数负责每分钟向 Blynk 发送最重要的数据:
“UpTimeMin”,即设备上线后(或重置后)经过的时间,使用毫秒 () / 60000 计算,从而导致正常运行时间分钟数。
UpTimeHr 和 UpTimeDay 的后续计算应该是显而易见的。
过去一分钟使用的升量计算如下:
PastMinuteUse = LitCount - PrevLitCount;
其中 LitCount 是自设备启动以来计算的总升数,PrevLitCount 是 1 分钟前的总数量。
到目前为止,今天使用的金额是通过以下方式计算的:
TodayUse = TodayUse + PastMinuteUse;
此后,所有的数据都一个接一个地发送到 Blynk。
最后,函数 SendDailyUseData 负责向 Blynk 发送关于过去 24 小时内使用的公升总量 (PastDayUse) 的每日报告。
变量“ DayCount ”在此函数中起着重要作用。
365 天过去后,计算过去一年的总用水量并作为V13发送到 Blynk 。只有在整年未重置设备时才会发生这种情况(因此不会断电)。当前版本的 Sketch 还没有针对这种情况的内置补救措施,但这可以通过添加额外的代码来完成,该代码在断电后从 Blynk 读取最新值。根据功率下降持续的时间,将不考虑更多或更少的数据(升)。
另一种可能性是使用 ESP32 的内置 EEPROM 存储器或 SPIFFS。
在“ MEASUREWATER ”函数的代码中,您可以找到以下行:
FlowLitPerSec = Flowrate_factor/Count_Duration ;
Flowrate_factor 的值最初设置为:
float Flowrate_factor = 300000.00;
这意味着如果 Count_Duration 测量值为 300 毫秒 (=300000 µSec),“FlowLitPerSec”的值将为 1 l/S(相当于 60 升/分钟),这是一个相当高的流速,通常甚至无法达到冲马桶时。
然而,300000 的“Flowrate_factor”是一个估计值,需要通过校准来验证。该估计是基于假设水表升刻度盘上的金属板约为 . 一整圈时间的 1/3(对于 1 升)位于传感器头下方。
如果估计正确,那么 1 秒内 1 升(1 转)将导致“Count_Duration”为 333333 µSec。
“Flowrate_factor”取决于传感器相对于带有金属板的旋转刻度盘的精确位置。甚至金属板的尺寸和形状也会产生影响。
获得正确“Flowrate_factor”值的最佳方法是校准。
为此,取一桶 10 升水,将其放在水龙头下,并使用秒表记录注满 10 升水所需的时间(在恒定的最大水流量下)。
在 Blynk 仪表板上,您应该看到当前测量的流量(以 lit/min 为单位)(在 10 秒的响应时间之后)。将此值记为“measuredFlow”
在装满水桶后,还要检查仪表板上的升数是否确实增加了 10。(如果没有,请验证您的传感器位置并根据需要进行调整)。
10 升的时间(以秒为单位)用于计算实际水流量,如下所示:
RealFlow (X) = 10 / time in seconds (in L/sec)
“adjustedFlowrate_factor”现在可以计算如下:
“adjustedFlowrate_factor” = (measuredFlow * 300000) / RealFlow (X)
校准后,Excel 工作表中的计算结果如下所示:
这会导致调整后的 Flowrate_factor,然后将其作为 288330.00 放入 Arduino 代码中。现在您的系统已校准!
将修改后的代码闪烁到您的智能水表后,现在应该在 Blynk 仪表板上尽可能准确地生成瞬时水流。如有疑问,只需再次运行校准过程。
智能水表的完整 ARDUINO 草图包含 188 行代码。完整清单包含在本教程中,ARDUINO 代码提供了大量注释,有助于理解程序。草图提供英文注释或选择荷兰文注释。
在整个 Sketch 中包含了许多打印命令,以便在开发过程中提供帮助并能够在 Arduino IDE(在 PC 上运行)的串行监视器上监控过程。如果您想在 Arduino IDE 的串行监视器上监控进程,请取消注释这些行。
当正确安装在现有水表顶部并连接到 5V 充电器并与您的 Wi-Fi 接入点建立连接时,设备应该可以启动并运行。在 Blynk 中构建美观的仪表板或在手机上使用的仪表板取决于您自己的创造力。
可以通过断开 5V 充电器的连接并重新插入来重置系统。
这是一个非常有趣的项目,开发和构建它很有趣,尤其是当您在漂亮的 Blynk Dashboard 上看到结果时。
通过 ESP32 TTGO T7 建立的 Wi-Fi 连接效果很好,但我必须承认我的水表设备靠近接入点。
当然,总是有改进的余地。我想到的一些改进是:
为您编写本教程也是一件令人愉快的事情。
享受阅读和/或制作自己的智能水表的乐趣!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !