基于Particle Photon 2与超声波传感器的智能潜水泵监控系统

📅 发布时间:2026/8/20 4:20:40
基于Particle Photon 2与超声波传感器的智能潜水泵监控系统 1. 项目概述为什么我们需要一个智能化的地下室水位监控器如果你家里有地下室并且安装了一台潜水泵Sump Pump那你一定对那种雨季来临时的隐隐担忧感同身受。潜水泵是守护家庭地下空间免受水患侵袭的最后一道防线但它本身也是一个潜在的故障点。电机老化、浮球开关卡住、电源意外中断甚至是在暴雨如注、你最需要它的时候它恰好罢工了——这种场景想想都让人头皮发麻。传统的应对方式无非是定期手动检查或者祈祷它永远别坏。但在这个万物互联的时代我们完全有能力做得更好。这个“基于 Particle Photon 2 的潜水泵监控器”项目就是为了解决这个痛点而生。它的核心目标是赋予你那台默默工作的潜水泵以“感知”和“通信”的能力。它不再是一个黑箱设备而是变成一个你可以随时远程查看状态、接收异常警报的智能节点。想象一下无论你是在办公室、在度假还是深夜熟睡一旦地下室水位异常、水泵启动频繁或停止工作你的手机都能立刻收到通知让你有充足的时间反应避免财产损失。我选择 Particle Photon 2 作为这个项目的核心是因为它在物联网IoT开发中完美平衡了易用性、可靠性和云端服务。对于家庭自动化或环境监控这类项目我们需要的不是一个需要复杂配置的网络服务器而是一个开箱即用、能稳定连接云端、并允许我们通过手机App或网页轻松管理设备的方案。Particle 的生态系统正好提供了这一切。通过这个项目你将不仅打造一个实用的工具更能深入理解如何将物理世界的信号水位转化为数字世界的可操作数据并建立起一个完整的、低成本的物联网监控链路。2. 核心需求解析与系统设计思路在动手焊接任何一根线之前我们必须把需求想清楚。一个有效的潜水泵监控器绝不仅仅是“测一下水位”那么简单。它需要成为一个可靠的预警系统。基于日常使用中可能出现的故障模式我梳理了以下几个核心监控维度2.1 核心监控参数定义水位状态这是最直接的参数。我们需要知道水坑Sump Pit里的水是处于安全低位、正在上升还是已经触发了水泵工作的高水位。更关键的是要能检测“水泵已启动但水位持续不降”的故障状态。水泵运行状态水泵是否正在通电运行它一天启动了多少次每次运行了多久频繁启停可能意味着进水过大或浮球开关设置不当而长时间运行则可能预示水泵功率不足或排水管堵塞。系统电源状态监控器自身和潜水泵的供电是否正常意外断电是导致地下室被淹的主要原因之一。异常警报当以上任何参数超出安全阈值时系统必须能主动、及时地向用户发出警报。2.2 硬件选型与架构设计围绕上述需求我设计了如下硬件架构核心是Particle Photon 2主控单元Particle Photon 2这是一款基于 RTL872x 芯片的 Wi-Fi 物联网开发板。它内置了 Particle 的 Device OS支持 OTA空中升级最重要的是它无缝集成了 Particle Cloud。这意味着我们无需自建服务器就能实现设备管理、数据推送和远程函数调用。其板载的 RGB LED 和多功能按钮在开发和调试阶段也非常有用。水位传感方案非接触式超声波传感器HC-SR04这是本项目的关键传感器选型。为什么不使用直接接触水面的浮球或电极式传感器因为潜水泵坑内环境恶劣可能存在油脂、杂物接触式传感器易腐蚀、易卡住。HC-SR04 通过发射和接收超声波来测量距离我们可以将其安装在坑盖下方测量水面到传感器的距离从而换算出水位高度。这种方式干净、可靠且安装灵活。水泵运行状态检测交流电流传感器ACS712-30A要判断水泵是否真的在运转最可靠的方法是检测其工作电流。ACS712 是一款基于霍尔效应的线性电流传感器模块可以非侵入式地测量流经水泵电源线的交流电流。当电流值超过一个设定的阈值例如 0.5A我们就可以判定水泵正在运行。这比监测水泵电源电压或听声音要准确得多。电源与可靠性保障双路供电为 Photon 2 供电的 5V USB 电源适配器其自身插座的供电状态就是我们需要监控的“系统电源”。同时通过 ACS712 监控的潜水泵供电线路代表了“水泵电源”。看门狗与状态保持虽然 Particle OS 很稳定但在恶劣环境下如雷击导致的电压波动程序可能跑飞。我们需要在软件层面实现逻辑看门狗并在关键状态如警报触发时将信息保存到 Photon 2 的保留内存Retained Memory中即使意外重启也能恢复状态。整个系统的工作流程可以概括为超声波传感器周期性测量水位电流传感器监测水泵电流Photon 2 处理这些数据根据逻辑判断系统状态并通过 Wi-Fi 将状态更新到 Particle Cloud同时在本地通过 LED 显示状态。当发生异常时通过 Cloud 向用户手机发送推送通知。3. 硬件搭建与电路连接详解理论清晰后我们开始动手搭建。这是一个低压直流电路与市电交流电路共存的项目安全是第一要务。在连接任何与市电相关的部分时请务必断开总电源并确保所有高压接口都已绝缘处理。3.1 所需材料清单类别器件名称规格/型号数量说明核心控制IoT开发板Particle Photon 21主控制器水位传感超声波测距模块HC-SR041测量水面距离电流检测交流电流传感器ACS712-30A1检测水泵工作电流电源5V USB电源适配器5V/2A1为整个监控电路供电连接继电器模块可选5V触发触点容量10A以上1用于安全隔离和扩展控制线材与结构杜邦线公对公、公对母-若干信号连接电工胶带、热缩管-若干绝缘保护微型断路器或插头插座可选-1套安全地接入水泵电源线防水盒-1安装电路板远离水汽安装支架-1固定超声波传感器3.2 电路连接步骤与原理我们将电路分为低压控制部分和高压检测部分。强烈建议你先在面包板上完成所有低压部分的连接和测试确认无误后再进行与市电相关的操作。第一步连接超声波传感器HC-SR04到 Photon 2HC-SR04 有4个引脚VCC, Trig, Echo, GND。VCC- Photon 2 的3V3引脚。注意HC-SR04 虽然标称5V但其 Echo 脚输出是5V TTL直接接 Photon 2 的 GPIO 有风险。稳妥做法是接 3.3V并在 Echo 脚和 Photon 2 的输入引脚之间加一个简单的分压电路例如1kΩ和2kΩ电阻将5V信号降至3.3V左右。这是第一个容易忽略的细节。GND- Photon 2 的GND。Trig(触发) - Photon 2 的某个数字引脚如D2。Echo(回响) - 通过分压电路后连接到 Photon 2 的某个数字引脚如D3。注意分压电路至关重要。直接将5V的 Echo 信号接入 Photon 2 的 GPIO仅耐受3.3V可能会永久损坏主板。一个简单的方案是Echo 脚串联一个1kΩ电阻后接到 Photon 2 的 D3同时在 D3 和 GND 之间连接一个2kΩ电阻。这样电压大约被分压至 5V * (2k/(1k2k)) ≈ 3.33V。第二步连接电流传感器ACS712到 Photon 2ACS712 模块通常有3个接口用于连接主控板VCC, OUT, GND。VCC- Photon 2 的3V3或5V查看你的模块规格新版多为3.3V-5V兼容。GND- Photon 2 的GND。OUT(模拟输出) - Photon 2 的某个模拟输入引脚如A0。ACS712 的输出是模拟电压其零点无电流时通常是 VCC/2。当有交流电流通过时输出会在该零点上下波动。第三步关键且需谨慎接入水泵电源线进行电流检测这是项目中唯一涉及市电110V/220V AC的部分务必断电操作准备一个微型断路器或一个带连线的插头插座作为安全的中间连接件。不要直接剪断水泵的永久电源线。将水泵的电源线火线断开串联接入 ACS712 模块的电流穿孔。ACS712 模块上有一个标有“IP”和“IP-”的穿孔电流方向从 IP 流向 IP-。你需要将电源的火线L穿过这个孔。零线N和地线PE直接通过不经过传感器。确保所有裸露的导线接头都用焊锡焊牢并套上热缩管绝缘最后用电工胶带固定。将 ACS712 模块本身固定在防水盒内远离金属部件。第四步整体供电与安装将 Photon 2、接线节点等所有低压部件放入防水盒中。使用 USB 电源适配器为 Photon 2 供电。这个适配器应插在一个你希望监控的、不会轻易被关闭的插座上。这样如果这个插座断电我们也能通过 Photon 2 的离线状态感知到“系统断电”。将超声波传感器通过延长线固定在潜水泵坑的盖板下方正对水面确保其与水面之间没有障碍物并考虑水面波动和可能产生的泡沫影响。将整个防水盒安装在泵坑附近干燥、通风的墙面上。4. 软件实现与Particle Cloud集成硬件是骨架软件是灵魂。我们将使用 Particle 的 Web IDE (Particle Build) 或本地开发的 Particle Workbench 来编写固件。4.1 核心变量与状态定义首先在代码中定义关键参数和状态变量。这些值需要你根据自家泵坑的实际尺寸和水泵特性进行调整。// 参数定义 - 需要根据实际情况校准 #define TRIG_PIN D2 #define ECHO_PIN D3 #define CURRENT_SENSOR_PIN A0 // 超声波测距参数单位厘米 #define SENSOR_HEIGHT 50.0 // 传感器安装面到泵坑底部的垂直距离 #define ALARM_HIGH_LEVEL 20.0 // 高水位警报阈值距离传感器底面 #define PUMP_ON_LEVEL 25.0 // 水泵应启动的水位距离传感器底面 #define PUMP_OFF_LEVEL 45.0 // 水泵应停止的水位距离传感器底面 // 注意距离值越小表示水位越高。例如测得距离为15cm表示水面离传感器只有15cm水位很高。 // 电流检测参数 #define CURRENT_THRESHOLD 0.5 // 电流阈值安培大于此值认为水泵在运行 #define ACS712_ZERO_POINT 2048 // 对于5V供电的ACS712无电流时模拟读数约为2048 (4096/2) #define ACS712_SENSITIVITY 0.066 // 30A模块的灵敏度约为66mV/A // 系统状态变量 enum PumpState { PUMP_IDLE, PUMP_RUNNING, PUMP_FAILURE }; PumpState currentPumpState PUMP_IDLE; float currentWaterLevel 0.0; // 单位厘米距离传感器距离 bool highWaterAlarm false; bool powerFailureAlarm false; unsigned long pumpStartTime 0; int pumpCycleCountToday 0; unsigned long lastPumpRunDuration 0; // 保留内存变量系统重启后数据不丢失 retained bool retainedHighWaterAlarm false;4.2 主循环逻辑与传感器读数处理主循环中我们需要周期性地执行测量、判断和发布状态。void loop() { unsigned long currentMillis millis(); // 每2秒测量一次水位 if (currentMillis - lastWaterCheck 2000) { lastWaterCheck currentMillis; measureWaterLevel(); checkWaterAlarms(); } // 每秒检测一次水泵电流 if (currentMillis - lastCurrentCheck 1000) { lastCurrentCheck currentMillis; bool pumpRunning checkPumpCurrent(); updatePumpState(pumpRunning, currentMillis); } // 每30秒或状态变化时发布状态到云端 if (currentMillis - lastPublish 30000 || stateChanged) { publishSystemStatus(); stateChanged false; lastPublish currentMillis; } Particle.process(); // 处理云端通信 } float measureWaterLevel() { // 触发超声波传感器 digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // 读取回响脉冲持续时间 long duration pulseIn(ECHO_PIN, HIGH, 30000); // 超时30ms约5米距离 // 计算距离声速取340m/s除以2因为是往返距离 currentWaterLevel (duration * 0.0343) / 2.0; // 简单的数据滤波如果读数异常如超出物理范围则保留上一次有效值 if (currentWaterLevel SENSOR_HEIGHT || currentWaterLevel 2.0) { currentWaterLevel lastValidWaterLevel; } else { lastValidWaterLevel currentWaterLevel; } return currentWaterLevel; } bool checkPumpCurrent() { int sensorValue analogRead(CURRENT_SENSOR_PIN); // 将模拟读数转换为电压再计算电流 float voltage (sensorValue - ACS712_ZERO_POINT) * (5.0 / 4096.0); // Photon 2 ADC为12位0-4095 float current voltage / ACS712_SENSITIVITY; // 取绝对值因为交流电流有正负波动 if (fabs(current) CURRENT_THRESHOLD) { return true; } return false; }4.3 状态机与警报逻辑这是项目的“大脑”负责根据水位和电流信息判断水泵的工作状态是否正常。void updatePumpState(bool pumpRunning, unsigned long currentTime) { switch (currentPumpState) { case PUMP_IDLE: if (currentWaterLevel PUMP_ON_LEVEL) { // 水位达到启动线但水泵没转可能是故障 if (!pumpRunning) { // 等待一个合理延迟比如10秒防止水位波动误判 if (currentTime - timeEnteredIdle 10000) { currentPumpState PUMP_FAILURE; triggerAlarm(PUMP_START_FAILURE, Water high but pump not running.); stateChanged true; } } else { // 水泵正常启动 currentPumpState PUMP_RUNNING; pumpStartTime currentTime; pumpCycleCountToday; stateChanged true; } } break; case PUMP_RUNNING: if (!pumpRunning) { // 水泵停止运行了 lastPumpRunDuration currentTime - pumpStartTime; currentPumpState PUMP_IDLE; timeEnteredIdle currentTime; stateChanged true; // 可以在这里判断水泵运行时间是否过短或过长作为健康度参考 if (lastPumpRunDuration 5000) { // 运行时间太短可能是“水锤”效应或浮球开关问题 Particle.publish(pump_short_cycle, String(lastPumpRunDuration)); } } else { // 水泵一直在运行检查水位是否在下降 if (currentTime - pumpStartTime 120000) { // 运行超过2分钟 if (currentWaterLevel PUMP_ON_LEVEL - 5.0) { // 水位下降不明显 currentPumpState PUMP_FAILURE; triggerAlarm(PUMP_RUNNING_FAILURE, Pump running but water level not dropping.); stateChanged true; } } } break; case PUMP_FAILURE: // 故障状态需要手动干预或远程复位 // 可以在这里闪烁LED或等待云端发送复位命令 break; } } void checkWaterAlarms() { bool newHighWaterAlarm (currentWaterLevel ALARM_HIGH_LEVEL); if (newHighWaterAlarm !highWaterAlarm) { // 首次触发高水位警报 highWaterAlarm true; retainedHighWaterAlarm true; // 存入保留内存 triggerAlarm(HIGH_WATER, String(Water level critical: ) String(currentWaterLevel) cm); } else if (!newHighWaterAlarm highWaterAlarm) { // 高水位警报解除 highWaterAlarm false; retainedHighWaterAlarm false; Particle.publish(alarm_cleared, HIGH_WATER); } }4.4 云端集成与警报推送Particle 的强大之处在于其云端集成。我们可以通过Particle.publish发布事件并通过 Particle Cloud 的 Webhook 功能将事件转发到其他服务如 IFTTT、Slack 或直接发送邮件、短信。发布事件在triggerAlarm函数中我们使用Particle.publish。void triggerAlarm(const char* event, const char* data) { Particle.publish(sump_alarm, data, PRIVATE); // PRIVATE事件只有你的账户可见 // 同时可以控制板载LED变为红色闪烁 RGB.color(255, 0, 0); RGB.blink(200, 100); }创建Webhook在 Particle Console 中创建一个新的 Webhook。事件名称填写sump_alarmURL填写你想要的推送服务地址。例如使用 IFTTT 的 Webhook 服务URL 类似https://maker.ifttt.com/trigger/sump_pump_alarm/with/key/your_key请求格式选择JSON可以包含{{event}},{{data}},{{published_at}}等变量。设备选择你的 Photon 2 设备。配置IFTTT Applet在 IFTTT 中设置当收到 Webhook 请求时触发动作比如发送手机推送通知IFTTT App、短信或邮件。通知内容可以自定义包含警报类型、时间、水位等信息。远程函数与变量你还可以暴露一些函数和变量到云端实现远程控制。// 在setup()中注册 Particle.function(resetAlarm, resetAlarmHandler); Particle.variable(waterLevel, currentWaterLevel, DOUBLE); Particle.variable(pumpState, currentPumpState, INT); int resetAlarmHandler(String command) { if (command.equals(reset)) { highWaterAlarm false; currentPumpState PUMP_IDLE; RGB.color(0, 255, 0); // 绿色表示正常 return 1; } return -1; }这样你就可以通过 Particle App 或 API 调用远程读取水位、水泵状态并在处理完故障后远程复位警报。5. 校准、安装调试与长期维护指南系统搭建完成后校准是确保数据准确的关键一步。安装调试则决定了系统的长期稳定性。5.1 传感器校准实战超声波传感器校准空距校准在无水状态下测量传感器到泵坑底部的实际距离H_actual。运行程序读取currentWaterLevel的稳定值H_measured。计算偏移量Offset H_actual - H_measured。在measureWaterLevel()函数的返回结果上加上这个Offset。满距校准向泵坑内注入已知深度的水例如30cm再次比较测量值与实际值微调偏移量。注意水面波动和泡沫会导致读数跳跃软件上需要做平滑滤波比如取最近5次测量的中位数或平均值。ACS712电流传感器校准这是最需要耐心的一步。在潜水泵未启动时读取analogRead(CURRENT_SENSOR_PIN)的稳定值这就是你的实际ACS712_ZERO_POINT。它可能不是理想的2048。让水泵单独运行关闭其他可能共用电路的设备用一个钳形电流表测量其真实工作电流I_real。同时记录此时ACS712的模拟读数ADC_value。计算灵敏度Sensitivity ( (ADC_value - ACS712_ZERO_POINT) * (5.0 / 4096.0) ) / I_real。用这个计算出的灵敏度替换代码中的宏定义。对于30A模块这个值应该在0.066左右。5.2 现场安装与调试要点超声波传感器安装务必垂直向下安装固定牢固。传感器表面与水面之间必须空旷。如果坑内有管道或电线尽量避开。考虑在传感器下方加一个小的喇叭状导波罩用塑料片制作可以减少声波散射提高在狭窄坑内的测量稳定性。电流传感器接线所有高压接线必须牢固、绝缘。完成后用万用表通断档检查确保火线确实穿过了ACS712的孔且没有与其他线路短路。首次通电时最好用非接触式电笔确认一下。防水与防潮电路板一定要放在防水盒中。超声波传感器的连接线穿过盒子的地方要用防水接头或打上防水胶。泵坑附近湿度极高盒内可以放一包硅胶干燥剂。Wi-Fi信号测试将安装好的设备上电通过 Particle App 观察其是否能在泵坑位置稳定连接你的家庭Wi-Fi。如果信号弱RSSI值低于 -70考虑加装Wi-Fi中继器或者使用 Particle 的 Boron蜂窝网络版作为备选方案。5.3 长期维护与故障排查即使系统运行稳定定期检查和维护也是必要的。定期如每季度检查手动向泵坑倒水触发水泵运行观察监控器的状态上报和警报是否及时准确。检查超声波传感器表面是否有蜘蛛网、灰尘或水垢及时清理。确认 Particle 设备在线状态测试一次手动警报触发比如临时拔掉水泵电源。常见问题排查速查表现象可能原因排查步骤设备频繁离线Wi-Fi信号弱电源不稳定。1. 查看 Particle Console 设备最后在线时间。2. 检查安装位置 RSSI。3. 尝试更换 USB 电源适配器。水位读数恒为0或极大值超声波传感器接线错误或损坏水面有大量泡沫。1. 检查 Trig/Echo 引脚连接和分压电路。2. 用串口调试打印原始脉冲时间duration。3. 清理水面或调整传感器安装高度。水泵运行但电流检测不到ACS712 接线错误水泵电流过小低于阈值。1.断电后确认火线正确穿过传感器孔。2. 用钳形表实测水泵启动电流调整CURRENT_THRESHOLD。3. 检查 ACS712 的 VCC 供电电压。误报高水位警报水位阈值ALARM_HIGH_LEVEL设置过小传感器误测。1. 观察正常和暴雨时的水位波动范围重新设定阈值。2. 在软件中增加警报延迟判断例如连续3次测量超限才触发。收不到手机警报IFTTT Applet 未激活Webhook 配置错误网络问题。1. 在 Particle Console 的 “Events” 页查看sump_alarm事件是否成功发布。2. 检查 IFTTT 的 Webhook 服务状态。3. 测试一个简单的Particle.publish事件看能否收到。我个人在实际部署中的深刻体会是可靠性高于一切。这个系统监控的是可能造成重大财产损失的风险点因此它的每一个环节都必须考虑冗余和失效安全。例如我的代码中加入了“看门狗”逻辑如果超过24小时没有向云端发送任何状态可能程序死锁我会让 Photon 2 通过一个物理看门狗芯片或软件定时器强制重启。此外所有关键的警报状态都使用了retained变量确保即使意外重启警报灯和状态也能保持直到被手动复位。最后不要完全依赖网络警报保留设备本地的声光报警可以加一个蜂鸣器作为最后一道防线因为极端天气有时会导致网络中断。这个项目教会我的不仅是物联网技术的拼接更是如何以工程师的思维去构建一个真正让人安心的守护系统。