基于 ESP32 与 Blynk 的智能水塔水位监测系统设计
1. 问题背景:凌晨 5 点溢出的水
很多家庭都经历过类似的场景:
某天凌晨 5 点,楼顶水塔开始往外溢水,水龙头边还能听见水泵嗡嗡作响——因为前一晚忘记关电机。
这一小小的疏忽,带来了一连串问题:
自来水被白白浪费;
电机长时间空转,电能被浪费;
更严重的是:水泵可能因过载过热而烧毁;
这一情况在 家庭、宿舍、公寓楼、乡村水塔 中每天都在重复发生。
与此同时,我们正在谈论机器人、无人机、AI、云计算,但对自家水箱 “满了没”“快空了没” 这样简单的问题,却往往依赖人工去楼顶查看——这显得有些“反差”。
因此,本文从一个真实的小痛点出发,设计并实现了一个 基于 ESP32 的 IoT 智能水位监测系统,目标是:
实时监测水塔水位,并在手机上可视化;
当水满或水位过低时推送告警;
可选:自动关闭水泵,避免溢水和过载;
使用常见器件(ESP32 + HC-SR04 + Blynk),成本低、易 DIY。
2. 系统整体方案
整个系统的核心思路是:
用超声波传感器测量“水面距离传感器的高度”,再换算成水位高度与百分比,通过 Wi-Fi 上传到 Blynk 云端,在手机 App 上实时显示和告警。
2.1 使用的主要硬件
ESP32 开发板
集成 Wi-Fi,支持 Blynk IoT 平台;
负责传感器采集、数据处理和联网通信。
HC-SR04 超声波测距传感器
安装在水箱顶部,向下发射超声波;
测量“传感器到水面”的距离,实现非接触式水位检测。
继电器模块(可选)
由 ESP32 控制;
通过继电器控制水泵电源,实现自动“断电/开机”。
智能手机 + Blynk App
作为 IoT 云平台和人机界面;
用于显示实时水位、推送告警通知、远程控制水泵。
2.2 方案特点
硬件简单、成本低、易于在家庭和乡村环境部署;
无需接触水体,传感器安装和维护难度低;
通过云平台和手机 App,全程无线化。
3. 工作原理与测量逻辑
系统的关键公式非常直观:
水位高度 = 水箱总高度 − 传感器测得的距离
假设:
水箱深度(高度)为
TANK_DEPTH(单位 cm);超声波测得传感器到水面的距离为
distance;
则有:
waterLevel = TANK_DEPTH - distance waterPercent = (waterLevel / TANK_DEPTH) * 100%
为了保证数据合理,软件会对结果做边界限制:
若计算结果 < 0,则归零;
若计算结果 > 100%,则按 100% 处理。
4. 硬件安装:传感器与水箱布局
超声波传感器安装位置
探头正对水面中央,避免壁面干扰;
与水面之间没有管道、浮球等遮挡物;
传感器高度尽可能接近水箱顶面,以便把水箱总高度设为常数。
将 HC-SR04 固定在水箱顶部内侧,探头朝下;
尽量保证:
电气连接
继电器线圈电压与触点额定电压;
水泵电源属于高压部分,必须安全接线。
HC-SR04 的
TRIG、ECHO分别连接到 ESP32 的 GPIO:#define TRIG_PIN 5 #define ECHO_PIN 18
ESP32 通过 USB 或稳压电源供电;
若使用继电器控制水泵,需要额外注意:
5. 软件设计与 Blynk 云平台
5.1 核心功能
周期性触发超声波测距(每 1 秒一次);
计算距离 → 换算水位高度 → 换算水位百分比;
将数据发送到 Blynk 虚拟引脚(例如 V0、V1);
在串口输出调试信息;
设置“水满”“水位偏低”的阈值,触发手机通知与电机控制。
5.2 Blynk 端数据映射
在示例代码中:
V0:显示水位百分比(0–100%);V1:显示水位高度(单位:cm)。
在手机端 Blynk App 上可以:
放置 Gauge(仪表盘)组件 显示百分比水位;
用 Label/Value Display 显示精确高度。
配置 事件通知 / Automation,实现:
水位 ≥ 95%:推送“水箱已满,电机已关闭”;
水位 ≤ 10%:推送“水位过低,请开启电机”。
6. 完整代码解析(ESP32 + HC-SR04 + Blynk)
下面是你给出的完整代码,已经可以实现 水位测量 + Blynk 实时上报。在文章中可以直接作为“参考实现”。
/************* Smart Water Level Monitoring System *************
Hardware: ESP32, HC-SR04 Ultrasonic Sensor, Blynk App
Features:
✔ Measure water level in tank
✔ Send percentage to Blynk App
✔ Show water level on Serial Monitor
✔ Automatically detect tank full or empty
✔ Motor control can be added easily
****************************************************************/
#define BLYNK_TEMPLATE_ID "Your_Template_ID"
#define BLYNK_TEMPLATE_NAME "Water Level Monitor"
#define BLYNK_AUTH_TOKEN "Your_Blynk_Auth_Token"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Wi-Fi Credentials
char ssid[] = "Your_WiFi_Name";
char pass[] = "Your_WiFi_Password";
// Ultrasonic Sensor Pins
#define TRIG_PIN 5
#define ECHO_PIN 18
// Tank Dimensions (in cm)
const int TANK_DEPTH = 100; // Tank height in centimeters
long duration;
float distance, waterLevel, waterPercent;
BlynkTimer timer;
/***************** Function to Measure Water Level *****************/
void measureWaterLevel() {
// Send ultrasonic pulse
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Read echo time
duration = pulseIn(ECHO_PIN, HIGH);
// Calculate Distance (cm)
distance = duration * 0.034 / 2;
// Calculate water level
waterLevel = TANK_DEPTH - distance;
// Calculate percentage
waterPercent = (waterLevel / TANK_DEPTH) * 100.0;
if (waterPercent < 0) waterPercent = 0;
if (waterPercent > 100) waterPercent = 100;
// Send data to Blynk
Blynk.virtualWrite(V0, waterPercent); // Water Level in %
Blynk.virtualWrite(V1, waterLevel); // Water Level in cm
// Print on Serial Monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.print(" cm | Water Level: ");
Serial.print(waterLevel);
Serial.print(" cm | Tank Filled: ");
Serial.print(waterPercent);
Serial.println(" %");
}
/***************** Setup Function *****************/
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Connect to Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Timer runs every 1 second
timer.setInterval(1000L, measureWaterLevel);
}
/***************** Main Loop *****************/
void loop() {
Blynk.run();
timer.run();
}可以按以下思路向读者解释关键部分(如果你准备写成系列文章,可以在后续篇章展开):
超声波测距:
pulseIn(ECHO_PIN, HIGH)返回高电平持续时间(单位:微秒);
声速约为 340 m/s,即 0.034 cm/μs;
距离 = 时间 × 声速 / 2(往返距离除以 2)。定时任务:
使用BlynkTimer每秒调用一次measureWaterLevel();
避免在loop()中使用delay(),保证 Blynk 连接稳定。云端通信:
Blynk.virtualWrite(V0, waterPercent)将数据推送至虚拟引脚 V0;
Blynk App 中将仪表盘绑定到 V0 即可实时显示。
如需扩展自动控制水泵,只需:
增加一个
RELAY_PIN,设置为输出;在
measureWaterLevel()中加入逻辑:若
waterPercent >= 95→digitalWrite(RELAY_PIN, LOW)关闭水泵;若
waterPercent <= 10→ 根据需求提示或自动开启水泵。
7. 实际使用体验
部署完成后,典型的使用体验包括:
无论在家还是出门,只要手机联网,就能随时查看水塔水位;
在水位接近 100% 前,手机自动收到“水满”的提醒,有条件可以自动关泵;
在水位过低前收到“水不足”提醒,避免临时无水可用;
再也不需要凌晨爬楼检查水塔,也避免了长期溢水和水泵过载。
从用户反馈来看,“减少了水和电的浪费,也减少了心理上的‘担心’”,是一类非常贴近日常生活的小而实用的 IoT 应用。
8. 应用价值与扩展方向
从工程和应用角度,这一项目具有以下意义:
节水与节能:
通过自动检测和告警,减少大量日常水浪费和水泵空转耗电。设备保护:
通过自动断泵可降低水泵因长期过载而损坏的风险。可扩展性强:
可以进一步扩展成:多水箱、多点水位监测;
接入 LoRa/4G,实现远程乡村供水系统监控;
与家庭用水统计、漏水监测等场景结合。
9. 结语
技术并不只属于大型工业系统或复杂的 AI 算法,它同样可以落地到家庭水箱、乡村水塔这样的“小地方”。
基于 ESP32 + 超声波传感器 + Blynk 的 智能水位监测系统,就是一个典型示例:
通过简单的硬件、开源的开发环境和成熟的 IoT 平台,就能解决长期存在的日常小问题,实现更节水、更省心的用水方式。
如果你愿意,我们下一步可以在这篇文章基础上,继续完善:
加上系统框图、接线示意图;
增补带阈值控制的继电器控制代码版本;
写一份“安装与标定步骤”,方便读者直接照做。












评论