开源水位监测系统:从超声波传感器到Web仪表盘的物联网实践
1. 项目概述一个开源的水位监测系统如果你正在为家里的水井、蓄水箱或者花园的雨水桶的水位发愁总担心水不够用或者溢出那么这个名为Watmonitor的开源项目可能就是你的“数字看水人”。简单来说这是一个软硬件结合的系统核心是一个中央Web界面用来接收、存储和展示来自传感器节点的水位数据。你可以把它想象成一个专为水位打造的私人仪表盘无论你身在何处打开网页就能看到水井里还有多少水历史水位变化曲线如何。这个项目的巧妙之处在于它的模块化和开放性。硬件端它支持从经典的Arduino Uno到流行的ESP8266、ESP32甚至包括基于Sigfox低功耗广域网的方案。这意味着你可以根据自家的网络条件、供电情况和预算灵活选择最合适的“大脑”。传感器方面则主要围绕超声波测距模块展开最常用的是HC-SR04及其防水版本JSN-SR04T。软件端Web界面负责所有数据的汇聚、计算比如将距离换算成水量和可视化后端用PHP写成轻量且高效。我最初接触这个项目是想解决乡下老宅水井的远程监控问题。手动打水查看不仅麻烦而且无法了解用水规律和水源稳定性。市面上成品的物联网水位计要么太贵要么封闭不透明。Watmonitor的开源特性让我能完全掌控数据流和硬件成本从零搭建一套属于自己的监测系统。经过一段时间的部署和优化它已经稳定运行了超过一年让我对家庭用水情况了如指掌。接下来我将详细拆解这个项目的设计思路、硬件选型、软件部署以及那些只有实际动手才能遇到的“坑”和技巧。2. 核心设计思路与方案选型2.1 为什么选择超声波传感器水位监测的传感器种类繁多从简单的浮球开关到高精度的压力传感器。Watmonitor项目首选超声波传感器主要是基于成本、可靠性和适用性的综合考量。核心原理超声波传感器如HC-SR04工作时会通过Trig引脚发送一个短暂的10微秒高频脉冲。这个声波脉冲在空气中传播遇到水面或其他物体后反射回来被传感器的接收器捕捉。通过测量从发送到接收回波的时间差Time-of-Flight再乘以声音在空气中的速度约343米/秒20°C时就能计算出传感器到水面的距离。知道了传感器安装高度和井深水位高度自然就得出了。优势分析非接触式测量传感器本身不需要浸入水中避免了腐蚀、污染和生物附着问题尤其适合水质复杂或需要长期无人值守的场合。成本低廉HC-SR04模块价格极为亲民是入门级电子项目的常客极大降低了整套系统的硬件门槛。维护简单没有活动机械部件理论上寿命很长只需保持探头表面相对清洁即可。关键限制与选型要点然而超声波并非万能。项目文档中特别强调了两个关键参数探测角度波束宽度和防水性。HC-SR0415°窄波束波束角小能量集中适合直径较小的水井或水箱。但它不防水必须安装在井口上方干燥处。井内的潮湿水汽长期侵蚀其金属探头极易导致氧化失效。我的经验是即使用在井口也最好加一个简单的防雨罩并确保通风避免冷凝水积聚。JSN-SR04T60°宽波束探头部分完全防水可以应对潮湿环境。但宽波束角带来了大问题随着测量距离增加声波覆盖的圆形区域会迅速变大。在4.5米深的井中其波束在地面处的直径可能达到6米。这意味着它只能用于直径非常大的蓄水池或露天水体对于常见的家庭圆井或方井声波会大量打在井壁上产生杂波干扰导致测量不准甚至失败。实操心得选择传感器前务必测量或估算你的水井/水箱的直径。一个简单的判断方法是传感器所需的最小井径 ≈ 2 * 测量深度 * tan(波束角/2)。对于深井窄口HC-SR04是更可靠的选择但务必做好物理防护。对于露天大水桶JSN-SR04T的防水性则更有优势。2.2 微控制器平台Arduino、ESP与Sigfox的抉择项目支持多种MCU这背后对应着不同的应用场景和网络条件。1. Arduino 有线以太网如W5100/W5500 shield适用场景监测点附近有稳定的路由器和网线接口且供电不是问题通常需要9-12V直流适配器。例如监控地下室蓄水箱或锅炉房料仓。优点连接极其稳定不受无线信号干扰。基于ATmega328P的Arduino Uno编程简单生态成熟。缺点灵活性差布线麻烦。整体功耗较高不适合太阳能供电的野外场景。随着时间推移这类方案显得有些“老旧”。2. ESP8266/ESP32 Wi-Fi适用场景绝大多数家庭和花园环境。监测点位于Wi-Fi信号可覆盖的范围内必要时可通过中继器扩展。优点ESP8266如NodeMCU、Wemos D1性价比之王足以胜任定时测量、连接Wi-Fi、发送HTTP数据包的任务。支持深度睡眠Deep Sleep在两分钟测量间隔下配合电池或太阳能板可以实现超低功耗运行。ESP32功能更强大的旗舰选择。双核处理器允许更复杂的任务调度如项目提到的FreeRTOS双任务队列。关键优势在于原生支持HTTPS加密通信且具有更丰富的接口如可用于未来扩展的蓝牙、霍尔传感器等。对于新建项目ESP32是更面向未来的选择。网络配置技巧项目提供的预编译固件使用了著名的WiFiManager库。首次上电时ESP会创建一个名为“Hladinomer_AP”的开放Wi-Fi热点。用手机连接后会自动弹出引导页面或手动访问192.168.4.1让你选择家庭Wi-Fi并输入密码。配置一次永久保存。即使日后家里Wi-Fi密码改了设备也会因连不上旧网络而再次进入配网模式非常人性化。3. Sigfox或其它LPWAN适用场景偏远地区、没有手机信号或Wi-Fi覆盖的野外监测点如山林中的水源地、远离农舍的灌溉蓄水池。工作原理Sigfox是一种超窄带物联网技术终端设备通过专用模块将极小的数据包每次最多12字节发送至基站再经运营商网络传到互联网。它的优势是超远距离农村可达几十公里和超低功耗一节电池可工作数年。现实考量正如项目作者2024年更新所言Sigfox网络在全球许多地区包括项目起源地斯洛伐克正在萎缩或关闭。在国内可以将其类比为NB-IoT或LoRa。如果你需要这类方案Watmonitor的架构思想仍然适用但你需要将数据发送到支持这些协议的自家服务器或云平台并相应修改硬件和固件。我的选择与建议对于家庭用户ESP32是目前最平衡的选择。它价格已非常亲民性能冗余足够应对未来功能升级如本地数据缓存、多传感器融合HTTPS支持也提升了数据安全性。ESP8266则适合预算极其严格或对功耗有极致要求的场景。2.3 数据流与Web界面架构解析理解了硬件我们再看软件和数据如何流动。传感器节点端微控制器定时如每5分钟唤醒触发超声波传感器完成一次测量。计算得到传感器到水面的距离raw_distance。根据公式水位高度 井深 - raw_distance计算出水位高度。这里有一个至关重要的细节如果这个计算是在单片机端完成的那么在Web界面里“井深”参数必须设置为0。因为Web后端预期收到的是“传感器到水面的原始距离”它会用你预设的井深去减。如果两端都做了减法结果就会错乱。我建议始终在单片机端发送原始距离将计算逻辑完全交给后台这样更灵活便于后期调整参数。将数据可能包含设备ID、距离值、时间戳、电池电压等通过HTTP/HTTPS POST请求发送到指定的Web服务器API接口。服务器后端PHP接收POST请求验证设备ID简单的令牌认证将数据存入数据库如MySQL。进行核心计算实际水位 用户设定的井深 - 原始距离水量体积 π * (井半径)² * 实际水位。对于方井则用等效圆直径或直接计算长方体体积。提供数据查询API供前端界面调用。前端Web界面仪表盘Dashboard直观展示当前水位、水量百分比、总体积等。2024年后使用了JustGauge插件仪表盘视觉效果更专业。历史图表展示水位随时间变化的曲线图。升级到ApexCharts后支持区域图、缩放、导出为图片或CSV数据方便进一步分析。数据表格以表格形式列出所有历史记录支持动态删除AJAX技术无需刷新页面。工具页面帮助用户根据已知井径和传感器波束角计算该传感器能可靠测量的最大井深辅助选型。QR码功能为每个监测点生成专属QR码。用手机扫描可直接跳转到该监测点的实时数据页面省去打开浏览器、输入网址、寻找设备的步骤对不熟悉技术的家人非常友好。这套架构清晰地将数据采集、处理与展示分离使得任何一部分都可以独立升级或替换。例如你可以更换更强大的后端框架或者为前端仪表盘接入Grafana而无需改动下位机代码。3. 硬件搭建与核心环节实现3.1 元器件清单与电路连接假设我们选择ESP32开发板如ESP32 DevKit V1和HC-SR04超声波传感器作为核心构建一个Wi-Fi版本的水位监测节点。所需材料清单ESP32开发板 x1HC-SR04超声波传感器 x1微型USB数据线用于供电和编程x1杜邦线母对母若干可选5V继电器模块 x1如果你想实现水位过低自动控制水泵可选18650锂电池及充放电保护板 x1套用于移动或断电备用可选防水盒、导线、热缩管等辅助材料电路连接示意图接线表ESP32 GPIO引脚连接至 HC-SR04说明GPIO5Trig输出触发信号GPIO18Echo输入回波信号5VVcc供电正极GNDGND供电地线注意引脚选择是相对随意的只要在代码中对应修改即可。避免使用一些有特殊启动功能的引脚如GPIO0、GPIO2等。我选择GPIO5和GPIO18是因为它们在我的开发板上位置方便且无特殊限制。供电考虑长期稳定运行建议使用手机充电器5V/1A或以上通过USB口供电最稳定可靠。低功耗/野外场景需要使用ESP32的深度睡眠模式。这时HC-SR04的供电必须由ESP32的一个GPIO口控制在测量间隙彻底断电否则其静态功耗会耗尽电池。连接方式变为ESP32的某个GPIO如GPIO19连接一个MOSFET或三极管开关电路来控制HC-SR04的VCC通断。同时需按照项目说明将ESP32的GPIO16与RST引脚用跳线短接以实现定时唤醒。3.2 固件烧录与配置对于初学者最快捷的方式是使用项目提供的预编译固件.bin文件。获取固件访问项目页面https://your-iot.github.io/Watmonitor/找到针对ESP32的预编译固件链接并下载。烧录工具下载并安装ESP32 Flash Download Tool或使用esptool.py命令行工具。接线与识别用USB线连接ESP32和电脑。在设备管理器中确认COM端口号。烧录配置以Flash Download Tool为例选择正确的CHIP TYPE为ESP32。选择正确的COM端口。在SPIDownload区域添加下载的.bin文件。通常需要设置0x1000为固件的起始地址请以项目页面具体说明为准。点击START开始烧录。看到进度条完成且日志显示成功即可。Wi-Fi配置烧录完成后给ESP32重新上电。它会启动并创建一个名为Hladinomer_AP的开放Wi-Fi网络。用手机或电脑连接这个网络。连接后通常会自动弹出配置页面。如果没有在浏览器手动输入192.168.4.1。在页面中选择你的家庭Wi-FiSSID输入密码点击保存。ESP32将尝试连接你指定的网络。成功后Hladinomer_AP热点会消失设备开始正常工作。对于开发者从源码编译如果你想修改代码或学习实现细节需要搭建Arduino IDE环境。安装环境在Arduino IDE中安装ESP32开发板支持通过开发板管理器。获取库文件需要安装必要的库如WiFiManager、用于HTTP请求的HTTPClient或WiFiClientSecure用于HTTPS、以及用于超声波测距的NewPing库比原生pulseIn更稳定。获取源码从项目GitHub仓库https://github.com/martinius96/hladinomer-studna-scripty下载示例代码。修改配置打开Hladinomer.ino文件修改关键参数// 示例片段非完整代码 const char* serverName https://hladinomer.eu; // Web服务器地址 const char* apiKey YOUR_DEVICE_UNIQUE_ID; // 在Web界面创建设备后获取的ID const int well_depth_cm 0; // 如前所述发送原始距离则设为0 const int measurement_interval 300; // 测量间隔单位秒 const int trigPin 5; // 对应你的实际接线 const int echoPin 18;编译上传选择正确的开发板型号和端口点击上传。3.3 传感器安装与校准这是影响测量精度的最关键物理步骤。确定安装位置将HC-SR04传感器水平固定于井口正上方。可以使用木条、角铁或3D打印一个支架。确保传感器平面与水面平行。测量基准值安装高度H精确测量传感器超声波发射面到井口平面的垂直距离。井口到水面的最大距离D_max在水井完全干涸时测量井口到井底的深度。实际井深 H D_max。井筒直径d测量水井的内径。如果是方井计算等效圆直径等效直径 2 * sqrt(面积/π)。Web界面初始设置登录Watmonitor Web界面如https://hladinomer.eu。添加一个新的传感器节点输入你为设备设置的唯一ID与固件中apiKey一致。在设备设置中填入上一步测量得到的“井深”和“井直径”。“传感器安装高度”参数根据固件逻辑填写如果你在固件中发送的是原始距离这里就填H如果你在固件中已经减去了H发送的是水位高度这里就填0。强烈建议采用前者发送原始距离让Web端处理所有计算。现场校准验证用卷尺实际测量当前水面到井口的距离L_measured。等待设备上传几次数据后在Web仪表盘查看显示的“水位高度”。理论上仪表盘水位高度 井深 - L_measured。对比实际值与显示值。如果存在固定偏差可能是传感器测量存在系统误差可以在Web界面或固件中设置一个“校准偏移量”进行修正。超声波在空气中的速度受温度影响但对于家庭水位监测常温下的误差通常在可接受范围内厘米级。4. 软件部署与高级功能配置4.1 自建Web服务器可选项目提供的公共Web服务https://hladinomer.eu非常方便但如果你希望数据完全私有化或者进行二次开发可以自建服务器。基础环境搭建以Ubuntu Nginx为例服务器准备准备一台VPS或家中常年开机的电脑如树莓派安装Ubuntu系统。安装服务sudo apt update sudo apt install nginx mysql-server php-fpm php-mysql php-curl php-gd php-mbstring部署代码从项目GitHub仓库克隆或下载后端PHP代码。将代码放置到Nginx的Web目录例如/var/www/watmonitor/。配置Nginx站点确保PHP文件能被正确解析。数据库初始化登录MySQL创建数据库和用户CREATE DATABASE watmonitor;导入项目提供的SQL文件通常在仓库的sql/目录下来创建数据表结构。配置修改修改PHP配置文件如config.php填入数据库连接信息、网站域名等。在固件中将serverName改为你自建服务器的地址。安全增强建议为Web服务配置SSL证书使用Let‘s Encrypt免费证书启用HTTPS。在PHP后端对设备IDAPI Key进行强验证甚至可以增加简单的签名机制防止数据被恶意注入。定期备份数据库。4.2 数据集成与自动化Watmonitor在2025年更新中提供了JSON API这打开了通往智能家居和工业监控系统的大门。1. 集成到家庭自动化Home Assistant通过RESTful SensorHome Assistant可以定期调用Watmonitor的JSON API接口获取最新的水位数据并将其作为一个传感器实体。# configuration.yaml 示例片段 sensor: - platform: rest name: Well Water Level resource: https://hladinomer.eu/api/your_device_id/latest value_template: {{ value_json.water_level }} unit_of_measurement: cm scan_interval: 300 # 每5分钟更新一次通过MQTT更优雅可以编写一个简单的Python脚本运行在Home Assistant所在的服务器上定期从Watmonitor API获取数据然后通过MQTT发布到Home Assistant的MQTT代理。这样可以利用MQTT的实时性优势。项目也提到了通过Node-RED作为中间件来实现此功能。2. 使用Node-RED进行流处理Node-RED是一个图形化的流编程工具非常适合做数据桥接和简单逻辑处理。安装node-red-contrib-web-worldmap等节点。创建一个流使用“http request”节点定时从Watmonitor API拉取数据。使用“function”节点解析JSON并计算水量百分比、判断是否低于阈值。使用“email”节点或“telegram”节点在水位低于20%时发送报警通知到手机。使用“dashboard”节点创建自定义的UI将水位数据显示在仪表盘上。3. 数据可视化进阶Grafana将Watmonitor的数据存入一个支持时间序列的数据库如InfluxDB。这可能需要修改后端PHP代码在插入MySQL的同时也写入InfluxDB。或者使用Telegraf一个数据收集代理的HTTP输入插件定期从Watmonitor API抓取数据并写入InfluxDB。在Grafana中连接InfluxDB数据源创建漂亮的水位趋势图、水量预测仪表盘等。4.3 移动端与AR体验项目提到的AR增强现实Web应用是一个有趣的尝试。其原理大致如下为每个监测点生成一个包含设备ID信息的QR码。用户用手机浏览器访问AR Web应用页面通常基于JavaScript库如AR.js或Three.js。浏览器请求摄像头权限扫描设备QR码。应用识别出设备ID然后通过API向Watmonitor服务器请求该设备的实时数据。在手机屏幕的摄像头画面上叠加一个虚拟的仪表盘或3D水井模型其水位高度根据实时数据动态变化。这虽然是一个“炫技”功能但在向家人或访客展示时非常直观。实现它需要一定的Web前端和3D图形编程知识项目提供了基础范例可以作为学习的起点。5. 常见问题排查与优化心得5.1 硬件与测量问题问题1读数不稳定跳动很大。可能原因1井壁反射干扰。超声波波束打到不平整的井壁或井内物体如水管、电线上产生杂波。解决确保传感器正对水面中心。对于窄井使用波束角更小的HC-SR04。可以在传感器下方加装一个纸质或塑料的锥形导波筒约束声波传播方向但要注意筒内不能有阻碍物。可能原因2水面波动。有水流流入或风导致水面涟漪。解决增加测量次数在固件中取中位数或平均值滤波。例如连续测10次去掉最大最小值取中间几个值的平均。NewPing库内置了超时和滤波功能比直接使用pulseIn更可靠。可能原因3电源噪声。ESP32的Wi-Fi模块工作时电流变化大可能影响传感器供电。解决在HC-SR04的VCC和GND之间并联一个100μF的电解电容进行电源滤波。使用质量较好的USB电源或线性稳压模块。问题2测量距离远小于实际距离或一直返回一个固定小值。可能原因回波Echo引脚一直为高电平可能是接线错误、传感器损坏或者测量间隔太短上一次的回波还没结束。解决检查接线。在代码中确保每次测量前有足够的延迟delay(60)毫秒以上让传感器模块内部复位。使用NewPing库可以更好地处理时序。问题3ESP32无法连接到Wi-Fi或经常断线。可能原因1信号弱。解决使用手机测试安装位置的信号强度。考虑使用Wi-Fi中继器或改用ESP32开发板外接天线型号。可能原因2路由器设置了MAC地址过滤或仅允许特定设备连接。解决在路由器设置中将ESP32的MAC地址加入白名单或关闭相关过滤功能。可能原因3电源不足。Wi-Fi连接瞬间峰值电流可达500mA。解决确保使用足额5V/2A的电源适配器USB线不能太细太长。5.2 软件与数据问题问题1数据无法发送到Web服务器。排查步骤检查网络确保ESP32已成功连接Wi-Fi可通过串口打印日志查看。检查地址确认固件中的serverName和API路径完全正确。HTTPS地址需要正确的证书。检查API Key确认Web界面创建的设备ID与固件中填写的apiKey完全一致区分大小写。查看服务器日志如果是自建服务器查看Nginx/PHP的错误日志看是否收到了请求以及请求有何问题。使用工具测试在电脑上用Postman或curl工具模拟发送一个POST请求到服务器API看是否能成功以此隔离硬件问题。问题2Web界面显示的水位或水量计算错误。核心检查点井深、安装高度、原始距离这三个参数的逻辑关系。黄金法则统一计算逻辑。建议采用“固件发原始距离Web端做全部计算”的模式。固件中well_depth_cm 0 发送raw_distance。Web界面设置“井深”为实际总深“传感器安装高度”为传感器到井口的距离。此时Web后端计算水位 井深 - (安装高度 raw_distance)。如果传感器直接装在井口平面安装高度0则公式简化为水位 井深 - raw_distance。问题3设备功耗过高电池消耗快。优化措施启用深度睡眠在ESP32代码中在每次测量并发送数据后调用esp_deep_sleep_start(measurement_interval * 1000000);。记得连接GPIO16到RST引脚。外设电源管理通过MOSFET控制HC-SR04的电源仅在测量前通电。降低Wi-Fi功耗在连接Wi-Fi前可以尝试设置WiFi.setSleep(true);启用调制解调器睡眠对于ESP8266。ESP32的Wi-Fi功耗优化更复杂深度睡眠是最有效的手段。降低CPU频率ESP32可以在代码中动态降低CPU主频以节省功耗但可能影响Wi-Fi连接速度需测试稳定性。5.3 长期维护与扩展建议定期检查传感器探头尤其是非防水的HC-SR04检查金属触片是否有氧化迹象。可用棉签蘸取少量无水酒精轻轻擦拭。数据备份定期从数据库导出CSV备份防止数据丢失。功能扩展多传感器融合ESP32引脚丰富可以同时连接多个超声波传感器监控多个水桶。环境参数集成增加DHT22温湿度传感器监测井房环境增加DS18B20防水温度传感器监测水温。水泵控制连接继电器模块当水位低于阈值时自动启动水泵抽水水位恢复后停止。务必做好物理防干烧和水泵过载保护。太阳能供电搭配小功率太阳能板、充电控制器和锂电池实现完全离网运行。系统健壮性增强本地缓存修改固件在发送数据失败时将数据暂存到ESP32的SPIFFS文件系统或EEPROM中待网络恢复后重发。看门狗启用硬件看门狗定时器防止程序跑飞导致设备死机。电池电压监测通过ESP32的ADC引脚监测电池电压在数据发送时一并上报方便远程了解设备电量状态。这个项目从一个简单的想法出发通过开源社区的不断迭代已经成长为一个功能相对完善、可定制性极强的水位监测解决方案。它不仅仅给了你一个查看水位的工具更重要的是提供了一套完整的、可复用的物联网数据流框架。无论你是想监控水井、雨水桶还是想将其改造成粮仓料位计、地下室洪水报警器其核心的“感知-传输-展示”逻辑都是相通的。动手搭建的过程本身就是一次绝佳的嵌入式开发和物联网入门实践。当你第一次在手机上看到自家水井的实时水位时那种连接物理世界与数字世界的成就感是购买任何成品设备都无法比拟的。