十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

宠物饮水机靠近感应出水:ToF存在检测与低功耗嵌入式实战

宠物饮水机靠近感应出水:ToF存在检测与低功耗嵌入式实战 每次看到我家猫蹲在自动饮水机旁边等水明明机器一直在循环流水它就是愿意守在出水口等着我就觉得这个产品还有很大优化空间。传统宠物饮水机最常见的方案是24小时持续循环过滤水倒是流动了但滤芯消耗快、电机噪音大而且有些胆小的猫会被持续的水声吓得不敢靠近。我这个项目思路很直接——宠物饮水机加上宠物存在检测靠近感应出水只在你家毛孩子真正站到饮水机面前时才开始供水。目前这套方案已经跑了两个多月稳定性和功耗表现都超出我的预期。这篇会把传感器选型、硬件电路、检测逻辑、低功耗策略、排障实录全部拆开讲适合正在折腾智能宠物用品、或者刚入坑单片机自动控制的朋友参考。1. 项目定位与技术方案选型1.1 宠物饮水机为什么要做“靠近感应出水”先理清楚这类产品的真实痛点。市面上的宠物饮水机无非三种工作模式第一种是24小时循环过滤水泵不停转水里杂质确实能被滤芯带走但滤芯寿命基本按月算水泵长期运行还会积累菌膜第二种是定时喷泉每隔一段时间让水泵转几分钟本质上还是定时器和宠物有没有来喝水完全没关系第三种就是我这次想做的方向按需出水通过存在检测判断宠物是否靠近靠近才启动水泵离开后自动停止。按需出水带来的好处比想象中多。首先是安静水泵只在十几秒内运行没有持续的嗡嗡声对听觉灵敏的猫狗友好很多其次是省电水泵是全机功率大头从一天转24小时变成一天累计转三五分钟静态功耗一下子降到毫安级别最后是水的新鲜度宠物每次喝到的都是刚泵出来的流动水比反复循环很久的水质体验好不少。这些优势能不能实现关键就看存在检测方案选得对不对。1.2 几种“宠物存在检测”传感器怎么选“存在检测”听起来简单但用在不同场景里的传感器差异巨大。我梳理了一下市面上能买到的几类传感器各有各的脾气。传感器类型典型型号检测原理优点缺点是否适合本项目红外反射式红外对管、E18-D80NK发射红外光接收反射光强度变化便宜、电路简单检测距离近、容易被环境光干扰勉强可用不推荐红外热释电HC-SR501 PIR检测人体/动物体温与环境的温差变化便宜、静态功耗低只对“移动”敏感宠物蹲下喝水时反而测不到不适合存在检测超声波测距HC-SR04发射超声波计算回波时间成本低、距离远盲区大、对软质物体猫毛反射差可作为备选红外ToF测距VL53L0X / VL53L1X激光反射飞行时间测距精度毫米级、体积小、静态物体也能测成本略高室外强光受影响推荐微波雷达RCWL-0516、24G毫米波多普勒效应/微动检测能穿透遮挡、灵敏度可调可能被周围环境误触发想折腾可以试我最终选的是VL53L0X红外ToF测距模块。核心原因是它能输出真实的距离数值而不是单纯的“有/无”信号这样我可以在代码里做阈值判断和滤波逻辑。举个例子PIR只能告诉你“刚才有东西动了一下”如果猫已经趴在饮水机旁边不动了PIR就彻底失明但ToF传感器每一帧都在测距离猫在那里就是那个距离值静止也逃不掉。这种“测距型存在检测”对于出水控制来说非常关键因为猫喝水时身体是相对静止的只有能稳定感知静止目标的传感器才靠谱。2. 硬件搭建与电路设计细节2.1 核心器件清单与选型理由这套系统的硬件清单并不复杂核心器件有六个主控、距离传感器、水泵、驱动电路、水位检测、电源。主控我用的是Arduino Nano兼容板便宜、资料多、3.3V和5V引脚都齐全。VL53L0X是I2C接口供电范围2.8V到5V和Arduino直接相连就行。水泵选择的是3V到5V直流潜水泵静态电流不大扬程大概0.5米到1米驱动模块是AO3400 N沟道MOS管。提醒一句水泵直接接在单片机引脚上肯定是不行的启动电流会拉垮主控电压必须用MOS管或继电器做功率开关。我选MOS管而不是继电器的原因是继电器线圈有电感开关瞬间会产生反向电动势对低功耗电路不友好而MOS管开关速度快、导通电阻小控制逻辑也简单。水位检测我用的是两根不锈钢电极加一个1MΩ分压电阻原理就是利用水的导电性当水位低于电极位置时电极之间相当于断路单片机读到的电平会变化。这个方案比浮球开关更省钱也更适合放在小水槽里。2.2 电路连接与防水防倒灌处理电路连接方式如下VL53L0X的SDA、SCL分别接到Arduino的A4、A5引脚VCC和GND对应接好水泵正极接电源正负极接MOS管的D极MOS管的S极接GNDG极通过一个100Ω电阻接到Arduino的D9引脚同时G极对GND再并一个10kΩ下拉电阻防止上电瞬间水泵误转水位检测电极一端接Arduino的5V另一端接A1引脚A1引脚对GND接1MΩ电阻。这套项目比较容易被忽略的是防水。饮水机内部有水、有蒸汽电路板一旦受潮轻则误触发重则短路。我的做法是把电路板装在一个独立的透明塑料盒里盒盖用704硅胶密封所有线材出口都打上玻璃胶。传感器不能完全密封否则测距会穿过塑料盖子产生偏差我的处理是让VL53L0X的发射窗口朝下用热熔胶固定在一个开孔的位置镜头和外界之间自然形成一个小的空气腔既能测距又不会被水直接溅到。防倒灌也很关键。出水口和水泵之间如果管路布置不合理停机后水会顺着管路倒流回泵体下次启动时泵腔里有空气会出现空转几秒才出水的情况。我加了一个单向阀并且在管路里做了个向上的U型弯让水不能形成“虹吸”回流。这个细节看起来小但直接影响每次出水体验值得提前设计到位。3. 检测逻辑与出水控制实现3.1 存在检测算法阈值、连续采样与防误触发硬件搭好之后软件的检测逻辑才是这个项目的灵魂。我先把需求拆成几个明确的问题猫离饮水机多远算“靠近”是测一次距离就触发出水还是连续确认后才触发宠物离开后多久停水我设置的核心检测距离是40cm。这个距离不是拍脑袋定的我观察了家里猫的饮水习惯它在靠近饮水机时会有明显的低头动作头部距离传感器大概在15cm到35cm之间40cm阈值既能覆盖这个范围又不至于把人从旁边经过也算进去。只测一次距离就触发是最蠢的做法因为传感器偶尔会收到环境里的异常反射比如突然有一束阳光照过、墙壁反光、人快速经过距离值会有瞬间跳变。我加了一个连续确认机制代码里循环读5次距离值每次间隔30ms只要其中3次低于40cm阈值才判定为“宠物存在”。这个去抖逻辑在工程上叫滑动窗口确认能过滤掉大部分瞬时干扰。另外我加了一个距离下限判断如果传感器读到的距离低于20mm我直接忽略它。因为ToF传感器本身有最小测量距离太近的读数反而不可靠而且现实中也不太可能有宠物的脑袋直接怼到传感器镜头上。在代码里限制上下边界能让系统更健壮。3.2 出水控制状态机与保护逻辑出水控制我实现成了一个状态机比用标志位硬堆更清晰。整套系统有四个状态空闲、确认、出水、冷却。空闲状态下只做周期性测距确认状态下连续采样距离值做判断出水状态下启动水泵并计时冷却状态是防止猫一直蹲在饮水机边上导致水泵连续工作过热。enum State { IDLE, CONFIRM, PUMPING, COOLDOWN }; const uint16_t TRIGGER_CM 40; const uint32_t PUMP_MAX_MS 8000; const uint32_t COOLDOWN_MS 3000; State state IDLE; uint32_t stateStart; void loop() { switch (state) { case IDLE: if (isNear()) state CONFIRM; break; case CONFIRM: if (isNear()) { pumpOn(); state PUMPING; stateStart millis(); } else { state IDLE; } break; case PUMPING: if (millis() - stateStart PUMP_MAX_MS || !isNear()) { pumpOff(); state COOLDOWN; stateStart millis(); } break; case COOLDOWN: if (millis() - stateStart COOLDOWN_MS) state IDLE; break; } } bool isNear() { uint16_t sum 0; int valid 0; for (int i 0; i 5; i) { uint16_t dist readDistance(); if (dist TRIGGER_CM * 10 dist 20) { sum dist; valid; } delay(30); } return valid 3; }这里面有个细节值得展开在出水状态下我用的是“宠物离开就停水”加“单次最长出水8秒”双保险。为什么需要最长出水时间限制因为存在一种情况猫趴在饮水机旁边却根本没在喝水只是单纯躺着休息如果传感器一直认为宠物存在水泵就会一直转下去电机发热不说水会从水槽溢出来。加了8秒上限之后哪怕宠物始终不离开泵也会自动停然后进入冷却状态过3秒再判断是否重新触发。这个状态机的好处是边界清晰每个状态之间的转移条件都可以单独调试。调试的时候我在串口监视器里实时打印状态名称和距离值可以看到系统从空闲走到确认再走到出水的完整过程哪里卡住了一目了然。3.3 水位保护与干烧防护水泵最怕空转。水位传感器测到水位低到电极以下时说明水槽里已经没多少水了这时候再启动水泵就是干烧不仅噪音大还会加速泵体老化。我在循环里加了一段水位判断水位正常才允许进入出水状态否则不管传感器读多少距离泵都不转只在串口里打印提示。有人会说加了滤芯和水泵的保护之后水位电极会不会也被水里的矿物质搞失灵确实会所以我在电极上用了304不锈钢材质还尽量把电极面积做大减少极化对测量结果的影响。每两周拆下来清理一次水垢是必须做的事情。4. 功耗优化与续航实测4.1 静态功耗主要损耗在哪里一个宠物饮水机如果插着USB电源用功耗多少可能无所谓但我想让整个系统脱离充电线用18650电池独立工作那就得认真对待静态功耗了。Arduino Nano板子上那颗LDO稳压芯片本身就有几毫安的静态损耗再加上板载LED指示灯的电流让它一直全速跑显然不现实。我测量了一下不优化的情况下整机待机电流大概是35mA一天24小时下来就是840mAh一节2000mAh的18650电池撑不过两天半这显然不行。优化思路分两步第一步是给传感器和主控“分时供电”VL53L0X模块我通过一个MOS管接到电源上平时处于断电状态只有需要测距的前30ms才通电第二步是让主控进入睡眠模式用定时器唤醒每500ms醒来一次测距测完继续睡。第二阶段的低功耗处理比较关键。VL53L0X最大测量距离在2米左右但我的检测阈值只有40cm完全没必要一直让它在最高精度状态下运行。我把传感器配置成了短距离模式测量频率也降下来了单次测距电流在20mA左右但持续只有几十毫秒平均下来功耗就很低。4.2 实测数据与续航估算我实际用万用表串了电流计记录了三个状态的电流值状态实测电流持续时间占比说明深度睡眠0.3mA约99.5%主控休眠 传感器断电测距唤醒22mA每次30ms每500ms唤醒一次水泵运行430mA按需触发单次出水6秒平均把一天的耗电拆开算静态部分0.3mA乘24小时约7.2mAh测距部分每天唤醒约17万次比较夸张实际上每两秒测一次一天4.3万次每次30ms、平均22mA算下来才0.8mAh左右水泵假设一天被触发25次每次6秒430mA乘以150秒折合17.9mAh。三部分加起来一天大约26mAh用一节标称2000mAh的18650电池理论上能撑两个多月。这只是理想估算实际使用中电池自放电、电容漏电、温漂都会吃掉一些容量我实测一个多月后才充第一次电这个结果已经很满意了。如果是用普通不优化的流水饮水机同样一节电池大概只能撑一天多差距就在这里体现出来了。5. 常见问题与排障实录5.1 问题排查速查表项目跑起来之后遇到的问题一个接一个。我把典型现象、可能原因和解决办法整理成了表格方便大家对照排查。现象可能原因排查方法宠物经过但不触发阈值设得太近或传感器装得太矮串口打印距离值观察宠物实际经过时读数是多少再调整阈值人一走过就出水检测距离覆盖到过道或环境反射干扰缩小阈值范围、加连续确认次数、调整安装角度出水停不下来状态机没进入冷却或传感器一直测到近距离物体检查代码最长出水时间是否生效观察串口状态切换偶尔不出水传感器镜头被水蒸气/灰尘遮挡清洁镜头检查传感器和电路仓密封水泵声音大泵腔内有空气或水垢堵塞检查管路单向阀清洗泵体叶轮续航短了很多主控没真正进睡眠或传感器供电没被切断用万用表测动态电流确认休眠时电流是不是毫安级5.2 三个我踩过的坑希望你避开第一个坑是传感器装在机身内侧时测到的不是宠物而是机身前面的墙壁反射。刚开始我把VL53L0X平放在饮水机前面板上结果发现猫靠近时距离值反而从35cm跳到了150cm。后来才反应过来传感器发出的激光在猫靠近时先被猫身体反射但猫身体正好挡住了原本能射到远处墙壁的路径测量逻辑一下子错乱了。解决办法是把传感器安装在更靠前的位置并且用热熔胶做了个小的导光槽限制激光的发射角度让主要反射面集中在猫的身体上。第二个坑是水蒸气导致误触发。冬天室内开暖气饮水机水槽里的水蒸气会往传感器窗口上凝结水滴会在镜头表面形成折射层距离读数变得极不稳定甚至出现读出一个很短的假距离让水泵自己启动。我在镜头窗口外侧涂了一层纳米疏水涂层同时把传感器安装角度略微向下倾斜冷凝水不会直接滴到镜面上问题基本解决。第三个坑电池低压导致的异常行为。当电池电压掉到3.4V以下时水泵启动瞬间会把电压拉得更低主控频繁复位出现“出水一下、停一下、又出水一下”的鬼畜现象。后来我在电池输出端并联了一个470μF的电解电容和一个小容量的陶瓷电容作为瞬时能量缓冲另外在代码里用ADC检测电池电压低于3.5V就进入低电量保护模式不再触发水泵只保留基础测距。这个保护逻辑非常有必要既能保护电池不过放也能避免低压下各种诡异bug。5.3 如何把调试过程可视化这个项目最容易踩坑的地方是传感器测距数据“看不见”。我调试时最常用的办法是代码里加串口打印每隔1秒输出一次“距离值状态名”再用手机连接USB串口的小工具去看数据。通过观察猫正常走来走去的距离值变化我才能真正确定阈值设置合不合理。如果你手头有OLED屏幕也可以用起来把距离值实时显示在屏幕上调试速度和舒适度会明显提升。我当时在调试阶段就在机身上放了一个0.96寸的OLED屏连着USB线蹲在旁边看猫喝水时的数据记录好几组有用的数据之后再把这些显示代码删掉正式运行时就不再产生无谓的功耗和代码复杂度了。这套系统的状态机逻辑才是核心传感器选型和电路搭建反而是一次性的事情。状态机里每一层保护逻辑其实都是在模拟真实使用场景之后慢慢加出来的。比如最开始的版本压根没有冷却状态是发现猫赖着不走时水泵过热才加的最开始也没有单次最长出水时间是发现水会溢出才加的。做这类面向宠物的智能硬件产品最大的敌人不是电路本身而是宠物真实行为里那些你意想不到的边界情况。用下来我个人最大的感受是ToF传感器作为宠物存在检测的核心性价比确实高而且不挑环境光、不受声音干扰比PIR和超声波靠谱太多。如果你也想复刻这个项目建议先在桌面上把测距和出水控制跑通再去考虑外壳和防水一步一步来你会比直接照抄成品收获更多。
返回列表