宠物饮水机这东西,市面上早就不是新鲜玩意了,但绝大多数产品说白了就是个“循环过滤水泵+储水桶”的组合,水泵从开机到关机一直转,水一直在循环,滤芯一直在消耗。真正让这个项目有意思的点,在于“宠物存在检测”和“靠近感应出水”这两个词——这意味着产品逻辑从“全天候循环”变成了“按需出水”,从纯机械结构升级成了带感知和决策的智能设备。
这个标题背后对应的是两个很实际的需求:一是水资源和滤芯的浪费,猫狗一天真正喝水的时间加起来可能不到一小时,但循环泵却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适配器。水泵峰值电流500mA,ESP32和雷达模块的功耗加起来不超过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小时就点亮清洗指示灯。
这个项目做到最后,最让我满意的不是省了多少电,而是猫咪喝水的姿态变了。之前用传统循环饮水机,猫咪总是竖起耳朵警惕着接近,喝水的时候机身在嗡嗡震。现在感应出水后,它走过去,水慢慢地涌出来,没有噪音,它会低下头安静地喝很久。这个细节,才是这类产品真正的价值所在。
后续如果想升级,可以考虑在雷达数据的基础上加入宠物行为分析,比如通过距离变化速度判断宠物是主动来喝水还是无意路过,进一步降低误触发率。这属于算法层面的优化,现有硬件完全支持,不需要改动结构。