新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于 ESP32 与 Blynk 的智能水塔水位监测系统设计

基于 ESP32 与 Blynk 的智能水塔水位监测系统设计

作者: 时间:2025-11-14 来源: 收藏


1. 问题背景:凌晨 5 点溢出的水

很多家庭都经历过类似的场景:
某天凌晨 5 点,楼顶水塔开始往外溢水,水龙头边还能听见水泵嗡嗡作响——因为前一晚忘记关电机。

这一小小的疏忽,带来了一连串问题:

  • 自来水被白白浪费;

  • 电机长时间空转,电能被浪费;

  • 更严重的是:水泵可能因过载过热而烧毁;

  • 这一情况在 家庭、宿舍、公寓楼、乡村水塔 中每天都在重复发生。

与此同时,我们正在谈论机器人、无人机、AI、云计算,但对自家水箱 “满了没”“快空了没” 这样简单的问题,却往往依赖人工去楼顶查看——这显得有些“反差”。

因此,本文从一个真实的小痛点出发,设计并实现了一个 基于 ESP32 的 IoT 智能水位监测系统,目标是:

  • 实时监测水塔水位,并在手机上可视化;

  • 当水满或水位过低时推送告警;

  • 可选:自动关闭水泵,避免溢水和过载;

  • 使用常见器件(ESP32 + HC-SR04 + Blynk),成本低、易


2. 系统整体方案

整个系统的核心思路是:
用超声波传感器测量“水面距离传感器的高度”,再换算成水位高度与百分比,通过 Wi-Fi 上传到 Blynk 云端,在手机 App 上实时显示和告警。

2.1 使用的主要硬件

  1. ESP32 开发板

    • 集成 Wi-Fi,支持 Blynk IoT 平台;

    • 负责传感器采集、数据处理和联网通信。

  2. HC-SR04 超声波测距传感器

    • 安装在水箱顶部,向下发射超声波;

    • 测量“传感器到水面”的距离,实现非接触式水位检测。

  3. 继电器模块(可选)

    • 由 ESP32 控制;

    • 通过继电器控制水泵电源,实现自动“断电/开机”。

  4. 智能手机 + Blynk App

    • 作为 IoT 云平台和人机界面;

    • 用于显示实时水位、推送告警通知、远程控制水泵。

2.2 方案特点

  • 硬件简单、成本低、易于在家庭和乡村环境部署;

  • 无需接触水体,传感器安装和维护难度低;

  • 通过云平台和手机 App,全程无线化。


3. 工作原理与测量逻辑

系统的关键公式非常直观:

水位高度 = 水箱总高度 − 传感器测得的距离

假设:

  • 水箱深度(高度)为 TANK_DEPTH(单位 cm);

  • 超声波测得传感器到水面的距离为 distance

则有:

waterLevel = TANK_DEPTH - distance
waterPercent = (waterLevel / TANK_DEPTH) * 100%

为了保证数据合理,软件会对结果做边界限制:

  • 若计算结果 < 0,则归零;

  • 若计算结果 > 100%,则按 100% 处理。


4. 硬件安装:传感器与水箱布局

  1. 超声波传感器安装位置

    • 探头正对水面中央,避免壁面干扰;

    • 与水面之间没有管道、浮球等遮挡物;

    • 传感器高度尽可能接近水箱顶面,以便把水箱总高度设为常数。

    • 将 HC-SR04 固定在水箱顶部内侧,探头朝下;

    • 尽量保证:

  2. 电气连接

    • 继电器线圈电压与触点额定电压;

    • 水泵电源属于高压部分,必须安全接线。

    • HC-SR04 的 TRIGECHO 分别连接到 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 >= 95digitalWrite(RELAY_PIN, LOW) 关闭水泵;

    • waterPercent <= 10 → 根据需求提示或自动开启水泵。


7. 实际使用体验

部署完成后,典型的使用体验包括:

  • 无论在家还是出门,只要手机联网,就能随时查看水塔水位;

  • 在水位接近 100% 前,手机自动收到“水满”的提醒,有条件可以自动关泵;

  • 在水位过低前收到“水不足”提醒,避免临时无水可用;

  • 再也不需要凌晨爬楼检查水塔,也避免了长期溢水和水泵过载。

从用户反馈来看,“减少了水和电的浪费,也减少了心理上的‘担心’”,是一类非常贴近日常生活的小而实用的 IoT 应用。


8. 应用价值与扩展方向

从工程和应用角度,这一项目具有以下意义:

  • 节水与节能
    通过自动检测和告警,减少大量日常水浪费和水泵空转耗电。

  • 设备保护
    通过自动断泵可降低水泵因长期过载而损坏的风险。

  • 可扩展性强
    可以进一步扩展成:

    • 多水箱、多点水位监测;

    • 接入 LoRa/4G,实现远程乡村供水系统监控;

    • 与家庭用水统计、漏水监测等场景结合。


9. 结语

技术并不只属于大型工业系统或复杂的 AI 算法,它同样可以落地到家庭水箱、乡村水塔这样的“小地方”。

基于 ESP32 + 超声波传感器 + Blynk 的 智能水位监测系统,就是一个典型示例:
通过简单的硬件、开源的开发环境和成熟的 IoT 平台,就能解决长期存在的日常小问题,实现更节水、更省心的用水方式。

如果你愿意,我们下一步可以在这篇文章基础上,继续完善:

  • 加上系统框图、接线示意图;

  • 增补带阈值控制的继电器控制代码版本;

  • 写一份“安装与标定步骤”,方便读者直接照做。



关键词: DIY

评论


相关推荐

技术专区

关闭