基于毫米波雷达的宠物饮水机存在检测与按需出水设计
宠物饮水机这东西市面上早就不是新鲜玩意了但绝大多数产品说白了就是个“循环过滤水泵储水桶”的组合水泵从开机到关机一直转水一直在循环滤芯一直在消耗。真正让这个项目有意思的点在于“宠物存在检测”和“靠近感应出水”这两个词——这意味着产品逻辑从“全天候循环”变成了“按需出水”从纯机械结构升级成了带感知和决策的智能设备。这个标题背后对应的是两个很实际的需求一是水资源和滤芯的浪费猫狗一天真正喝水的时间加起来可能不到一小时但循环泵却24小时运转滤芯寿命被无效消耗二是饮水机噪音很多宠物对水泵持续嗡嗡声很敏感尤其是猫咪靠近时出水、离开后静止的设计能大幅降低饮水压力。这篇文章我会从需求拆解、传感器选型、系统架构、核心代码逻辑、常见调试坑这几个维度完整梳理一遍适合正在做智能宠物硬件、或者想自己动手改装普通饮水机的朋友直接参考。1. 内容整体设计与思路拆解1.1 核心需求解析为什么需要“存在检测”和“靠近感应”先别急着谈技术选型我们把产品需求拆透。普通宠物饮水机的痛点是非常明确的滤芯消耗极快。循环泵24小时不停机水一直在过滤活性炭和离子交换树脂的寿命被白白消耗正常1-2个月换一次的滤芯可能三周就失效。水泵寿命折损。直流无刷水泵虽然耐用但常年不断电运行碳刷和密封圈的老化速度比想象中快很多。噪音干扰。哪怕宣传“超静音”的水泵夜深人静时放在卧室角落那个低频嗡鸣依然能被猫狗清晰的感知到。有些胆小的猫甚至会因为这个声音抗拒接近饮水机。水的二次污染。循环系统里滞留的死角容易滋生菌膜水流反复冲刷滤芯表面反而把截留的脏东西又带出来。而“靠近感应出水”这个设计本质上是把饮水机从“持续服务”改成“按需服务”。宠物靠近时感应模块输出触发信号主控开启水泵水流从水箱顶部或涌泉口流出宠物舔舐或观察一会儿后离开延时一段时间自动关泵。这套逻辑下的好处很直接滤芯寿命理论上可以延长数倍因为水泵的累计运行时间大幅缩短了。安静只在宠物真正需要喝水时才有水流声。水的新鲜度更高每次出水都是刚经过过滤的新鲜水而不是反复循环的老水。但这里有个产品逻辑上的取舍需要想清楚是“靠近就出水”还是“靠近并保持一定时间才出水”我在实际测试中发现如果感应阈值调得太灵敏宠物只是路过机器就喷一下水猫咪可能被吓到反而产生负面印象。所以从产品定义上就要明确这个检测的目的是“识别饮水意图”而不是“识别路过”。1.2 方案选型背后的考量三种主流检测技术对比核心的感应方案通常有这么几条路方案原理检测距离优点缺点PIR热释电红外检测目标与环境的温差3-5米方案成熟、成本极低几块钱、功耗极低宠物体温与环境温差小时灵敏度下降夏季或暖气房间只能检测移动宠物趴着不动就失效穿透力差毫米波雷达多普勒效应检测微小位移2-6米不受温度影响能检测呼吸级别的微小动作可区分存在与移动成本偏高模块20-60元调试门槛高存在轻微辐射争议功率其实很小超声/红外ToF发射声波或激光测距0.2-2米能精确测距成本中等可以做“靠近”概念的精细化距离分层光学透镜容易脏污猫毛狗毛遮挡后灵敏度骤降功率和功耗偏高我最后的结论是量产产品用PIR成本最好但实际体验上限有限DIY或高端产品用毫米波雷达体验最佳。如果做得是一个注重体验的个人项目或高端产品毫米波雷达才是真正能实现“存在检测”的方案而不仅仅是“移动检测”。我自己做原型时用了24GHz的毫米波雷达模块可以输出目标存在状态有人/无人并且附带距离信息。初期调试有个特别有意思的现象猫蹲在饮水机旁边舔毛毛发的轻微抖动都能被雷达判定为“存在”所以它的判定稳定性远超PIR。如果你用的是PIR建议一定要搭配“离开延时”逻辑——检测到移动后持续出水10-15秒即使宠物已经趴下不动了水还在流等待它低头去喝不能说人一停水就停。1.3 明确的产品逻辑边界给这个项目划定一个明确的逻辑边界会让后续开发少走很多弯路靠近感应出水不等于靠近就一直出水。需要设置最大单次出水时长比如40秒防止宠物不在水嘴附近时水泵空转。存在检测的核心价值是节能和安静但如果检测模块本身功耗很高那就背离了初衷。所以整个系统的待机功耗目标应该控制在0.5W以内最好做到0.2W以下。传感器只做触发不做决策闭环。这听起来有点反直觉但实际这样做更可靠。传感器只负责输出“有没有宠物在附近”主控根据这个状态决定水泵怎么转——这个分层让系统调试变得简单也让后续接入手机App联动变得容易。2. 核心细节解析与实操要点2.1 传感器模块的选择与布置位置选传感器时别只看分辨率更要看响应时间和灵敏度等级。以毫米波雷达为例有些模块输出的是目标距离数值你需要自己写存在状态解析逻辑有些模块则直接给你一个高/低电平的“存在”信号后者用起来简单很多。摆放位置方面有几个关键点饮水机的水嘴一般在侧面或顶部雷达模块应该倾斜一定角度覆盖饮水机正前方30cm-80cm的扇形区域。这个区域就是宠物喝水时头部的活动区域。传感器不能和水泵离得太近水泵工作时会产生微弱电磁干扰虽然数字接口一般不受影响但为了保险电源线尽量和信号线分开走。外壳开孔的位置要注意如果传感器是PIR正面需要开一个透光窗口但不要正对太阳光或射灯否则红外能量会直接导致误触发。2.2 水泵的控制逻辑水泵的启停不是简单的“检测到人→开泵→人离开→关泵”中间有非常多的细节启动阶段雷达检测到宠物靠近并保持稳定存在约1秒后才启动水泵。这1秒的延迟非常关键能滤除宠物路过、尾巴扫过等瞬时信号。启动时水泵要软启动——PWM占空比从0逐渐升到100%这个过程大概持续300ms避免瞬间满转速把水管里的空气和水一起喷出来吓到宠物。稳定运行阶段水泵保持运转同时持续监控传感器状态。如果检测目标持续存在最多运行40秒后强制停止进入10秒冷却期。这是为了防止猫咪把水嘴当成玩具一直用爪子扒拉出水口导致水盆溢水。停止阶段优先策略是“目标消失且持续2秒无新目标”再关泵。这里设置2秒是因为宠物喝几口可能会抬头换气如果立刻关泵它会以为水没了。实测中这个2秒延时能显著提高宠物接受度。关泵前让PWM从100%降到30%运行500ms然后断电这样水路的残余水会平稳落回水箱不会在管道里形成气阻。2.3 水位检测与缺水保护很多DIY方案直接用干簧管浮球做缺水检测但实际体验并不好。浮球容易被水垢卡住而且它在水快耗尽前就已经处于半浮状态信号会抖动。我更推荐电极式水位检测配合水泵电流检测双保险在水箱底部放两个不锈钢电极利用水的导电性判断是否有水。注意用交流驱动或者高频脉冲驱动避免直流电解腐蚀电极。水泵启动后主控实时采样电机电流。如果空转没有水电流会明显低于正常带载状态。只要连续1秒检测到低电流立即停机并进入故障保护模式。这个双保险的好处是即便浮球或者电极失效水泵也不会干烧。2.4 出水结构设计“感应出水”的体验好坏很大程度取决于水怎么出来。常见的方案有涌泉式水泵从出水口向上喷出一小股水柱宠物舔舐水柱的根部。视觉上很吸引猫水滴落回水盘会产生流动感。但水柱高度很难控制太高溅水太低猫不感兴趣。翻盖式水泵把水抽到顶部水槽水位超过挡板后自动溢流下来形成一层薄薄的水膜。这种结构更接近自然溪流的感觉但需要整个水嘴部分设计得比较宽大。滴水式类似医院输液水滴间隔滴落。能保存水资源、噪音最小但水量可能无法满足大型犬的饮水需求。我做原型时选了涌泉式理由是省水和水流可见性更好。调试中发现一个容易被忽略的问题水柱高度和水泵的PWM占空比不是线性关系。在占空比20%时水柱只有3cm高到了35%突然蹿升到12cm——因为水路的空气没有完全排净时水泵做功先压缩气体气体排出后水流瞬间加速。所以第一次开机一定要做“排空气”动作全速运转3秒然后降到正常档位这样水柱才能稳定。3. 实操过程与核心环节实现3.1 系统架构与主控选型整个系统的架构非常清晰毫米波雷达存在检测 ──► 主控MCU状态决策 ──► 电机驱动PWM控制 ──► 水泵 电极式水位检测 ──► 主控MCU ──► OLED/LED状态指示 水泵电流采样 ──► 主控MCU硬件比较器中断主控我选了ESP32-C3理由是价格便宜十几块钱。自带WiFi/BLE后续如果想做手机App联动可以不用换主控。有足够多的ADC通道一路用来采水泵电流一路用来采电池电压如果是无线版本就非常实用。Deep Sleep模式下功耗可以做到10μA以下方便做电池供电版本。电机驱动用一颗几毛钱的MOS管AO3400就够了因为小水泵的工作电流一般只有200-500mA完全不需要电机驱动芯片。不过MOS管栅极必须串联100Ω电阻并在源极对地并联一个10kΩ下拉电阻防止上电时GPIO悬空导致水泵瞬间误启动。3.2 水泵选型与供电设计水泵选的是直流无刷隔离泵额定电压5V最大流量3L/min最大扬程0.8m。市面上很多宠物饮水机配的是廉价有刷水泵噪音大一截而且碳刷磨损后的粉末会污染水体。贵十几块钱换无刷泵是值得的。供电方案上我直接用了一个5V/2A的USB适配器。水泵峰值电流500mAESP32和雷达模块的功耗加起来不超过100mA所以2A的余量很充足。电源入口处放一个470μF电解电容和一个100nF陶瓷电容以抑制水泵启停瞬间的电压跌落。3.3 核心代码实现先定义状态机typedef enum { STATE_IDLE, // 空闲待机无宠物 STATE_CONFIRMING, // 检测到目标正在确认1秒 STATE_RUNNING, // 水泵运行中 STATE_COOLDOWN, // 强制停止后的冷却期 STATE_FAULT // 故障保护缺水/堵转 } SystemState;主逻辑循环void system_loop() { switch (current_state) { case STATE_IDLE: if (radar_presence TARGET_DETECTED) { confirm_timer 0; current_state STATE_CONFIRMING; } break; case STATE_CONFIRMING: confirm_timer; if (radar_presence TARGET_GONE) { current_state STATE_IDLE; } else if (confirm_timer 10) { // 1秒确认 pump_soft_start(); // 软启动 run_timer 0; current_state STATE_RUNNING; } break; case STATE_RUNNING: run_timer; // 检测缺水电流 if (motor_current DRY_CURRENT_MA dry_count 10) { pump_stop(); current_state STATE_FAULT; break; } // 最大运行40秒 if (run_timer 4000) { // 4000 * 10ms 40秒 pump_stop(); current_state STATE_COOLDOWN; break; } // 目标消失后延时2秒关泵 if (radar_presence TARGET_GONE) { leave_timer; if (leave_timer 200) { // 2秒 pump_stop(); current_state STATE_IDLE; } } else { leave_timer 0; } break; case STATE_COOLDOWN: cooldown_timer; if (cooldown_timer 100) { // 10秒 cooldown_timer 0; current_state STATE_IDLE; } break; case STATE_FAULT: // 故障恢复需要人为断电重启 break; } }泵的软启动用PWM逐渐增加占空比实现void pump_soft_start() { for (int pwm 0; pwm 255; pwm 5) { ledcWrite(PWM_CHANNEL, pwm); delay(6); } // 全速3秒排空气 ledcWrite(PWM_CHANNEL, 255); delay(3000); // 正常档位 ledcWrite(PWM_CHANNEL, 180); }3.4 参数计算与调试环境关于延时参数为什么取这些值我按宠物行为做了个简单统计猫靠近饮水机后平均花1-3秒找到水嘴位置所以启动确认时间取1秒合理。猫单次饮水的舔舐时间约10-20秒中间会有抬头换气动作单次抬头时间一般不超过2秒所以离开延时取2秒刚好衔接。反复确认目标不在但还出水超过40秒大概率是误触发或者宠物在玩水强制停机冷却10秒能有效避免溢水。调试的时候我建议加一个串口调试模式把雷达检测到的存在信号、距离值、状态机切换原因都打印出来。这样你能看到真实场景下状态机的每次跳转比盲调参数高效得多。4. 常见问题与排查技巧实录4.1 问题速查表现象可能原因排查与解决宠物靠近不出水雷达灵敏度设置太低安装角度不对检测区域没覆盖水嘴前先看串口日志确认雷达是否输出“检测到”信号用TTL线连雷达模块调整安装角度使水嘴前30-50cm落入检测区宠物路过频繁误触发确认时间过短检测距离过远覆盖了过道把确认时间从1秒加到2-3秒调整雷达模块的检测距离阈值毫米波模块通常有距离门限寄存器出水一下停一下宠物抬头换气间隙超过2秒将离开延时从2秒加到3秒观察是否改善如果还不行检查是不是雷达信号被水柱遮挡产生衰减水泵间歇性停转缺水保护误判电流采样噪声大测一下空转电流和正常带载电流的差值把电流阈值设在二者中间值再加一个50ms的软件去抖动第一天用得好好的第二天一直不出水水嘴或水管进了猫毛堵塞雷达表面被水渍覆盖拆开水嘴清理雷达模块表面加疏水涂层或调整安装角度避开溅水范围猫接近时机器突然启动猫被吓跑出水太急、水柱太高启动声音突然太大软启动时间从300ms延长到800ms让泵声和水流逐渐出现水柱通过降低运行占空比调矮一点从180降到150左右4.2 我踩过的几个坑坑一PIR方案在夏天直接失灵。最早的原型用了PIR传感器冬天测试体验完美。到了夏天室温接近30℃猫的体温和环境的温差只有3-4℃PIR灵敏度降到几乎为零猫趴在旁边舔了五分钟水机器纹丝不动。后来换成毫米波雷达才彻底解决。所以如果你选PIR一定要买带灵敏度电位器的高端型号并且实际验证夏季场景而不是只看冬天的效果。坑二水泵放在水箱底部会引起气泡误判。刚开始把水泵完全浸没在水箱底部吸水口离水面太近。水泵一旦启动吸水会在吸水口形成一个漏斗状漩涡把空气卷进叶轮。空气混入水流后电流会周期性波动导致缺水保护误触发。解决方案是把吸水口抬高2cm或者在水泵吸水口加一个不锈钢滤网破坏漩涡形成条件。坑三雷达模块的盲区问题。所有雷达都有检测盲区我这个模块的盲区是0-20cm。猫咪第一次探头喝水时头部离雷达非常近直接进入盲区雷达反而认为“目标消失”水就停了。后来我把雷达模块安装位置往后退了几厘米并在软件里加了一条策略从远处检测到目标靠近后即使目标进入盲区也保持“存在”状态10秒。这样就把盲区问题绕过去了。4.3 功耗实测数据在5V供电下待机状态雷达运行、主控浅睡眠、水泵关闭的电流约35mA功耗约0.18W。水泵运行时电流430mA功耗约2.15W。如果一只猫一天触发8次喝水每次平均运行25秒一天的耗电量大约是水泵8次 × 25秒 × 2.15W ÷ 3600 ≈ 0.12Wh待机24小时 × 0.18W 4.32Wh全天总计 ≈ 4.44Wh也就是说一个月用电量大约0.13度可以忽略不计。4.4 给产品化提个醒如果这只是做个自己用的原型上面这些就够了。但如果要往产品化方向走有几个点必须提前考虑毫米波雷达模块的认证问题。24GHz频段在多数地区属于ISM频段但发射功率有严格限制选模块时一定要确认它有没有相关认证。防水等级。饮水机外壳难免溅水所有传感器接口必须做防水处理至少是IPX4级别。雷达模块表面不建议直接用胶水覆盖会影响电磁波透射率最好用卡扣式透明罩隔离。水箱清洗提示。感应出水的机器水泵不常转滤芯寿命延长了但水箱内壁反而更容易在静止状态下滋生生物膜。建议加一个“累计运行时间”统计每累计运行8小时就点亮清洗指示灯。这个项目做到最后最让我满意的不是省了多少电而是猫咪喝水的姿态变了。之前用传统循环饮水机猫咪总是竖起耳朵警惕着接近喝水的时候机身在嗡嗡震。现在感应出水后它走过去水慢慢地涌出来没有噪音它会低下头安静地喝很久。这个细节才是这类产品真正的价值所在。后续如果想升级可以考虑在雷达数据的基础上加入宠物行为分析比如通过距离变化速度判断宠物是主动来喝水还是无意路过进一步降低误触发率。这属于算法层面的优化现有硬件完全支持不需要改动结构。