家里养了只猫之后,我最大的焦虑从“稿子写没写完”变成了“它在家到底怎么了”。上班时想看它有没有好好吃饭、喝没喝水、有没有呕吐、精神状态对不对,市面上普通的宠物摄像头又太死板——视角固定在那儿,猫走到角落就找不到了。尤其是喂食器这个位置,猫刚凑过来低头吃粮,固定机位就只能拍到后脑勺。我最初试过用手机支架挂个旧手机,角度倒是能调,可人在公司怎么远程转头?总不能放个云台手机架上再装个远程桌面,那玩意儿白天在公司根本点不动。
后来就琢磨,干脆自己动手,把这个需求做出来。经过一番折腾,我用 ESP32-CAM 搭了一套可以远程监控、还能通过云台追踪宠物移动的改造方案,喂食器还是原来那个喂食器,但整个监控能力完全变了样。整个过程不算复杂,核心成本也就一张ESP32-CAM开发板加两个舵机的钱,只是中间踩了不少坑,尤其是云台追踪的逻辑、供电稳定性、还有远程访问的通路,这些不是看几篇入门教程就能避开的。
这篇东西我尽量把硬件选型、结构改造、软件实现、追踪算法、远程访问到长期运行稳定性,整条链路都写透,适合手里有ESP32-CAM但不知道怎么落地到实际场景的朋友参考。
1. 为什么是ESP32-CAM?低成本监控方案的选型权衡
先说结论:在“给家里现有喂食器增加远程监控+追踪”这个需求面前,ESP32-CAM几乎是目前性价比最高、可玩性也最高的方案,但这不代表它没有缺点。我把这个结论拆开讲清楚,你才知道自己是不是也该选它。
1.1 和树莓派、市售宠物摄像头、旧手机改造的对比
做一个带摄像头的物联网设备,常见选择有这么几条路:
- 市售宠物摄像头:价格从一两百到上千都有,主打即插即用,APP成熟,有的还带云台。但我试过几款,最大的问题不是功能不够,而是——它的“智能追踪”通常笨得可以。猫稍微跑快一点,云台就甩来甩去,有时盯着飘动的窗帘追半天。而且数据全走厂商云,隐私方面心里总有点嘀咕,更别说加一个摄像头就得重新下载一个APP。
- 树莓派+摄像头模块:性能强,能跑Python、能跑OpenCV,做图像识别、录像、推流都行,生态无敌。但价格摆在那儿,板子加摄像头加散热加TF卡,奔着六七百去了,而且功耗相对大,散热风扇贴着喂食器总有点突兀,部署起来体积也不小。
- 旧手机改造:手机摄像头素质好,装个监控APP就能用远程看,但问题是它没有云台,得额外做一套机械结构;而且长期7×24小时插电运行,电池容易鼓包,发热也厉害,稳定性存疑。
- ESP32-CAM:带WiFi和蓝牙,板载OV2640摄像头,自带SD卡槽,整个模块二十几块钱到三十几块钱一片。搭配两个舵机做云台,总成本能控制在80元以内。它体积小,可以直接用扎带、热熔胶或3D打印支架固定在喂食器旁边,甚至嵌进机身里。虽然算力没法跟树莓派比,但处理“运动检测+云台追踪”这种量级的任务绰绰有余。
这里要强调一点:ESP32-CAM不是一块开发板,因为它出厂连USB转串口芯片都没有,必须用外接的USB转TTL模块才能烧录程序。这一点很多新手第一次上手会被卡住,后面我会详细说。
1.2 云台部分为什么选SG90舵机?
云台的核心是舵机。我最后用了两个 SG90 微型舵机,一个负责水平旋转(水平轴),一个负责俯仰(垂直轴)。SG90是9克级别的舵机,扭矩不大,但成本只要几块钱,转速约0.12秒/60度,控制精度大概能达到1度左右。对于带动一个不到50克的ESP32-CAM模块来说,完全够用。
需要注意的坑:ESP32-CAM在WiFi工作时的瞬时电流可以达到 300~500mA,而SG90堵转时电流也能到500mA以上,这两者绝对不能共用同一个稳压器或同一组杜邦线供电,否则摄像头一开机或者舵机一转向,电压一跌落,板子就重启了。正确的做法是分开供电、共地(GND连在一起),这个我在第5章会专门展开。
1.3 一句话总结选型思路
这套方案的灵魂是“够用就好”。ESP32-CAM做视频采集和简单的运动检测,舵机做机械跟踪,ESP32的WiFi负责和手机或电脑通信,整套体系非常“裸”,每个环节你都能看懂、能控制、能改,而不是被关在厂商的App黑盒里。如果你也是个喜欢什么都自己折腾的人,选它就对了。
2. 硬件准备与喂食器结构改造规划
确定方案后,就要开始准备材料、规划安装。这个环节很多人不重视,上来就焊线烧程序,结果做到一半发现空间不够、供电不足、安装不牢,又回头返工,折腾的时间比写代码还长。我的经验是:先把结构和供电想清楚,再动手。
2.1 采购清单与成本对照
| 物料 | 型号/规格 | 参考单价 | 用途 |
|---|---|---|---|
| 主控板 | ESP32-CAM(OV2640,4MB PSRAM版) | 25-40元 | 摄像头+WiFi+主控,买带PSRAM的版本,跑高分辨率图像更稳 |
| USB转TTL模块 | CP2102或CH340 | 8-15元 | 给ESP32-CAM烧录固件和调试输出 |
| 水平舵机 | SG90 9g舵机 | 6-10元 | 云台水平旋转 |
| 垂直舵机 | SG90 9g舵机 | 6-10元 | 云台俯仰 |
| 舵机驱动板 | PCA9685(可选) | 15-25元 | 如果不只用两个舵机、想扩展更多舵机,建议加一块 |
| 电源 | 5V/2A USB电源适配器一个,5V/1A一个 | 20元 | 一个给主控,一个给舵机,分开供电 |
| 降压模块 | LM2596或MP1584(可选) | 5-10元 | 如果你手头只有12V电源,需要降压到5V |
| 支架 | 2mm铝片或3D打印云台支架 | 0-30元 | 连接舵机和摄像头模组 |
| 散热片 | 14mm×14mm铝散热片 | 2元 | 贴在ESP32-CAM的芯片上降发热 |
我买的是带4MB PSRAM的版本,多花几块钱很值。因为ESP32-CAM自带的PSRAM越大,同一帧图像需要的内存缓冲区就越好分配,帧率更稳定,也能免去很多“图像撕裂”的问题。
2.2 供电设计:为什么不能直接插USB完事?
这是整套改造里最容易踩、也最影响成败的一个环节。ESP32-CAM板载了AMS1117-3.3稳压芯片,看起来直接接5V就行对吧?实际上有个隐藏问题:板载稳压器给OV2640和ESP32芯片供电时,WiFi发射瞬间拉高的电流会引起较大的压降,AMS1117的散热能力又有限,温度超过70℃就会导致系统不稳定甚至反复重启。
我的做法是:
- 主控单独用一个5V/2A的电源适配器,通过USB转TTL模块的5V和GND引脚供电;
- 舵机单独用一个5V/1A的电源适配器或USB口供电;
- 两个电源的GND必须连在一起(共地),否则舵机的PWM信号和主控的逻辑电平没有参考基准,舵机会乱跳。
这样改完,摄像头和舵机各走各的电流通路,系统稳定多了。后面实测连续运行一周没再出现重启问题。如果你手头只有一路电源,至少要在ESP32-CAM的5V和GND引脚旁并联一个大电容(470μF/16V以上)来吸收瞬时电流抖动。
2.3 云台结构设计与安装位置
云台的结构说简单简单,说麻烦也麻烦。我的方案是:
- 水平舵机倒装在一个铝合金支架上,舵机轴朝上;
- 垂直舵机用热熔胶固定在水平舵机摆臂上,轴朝前;
- ESP32-CAM的PCB板背面贴双面胶和魔术贴,固定在垂直舵机的摆臂上。
这个结构成本极低,不需要3D打印机也能做。热熔胶固定舵机很牢靠,但要注意别把胶搞到舵机轴和转动缝隙里,那会直接卡死舵机。如果条件允许,建议画一个简单的云台支架3D打印出来,网上也有现成的STL模型可以用。
摄像头安装位置也有讲究。我最初一直想着“把摄像头装得越高看得越远”,直接把模块架在喂食器顶上,结果俯视角度太高,猫低头吃粮时只看到一条背线,云台怎么转都没意义。后来把摄像头高度降到猫头部平视的层面,大概离地20厘米,角度微微下压,宠物在碗前的表情、吃饭速度、是否剩粮都能看清了。
2.4 视角范围与云台行程规划
SG90舵机的标准行程是0~180度,两个舵机组成的就是一个“水平180度+垂直180度”的半球视野。但如果喂食器靠墙,水平行程0~180度里有一半是照墙的,纯属浪费。我通过代码限制了水平舵机只在0~120度之间转动,垂直只在20~90度之间转动,这样既避免舵机撞到障碍物,也减少不必要的转动磨损。
如果你把ESP32-CAM装在客厅中间,可以考虑换成MG90S或者MG996R,扭矩更大,转动范围也可以放宽。但注意,扭矩越大耗电越大,电源还得跟着升级。
3. 固件框架与通信协议设计
硬件搭好以后,就进入软件部分了。ESP32-CAM本身的官方示例代码可以做局域网视频流,但那只是“看”,要让云台真正追踪宠物,还需要自己设计一套“视频采集—运动检测—云台控制”的闭环逻辑。
3.1 开发环境搭建与烧录坑点
用Arduino IDE开发ESP32-CAM是最快的路线。在“开发板管理器”里搜“esp32”安装Espressif官方包即可,注意选2.x版本,别装到早期测试版。开发板型号选“AI Thinker ESP32-CAM”或“ESP32-CAM”即可,如果编译报错,再试试“ESP32 Dev Module”。
烧录前要做的关键操作:把GPIO0接地(板子上有个跳帽位置,部分模块出厂是跳线焊死的,需要短接一下),然后按一下板上的RST复位键,让芯片进入下载模式。这是我第一次刷写时最懵的地方,不进入下载模式,正常点击上传会一直卡在“Connecting.....”。刷完之后拔掉GPIO0的跳线再复位,才能正常跑程序。
3.2 通信协议:用轻量JSON还是裸TCP?
我最初直接把视频流地址和一个简单的HTTP控制接口分开做,结果手机端既要拉流又要发控制指令,两个端口来回切换很别扭。后来改成统一走HTTP更直观的思路:
- 视频流:访问
http://<esp32-ip>:80/stream,返回的是MJPEG流; - 云台控制:访问
http://<esp32-ip>:80/servo?x=90&y=45,服务端解析x和y参数后设置水平、垂直舵机的目标角度。
这种“HTTP GET + 参数”的方式简单明了,不需要额外依赖库,手机浏览器、电脑、甚至微信小程序里的webview都能直接调。有人建议用WebSocket或MQTT获取更低的控制延迟,我后面试过,确实更跟手,但如果只是远程看看宠物、偶尔转一下云台,HTTP完全够用。MQTT更适合接入Home Assistant这种智能家居平台,属于进阶玩法。
3.3 舵机驱动的关键代码逻辑
舵机驱动用ESP32的LEDC PWM功能,不需要额外接舵机驱动板。代码核心是:每个舵机占用一个PWM通道,频率设置为50Hz,脉冲宽度在0.5ms~2.5ms之间对应0~180度。
示例代码(Arduino):
#include <ESP32Servo.h> Servo servoX; // 水平舵机 Servo servoY; // 垂直舵机 void setup() { servoX.attach(14); // GPIO14控制水平 servoY.attach(15); // GPIO15控制垂直 servoX.write(90); // 初始角度居中 servoY.write(45); // 初始角度略向下 } void loop() { // 主循环里处理HTTP请求或运动追踪 }注意,ESP32-CAM的引脚不是随便分配的。常用可用的GPIO有14、15、2、4、12、13等,但GPIO0和GPIO2跟板载LED或启动模式有关,做普通GPIO用需要小心。我实际用了GPIO14和GPIO15,这两个脚不占摄像头数据总线,也没被板载Flash占用,是驱动舵机最省心的选择。
3.4 视频流调优:分辨率、帧率和码率的平衡
OV2640摄像头可以输出不同分辨率的JPEG图像。我的实测数据:
- 800×600(SVGA):浏览器拉流时帧率大概12~18fps,画质清晰,能看到猫毛细节,用来观察宠物行为完全够。
- 1600×1200(UXGA):帧率掉到5fps以下,拖动云台时有明显迟滞,而且ESP32的处理器占用率接近满载,CPU温度飙升。
- 320×240(QVGA):帧率能到25fps以上,但画面太糊,远程看个轮廓还行,想看清喂食器里还剩多少粮就吃力了。
我最后选的是800×600加中等JPEG质量(质量因子10,范围0~63中取中间偏上),再加一个关键设置:把XCLK频率从默认的20MHz降到10MHz。这个操作能显著降低OV2640和ESP32之间的时钟压力,画面撕裂感少很多,处理器有余力做运动检测。
如果你也在浏览器里看视频流,建议打开http://<esp32-ip>:80/根路径,那里有一个基础版控制面板,虽然简陋,但可以直接看到视频流,适合先验证通不通。
4. 云台追踪的核心:运动检测与目标锁定
这是整套改造里最有技术含量的部分,也是很多人卡壳的地方。所谓的“云台追踪”,本质是三步循环:捕捉画面→找出感兴趣的目标→控制云台让目标保持在画面中央。
4.1 算力有限,用帧差法而非深度学习
ESP32-CAM的处理器和树莓派完全不是一个量级,想在板子上跑YOLO之类的目标检测模型基本不现实(除非用ESP32-S3+外部AI加速芯片,那是另一条路线)。所以我的方案是经典的帧差法(Frame Differencing):
- 摄像头连续抓两帧RGB565图像;
- 把两帧图像逐像素做差,计算灰度差;
- 差值超过阈值的像素视为“运动区域”;
- 遍历这些运动区域,累计它们的重心坐标,作为目标位置;
- 将目标位置和画面中心点比较,计算出偏差值,驱动云台纠正。
用大白话说就是:哪里的画面和上一秒不一样了,那里就是“有东西动了”,我就让镜头转过去。
帧差法最大的好处是计算量小,ESP32跑起来还能保持15fps左右的实时性。最大的缺点是只响应变化的物体——如果猫蹲在碗边安安静静吃东西,运动区域反而很小,云台不会主动转过去。我的解决办法是加一个“定时巡逻”逻辑:每隔30秒,云台自动扫描一遍预设点位,一旦运动区域出现明显重心,就立即锁定并持续跟踪。
4.2 重心计算与云台跟踪的PD控制
拿到运动区域后,要算出一个“目标中心坐标”。伪代码如下:
// 遍历画面像素,计算运动像素的总数和重心 long sumX = 0, sumY = 0, count = 0; for (int y = 0; y < height; y += 2) { for (int x = 0; x < width; x += 2) { if (abs(frame1[y][x] - frame2[y][x]) > threshold) { sumX += x; sumY += y; count++; } } } if (count > 100) { targetX = sumX / count; targetY = sumY / count; }这里有个细节:图像太大时逐像素遍历会吃掉大量CPU,所以采样步长设为2,实际上是“隔行采样”,计算量直接降到四分之一,准确度没有明显损失。
拿到目标坐标后,云台的转动量用简单的P(比例)+D(微分)控制,而不是让它一下转到最大速度:
int deltaX = targetX - width / 2; // 目标偏离画面中心多少 int deltaY = targetY - height / 2; int speedX = constrain(deltaX * 0.3 + lastDeltaX * 0.1, -15, 15); int speedY = constrain(deltaY * 0.2 + lastDeltaY * 0.1, -10, 10); servoX.write(constrain(servoX.read() + speedX, 0, 120)); servoY.write(constrain(servoY.read() + speedY, 20, 90));系数0.3和0.1是我实测调出来的。系数太大,舵机会明显来回摆动,猫还没跑镜头已经在“甩头”;系数太小,追踪反应迟钝,猫都出画了镜头才转了一半。PD控制的核心思路是:比例项决定“响应速度”,微分项决定“抑制震荡”。如果以后你换了重量不同的摄像头模组,这两个系数也要重新调。
4.3 过滤假目标的三种手段
帧差法最怕的就是误报。我用下来最典型的假目标有三种:
- 窗帘飘动:窗户一开风一吹,运动区域很大,云台被带着来回扫。解决方案是裁剪检测区域,只在画面下方三分之二、喂食器周围这个区域做帧差,上方的窗户区域直接忽略。
- 光线突变:开灯、日食、云层遮挡阳光,都会引起整体像素大幅变化。解决方案是增加一个“全画面平均亮度”检测——如果全画面亮度变化超过20%,说明是环境光变了而非有物体运动,此时暂停跟踪逻辑,不做云台动作。
- 舵机自身转动引起的画面变化:云台转动时,画面本身也在变,帧差法会把整个画布都判为运动,造成正反馈放大。解决方案是:在云台转动完成后等待800~1200ms,等画面稳定后再抓帧做帧差。
这三个坑每一个都折磨过我,尤其第三个,稍不注意就会表现为“云台一停下来又开始乱动”,非常迷惑。如果你也遇到云台抖动甚至原地画圈,先检查是不是转了之后再比对帧差。
4.4 目标丢失后的行为策略
现实场景里,猫不会永远待在镜头正前方。追踪过程中目标突然消失(比如猫跑出画面或窝到垫子上),别让云台傻傻等着。我的策略是:
- 连续5次帧差没检测到目标,就认为目标丢失;
- 进入“搜索模式”:云台先回到预设的初始角度,向左右各扫一圈,再向上往下扫一圈;
- 若搜索2个循环后仍无目标,回到“巡逻模式”,每隔20秒按顺序扫四个点位,直到发现运动目标再锁定。
这个策略有点像“人找猫”——先在最常出现的地方找,找不到就扩大范围,还没找到就重新来一遍。实际用下来,猫在屋里走动时基本能在5秒内被重新锁定。
5. 远程监控通路:从局域网到外网访问
摄像头做出来了,云台也会追踪了,接下来最关键的问题就是:我人在公司,怎么连回家里的摄像头?
5.1 局域网内先跑通
第一步,肯定是在家里同一个WiFi下测试。用手机浏览器直接打开http://<esp32-ip>:80/stream,能看到视频流;打开http://<esp32-ip>:80/servo?x=90&y=45,能看到云台转动。这个阶段主要验证ESP32-CAM的WiFi连接稳定性,以及HTTP控制是否正常。
为了方便调试,我会在代码里把IP地址固定下来(静态IP),而不是每次开机都动态获取。否则断电重启后IP变了,远程访问地址也得跟着改,非常麻烦。配置方法是在setup()里调用WiFi.config():
IPAddress local_IP(192, 168, 1, 200); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); WiFi.config(local_IP, gateway, subnet);把静态IP固定成192.168.1.200,后续所有访问都走这个地址。
5.2 外网访问的常见方案
外网访问有几种思路,从简单到复杂排序如下:
方案一:路由器端口映射 + DDNS。在路由器管理后台把ESP32-CAM的IP和80端口映射到公网端口(比如8080),然后申请一个动态域名(DDNS),即使家里公网IP变化,也能通过域名访问。这是最直接的方式,但前提是运营商分配给你的是公网IP。很多地区的家庭宽带默认是大内网IP,路由器上做端口映射无法从外部访问,这一步需要先确认。
方案二:内网穿透服务。如果公网IP受限,可以找一台有公网IP的小服务器(比如云服务器),在ESP32-CAM端和服务器端建立一条隧道,外部访问先到服务器,再由服务器转发给家里的ESP32-CAM。这种方式对家里的网络环境要求低,但多了一台服务器成本,且链路延迟略高。
方案三:组网方案。部分路由器或软件组网方案可以让你在公司电脑上直接访问家里的局域网IP。这样你不需要暴露任何端口,安全性更高,但需要在两端设备安装客户端,配置门槛稍高。
我自己的选择是端口映射+DDNS,因为我的宽带是公网IP,映射80端口后手机直接访问域名就能看。但这里要特别提醒一句:把设备直接暴露到公网,安全性必须跟上。ESP32-CAM只是一个裸的HTTP服务,没有加密也没有登录鉴权,任何人只要知道你的地址就能看到你家摄像头。我的做法是在前端加一个简单的“请求头Token校验”——所有控制指令必须带一个预设的Token字符串,否则直接拒绝响应。具体实现是,在HTTP处理函数里检查request->arg("token")是否等于预设值。
5.3 远程访问体验的优化
远程访问卡顿是必然的,毕竟家用宽带的上行带宽有限,ESP32又是MJPEG流,带宽占用不低。我实际测下来:
- 800×600分辨率,MJPEG流大约占用 1.5~3Mbps 上行带宽;
- 家用宽带上行一般是20~50Mbps,问题不大;
- 但如果同时有人看视频、打游戏,家庭网络可能明显变卡。
优化思路有两个:一是降低分辨率,远程用320×240看个大概,回家再切800×600;二是用“抓图模式”代替“视频流模式”——ESP32定时拍一张JPEG照片上传到服务器或自己的手机端,每隔2秒刷新一次,虽然不连续,但省带宽,也够用。我在App里做了个按钮切换这两种模式,平时用“定时抓图”,确认有异常时才切“连续视频流”。
另外,很多路由器对长时间端口映射有连接数限制,ESP32-CAM用的HTTP这种短连接协议问题不大,但如果开了流媒体长时间观看,设备会积累大量TCP连接,时间久了可能出现连接被拒。解决办法是定时重启ESP32-CAM,或者写一个看门狗逻辑,每天凌晨3点自动重启一次,清掉所有残留连接。
6. 长期运行稳定性的几个关键改造
设备不是做完演示一遍就结束了,宠物喂食器是24小时全年无休运行的东西,稳定性比功能本身更重要。我在这块踩过的坑,基本都集中在发热、重启、资源耗尽这三个点上。
6.1 发热改造:散热片与降频
ESP32-CAM跑视频流时芯片温度会迅速上升,摸上去烫手那种程度。我刚开始没管,结果运行半天后画面开始卡顿,然后直接死机。加装一个14mm×14mm的铝散热片后,温度能从模模糊糊的烫手降到温热,基本稳定。
如果你还是觉得热,可以在代码里把CPU频率从240MHz降到160MHz,代价是视频帧率略降,但长期运行更可靠。实测降低后帧率从18fps掉到15fps左右,日常观察基本无感。
6.2 看门狗与自动恢复机制
再稳定的主控也有偶发死机的时候。ESP32内部有硬件看门狗,但默认不开启。我的做法是在主循环里定期执行喂狗操作,并且给整个程序加一个“假死检测”:比如连续60秒没有成功更新一次视频帧,就触发ESP.restart()主动重启。
unsigned long lastFrameTime = 0; int timeout = 0; void loop() { if (millis() - lastFrameTime > 5000) { // 超过5秒没新帧 timeout++; if (timeout > 12) { // 累计12次,约1分钟 ESP.restart(); } } // 正常路径里更新lastFrameTime }这个逻辑在无人值守时特别重要。哪怕模块出了诡异Bug,最多也就瞎一两分钟,然后自己恢复。
6.3 夜间监控与补光方案
OV2640在低光环境下的表现比较一般,噪点多,帧差法的误报率会明显上升。我试过几种方案:
- 红外LED灯板:效果最好,但需要把ESP32-CAM的彩色滤镜切掉或外接红外滤镜切换模块,不然红外光会把画面照成一片粉色,反而看不清。手头没有滤镜模块的话慎用。
- 白色LED补光灯:成本最低,用一个GPIO控制一颗高亮LED,暗光时自动点亮。缺点是晚上猫睡觉时补光会打扰它,而且LED常亮发热量也不算小。
- 画面降噪+减少追踪频率:夜间自动把分辨率降到QVGA,帧率也降低,只做“定时巡逻+抓图”,不做实时追踪。我最后用的是这个方案——白天才开启完整追踪,晚上只保留定时拍照,既省电又安静。
6.4 故障排查速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 烧录时卡在“Connecting.....” | GPIO0未接地,未进入下载模式 | 短接GPIO0后复位,等出现串口日志再上传 |
| 上电后反复重启 | 电压跌落,供电不足 | 独立5V/2A供电给主控,加470μF电容 |
| 画面花屏或绿条 | 电源纹波大或XCLK频率过高 | 降XCLK到10MHz,检查供电质量 |
| 云台乱转跟指令对不上 | 舵机电源未共地 | 将舵机GND与主控GND接在一起 |
| 舵机嗡嗡响但不动 | 电压不够堵转,或PWM频率不对 | 确认舵机供电电流足够,PWM频率50Hz |
| 外网打不开视频流 | 端口映射/DDNS配置不对,或公网IP受限 | 先用局域网IP测试,再用手机4G关WiFi测试公网 |
| 运行几小时卡死 | 发热累积或内存泄漏 | 加散热片,开启看门狗,定时重启 |
这个速查表基本上覆盖了大多数入门者会遇到的百分之八十问题。剩下那百分之二十,要么是硬件虚焊,要么是固件版本兼容性问题,遇到的时候直接用串口监视器打印日志,看卡在哪一步,定位会快很多。
7. 还能往哪些方向扩展?
这套底座搭好之后,很多玩法都是顺水推舟的事。我在实际使用中体验比较深、也推荐有条件的朋友试的方向,主要有这几个。
联动出粮逻辑。以前我用宠物喂食器,最怕的就是出粮时间和猫的实际作息对不上。现在摄像头和喂食器都在同一个局域网里,可以直接通过HTTP请求调用喂食器的“出粮”接口——比如在ESP32-CAM上写一个逻辑:检测到猫在碗前停留超过10秒且运动区域位置稳定,就自动发一个出粮指令,把干粮量控制在少量、多次。这个功能等于把“按点喂饭”升级成了“看猫下菜”。
本地录像循环存储。ESP32-CAM自带TF卡槽,我插了一张32GB的TF卡,写了个简单逻辑:检测到运动目标时,连续抓拍10张照片和一个短视频片段存到TF卡里,超过500MB自动删除旧文件。这样就算外网断了,关键时间点的画面也留在本地可以事后查看。比云端存储更隐私,也不依赖流量。
接入Home Assistant。如果你家里已经有一套智能家居中枢,把ESP32-CAM接到Home Assistant里并不难。需要的基础协议是MQTT——ESP32-CAM作为一个MQTT客户端,上报视频流地址和舵机当前角度;Home Assistant侧做一个卡片,显示画面和控制按钮。这样就不用额外开发手机App了,直接在现有面板里操作。
用ESP32-S3替代ESP32-CAM做更聪明的识别。如果你的需求升级到“认出每只猫是谁”,ESP32-CAM的算力就不够了。可以换ESP32-S3芯片平台,它能跑一些轻量级CNN模型,比如宠物脸部识别。这个升级代价是价格翻好几倍、代码要重写,但可玩性也是另一档。等到哪一天我觉得帧差法满足不了需求了,大概率会走上这条路。
最后分享一个实际体会
整套系统改完,到现在已经稳定跑了几个月,最让我意外的其实是“使用习惯”的变化:当初以为我会天天盯着视频看猫,结果实际用得最多的功能是运动检测报警和定时抓图——每天上班路上翻一眼手机,看猫有没有在碗前出现、碗里的粮少没少、精神状态好不好。云台追踪反而变成了“锦上添花”的功能,但它确实让我明白了,一个DIY设备最核心的价值不一定是“功能有多强”,而是“能不能融进你自己的生活方式里”。
如果你也想做类似的改造,我的建议很直接:不要追求一步到位,先把“ESP32-CAM出画面”这第一步跑通,再慢慢加云台、加追踪、加远程。每加一个功能,都确保它能稳定运行一天以上,再进入下一步。这条路我替你趟过了,坑虽然不少,但每一个坑都对应着你真正理解这套系统的一块拼图。