1. 项目概述一个懒人铲屎官的自我救赎几个月前我接到一个学校项目任务需要自己构思并完成一个作品。说实话一开始我毫无头绪直到某个晚上我正瘫在电脑前家里的猫主子溜达了进来。我妈总希望猫晚上能待在家里于是她照例喊我去把猫门关上。那一刻我内心的“懒癌”彻底发作一个念头闪过为什么不能让它自己关甚至为什么不能让它变得更智能这个最初“偷懒”的想法最终催生出了这个“Easy Cat Set”——一套集成了自动喂食、饮水监测与智能猫门控制的完整系统。它不仅仅是一个开关门的小装置而是利用Raspberry Pi和ESP32作为大脑通过一系列传感器称重、温度、运动感知猫咪世界再经由一个自建的Web应用让你远程掌控一切。从硬件焊接、代码调试到外壳制作整个过程充满了挑战但当看到猫咪能自如进出、食盆水碗状态尽在掌握时那种成就感远超预期。如果你也受够了每天定时定点的喂食铲屎或者单纯想给毛孩子一个更科技感的生活环境那么这个项目会是一个绝佳的起点。它涉及物联网的核心流程感知、处理、通信与控制非常适合有一定动手能力和编程基础的朋友深入实践。2. 系统整体架构与核心组件选型一套可靠的智能宠物系统其核心在于稳定、准确的感知与执行。我的设计思路是采用“主从协同”的架构将计算密集型任务与实时控制任务分离确保系统响应及时且扩展性强。2.1 核心控制器Raspberry Pi 4 与 ESP32 的分工为什么选择这两款控制器这是基于它们各自的特性与项目需求所做的权衡。Raspberry Pi 4在这里扮演“系统主机”的角色。它运行着一个完整的Linux操作系统我使用的是Raspberry Pi OS Lite这带来了几个不可替代的优势首先它能轻松运行用Python编写的复杂后端服务如Flask框架处理HTTP请求、WebSocket通信以及数据库操作其次其丰富的GPIO接口和强大的处理能力可以同时驱动多个传感器如HX711称重模块、DS18B20和执行器如水泵、伺服电机并进行初步的数据滤波与计算最后Pi可以直接作为一个小型服务器托管我们开发的Web前端界面实现局域网甚至经过安全配置后的远程访问。而ESP32则作为“边缘节点”专职负责猫门的智能控制。我选择它主要基于三点其一极低的功耗和快速的启动速度适合7x24小时待机其二内置的蓝牙功能为未来可能的手机直连控制预留了空间当前项目通过Wi-Fi与Pi通信其三强大的实时性对于检测运动传感器信号并立即驱动伺服电机转动猫门旋钮这类任务ESP32的响应速度比通过操作系统调度的Pi更为直接和可靠。两者之间通过家庭Wi-Fi网络使用简单的HTTP请求或更高效的MQTT协议进行通信构成了一个松耦合但功能明确的分布式系统。2.2 感知层传感器的选择与原理系统的“眼睛”和“皮肤”由三类传感器构成它们负责将物理世界的变化转化为可读的数据。HX711称重传感器模块与电阻应变式称重传感器这是监测食物和水余量的关键。称重传感器本身是一种力电转换器件当上面的托盘受力时内部的金属应变片会发生形变导致其电阻值发生微小变化。HX711模块是一个高精度24位模数转换器ADC放大器它的作用就是将这个微弱的电阻变化信号放大并转换成Pi能够读取的数字信号。这里有一个至关重要的概念——“单位重量标定值”Reference Unit。模块输出的原始数值是一个与所受压力成正比的巨大数字我们必须通过校准找到一个系数将这个原始值转换为克g或千克kg。校准过程后文会详细展开。DS18B20数字温度传感器我将其浸入饮水碗的水中用于监测水温。选择DS18B20的原因是其采用独特的单总线1-Wire协议仅需一根数据线加上电源和地线共三线即可与Pi通信极大地简化了布线。它的测量范围-55°C ~ 125°C和精度±0.5°C完全满足室内水温监测的需求。其封装形式多样我选择了防水探头型用热缩管和防水胶做好绝缘后直接放入水中。HC-SR501人体红外PIR运动传感器安装在猫门上方用于探测猫咪的进出。这是一种被动式红外传感器通过检测动物身体发出的特定波长红外线变化来判定运动。模块上有两个旋钮可分别调节延迟时间即触发后输出高电平信号的持续时间和灵敏度。我将延迟时间调得较短约1秒灵敏度调至中等以避免因环境温度缓慢变化引起的误触发。2.3 执行层伺服电机与蠕动泵系统的“手”负责执行我们的指令。SG90微型伺服电机用于控制喂食器的下料开关和猫门的状态切换。伺服电机的优势在于它可以精确控制旋转角度。通过Pi或ESP32发送脉冲宽度调制PWM信号可以命令它转动到0度、90度或180度等特定位置。在喂食器中我将其设计为控制一个挡板转动特定角度即可打开下料口在猫门上则用于旋转原有的手动旋钮实现“常开”、“常闭”、“仅入内”三种模式的切换。24V直流蠕动泵负责从储水桶向水碗添水。选择蠕动泵是因为其泵体与液体完全隔离只有软管接触水流卫生且易于清洗非常适合宠物饮水应用。需要注意的是泵的工作电压是24V而Pi和ESP32的GPIO只能输出3.3V或5V且驱动电流很小无法直接驱动。因此我必须使用一个MOSFET管如IRF520模块作为电子开关用Pi的3.3V信号来控制24V主回路的通断这是一个典型的“小电压控制大电压”电路。2.4 数据流与软件架构整个系统的数据流是单向采集、集中处理、双向控制的。传感器数据重量、温度、运动信号被Pi或ESP32采集后通过Python脚本处理后一方面存入本地MySQL数据库进行持久化存储另一方面通过Socket.IO实时推送到前端网页。用户在前端页面点击按钮如“手动喂食”、“锁定猫门”这个指令会通过HTTP POST请求或WebSocket发送到Pi的后端服务后端再驱动相应的GPIO口控制执行器动作。ESP32则持续监听运动传感器并在触发时通过网络向Pi的后端发送一条“猫咪经过”的记录同时根据Pi下发的模式指令来控制猫门伺服电机。3. 硬件搭建与电路连接详解硬件部分是整个项目的基石稳定的电路连接是后续一切功能的前提。我的搭建过程分为核心主板、传感器/执行器模块以及电源管理三大部分。3.1 Raspberry Pi 4 外围电路连接Pi作为主控需要连接众多设备。清晰的接线图和可靠的连接至关重要。我使用了面包板进行前期测试后期则焊接了定制PCB以提升稳定性。GPIO分配与连接清单HX711模块 (用于食物秤)VCC- Pi 5V,GND- Pi GND,DT- GPIO 5,SCK- GPIO 6。HX711模块 (用于水秤)VCC- Pi 5V,GND- Pi GND,DT- GPIO 13,SCK- GPIO 19。注意两个HX711的数据线DT和时钟线SCK必须连接到不同的GPIO引脚在代码中也需要分别初始化两个对象。DS18B20温度传感器红色线(VCC)- Pi 3.3V,黑色线(GND)- Pi GND,黄色线(DATA)- GPIO 4。并且需要在数据线和3.3V电源线之间连接一个4.7kΩ的上拉电阻这是单总线协议稳定通信的必要条件。SG90伺服电机 (喂食器)棕色线(GND)- Pi GND,红色线(VCC)- Pi 5V,橙色线(Signal)- GPIO 18。LCD1602液晶屏 (I2C接口)VCC- Pi 5V,GND- Pi GND,SDA- GPIO 2 (SDA),SCL- GPIO 3 (SCL)。使用I2C接口可以节省大量GPIO口仅需2根数据线。蠕动泵控制端 (通过MOSFET模块)MOSFET模块的GND- Pi GND,Signal- GPIO 17,VCC不接。MOSFET模块的负载端串联在蠕动泵的24V电源回路中。3.2 ESP32 猫门控制电路ESP32的电路相对简单专注于猫门控制。HC-SR501 PIR传感器VCC- ESP32 3.3V,GND- ESP32 GND,OUT- GPIO 15。SG90伺服电机 (猫门)GND- ESP32 GND,VCC- ESP32 5V输出引脚,Signal- GPIO 13。3.3 电源方案设计与安全警告这是最容易出问题也最需要谨慎对待的部分。系统涉及多种电压Pi需要5V/3AESP32需要5V传感器多是3.3V或5V而蠕动泵需要24V。我的方案是主电源使用一个高质量的12V 5A直流电源适配器作为总输入。电压转换12V输入接入一个DC-DC降压模块输出稳定的5V/3A专门给Raspberry Pi 4供电。切忌使用劣质或电流不足的电源给Pi供电会导致系统不稳定、SD卡损坏。同一12V输入接入另一个DC-DC升压模块输出24V专门驱动蠕动泵。Pi上的5V和3.3V引脚可以为ESP32、传感器和伺服电机供电。但要注意总电流SG90电机在堵转时电流可能超过500mA多个设备同时工作可能拉低Pi的电压。稳妥的做法是使用一个5V 3A的USB充电模块从12V总电源降压得到专门给ESP32和伺服电机供电。电气隔离与保护在控制24V泵的MOSFET模块的Signal引脚和Pi的GPIO之间我串联了一个1kΩ的电阻用于限流保护GPIO。所有电机伺服电机、水泵的电源正负极两端都反向并联了续流二极管如1N4007用于吸收电机线圈在断电时产生的反向电动势防止高压尖峰损坏MOSFET或控制器。电源输入端和24V输出端都加了保险丝。实操心得接线务必使用颜色区分的导线如红色正极黑色负极黄色信号线并在关键连接点使用热缩管或电工胶带绝缘。上电前务必用万用表通断档检查所有电源线是否存在短路先连接低压部分Pi、传感器测试正常后再连接24V高压部分。4. 软件实现从数据采集到Web交互软件部分是将硬件“激活”的灵魂我采用Python作为后端主要语言搭配轻量级的Flask框架和Socket.IO实现实时通信。4.1 后端服务核心逻辑 (app.py)后端的核心文件app.py承担了数据采集、逻辑处理、API提供和实时推送四大任务。1. 初始化与传感器驱动首先需要初始化所有硬件接口。对于HX711使用hx711库关键步骤是校准。校准不是一劳永逸的传感器安装位置、机械结构的变化都可能影响读数。# 示例食物称重传感器初始化与校准 import RPi.GPIO as GPIO from hx711 import HX711 hx_food HX711(dout_pin5, pd_sck_pin6) hx_food.set_reading_format(“MSB”, “MSB”) # 重要去皮Tare hx_food.reset() hx_food.tare() # 放置已知重量的校准砝码如500g input(“请放置500g砝码然后按回车键...”) reading hx_food.get_weight_mean(5) # 读取5次取平均 # 计算参考单位 reference_unit reading / 500.0 hx_food.set_reference_unit(reference_unit) print(f”校准完成参考单位值: {reference_unit}”)校准心得砝码要尽可能接近日常称重范围如500g。校准环境应稳定无风、无振动。校准后将计算出的reference_unit值硬编码在代码中避免每次启动都需校准。DS18B20的驱动则需先启用Pi的单总线接口并通过读取系统文件的方式获取温度值。2. 数据库设计与操作我使用SQLite轻量或MySQL功能更全存储数据。数据库设计围绕几个核心实体feeding_log: 记录每次喂食的时间、类型手动/自动、出料重量。water_level: 记录水位通过重量换算和时间戳。water_temperature: 记录水温和时间戳。cat_flap_log: 记录猫门每次被触发的时间、方向进/出需两个传感器判断本项目简化记录为事件。flap_mode: 存储当前猫门模式0-常开1-常闭2-仅入内。通过Python的sqlite3或pymysql库进行增删改查操作。所有传感器数据在读取后除了实时推送都会插入对应的日志表。3. Web框架与实时通信使用Flask搭建Web服务器定义API接口。例如GET /api/current_weight返回当前食物和水重量。POST /api/feed触发一次手动喂食。POST /api/flap_mode更新猫门模式。为了实现数据在前端的实时更新如重量变化曲线我引入了Flask-SocketIO。后端在传感器数据更新或猫门事件发生时主动向前端所有连接的客户端广播消息前端JavaScript接收后动态更新页面无需用户手动刷新。4. 定时任务与自动化逻辑利用Python的schedule或APScheduler库实现定时任务。每天早晚7点检查食物重量若低于阈值则驱动伺服电机打开下料口2秒时间需实验确定对应克数。每30分钟检查一次水温如果高于25°C夏天则控制水泵换掉一部分水先排水再加水。持续监听称重传感器若水重量低于最低水位自动启动水泵补水至目标水位。4.2 ESP32 固件程序ESP32的程序Arduino框架相对独立核心是连接Wi-Fi保持与Pi后端的心跳并执行控制命令。// 示例片段连接Wi-Fi并监听HTTP命令 #include WiFi.h #include HTTPClient.h const char* ssid “Your_WiFi_SSID”; const char* password “Your_WiFi_Password”; String serverUrl “http://[PI_IP_ADDRESS]:5000/api/”; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(“.”); } Serial.println(“Connected to WiFi”); // 初始化伺服电机和PIR传感器引脚 } void loop() { // 1. 读取PIR传感器状态 int motionState digitalRead(PIR_PIN); if (motionState HIGH) { // 检测到运动发送HTTP POST请求到Pi记录事件 sendMotionEvent(); delay(1000); // 防抖延时 } // 2. 每隔10秒向Pi请求当前猫门模式并驱动伺服电机到对应位置 if (millis() - lastModeCheck 10000) { String mode getFlapModeFromServer(); setServoToMode(mode); lastModeCheck millis(); } }关键点ESP32需要处理网络异常。我增加了重连机制当Wi-Fi断开时会尝试自动重新连接。与Pi的通信使用HTTP GET/POST简单可靠。伺服电机的控制使用ESP32Servo库。4.3 前端Web界面设计前端的目标是直观、清晰。我使用了基本的HTML/CSS/JavaScript组合并引入了Chart.js用于绘制重量和水温的历史曲线图。页面结构仪表盘概览页大字体显示当前食物和水的重量、水温。三个大按钮分别控制“立即喂食”、“添加饮水”、“切换猫门模式”。猫门模式用醒目的颜色和图标表示绿色开门、红色锁门、黄色仅入内。历史数据页使用Chart.js绘制过去24小时/7天的食物消耗曲线、饮水曲线和温度曲线。可以直观看出猫咪的饮食规律。设置页用于设置喂食计划时间、克数、水位阈值、温度报警阈值等。前端与后端交互通过JavaScript的Fetch API调用后端的RESTful接口进行数据获取和命令下发。同时通过Socket.IO客户端库建立与后端的实时连接监听“weight_update”、“temperature_update”等事件实现数据的实时推送更新。部署将前端静态文件HTML, CSS, JS放在Pi上的Flask应用的static文件夹中。这样用户只需在浏览器中输入Pi的IP地址和端口如http://192.168.1.100:5000即可访问控制面板。5. 机械结构与外壳制作硬件和软件调试通过后一个坚固、美观、宠物安全的外壳至关重要。我的设计原则是功能分区、便于维护、防止宠物破坏。5.1 喂食饮水一体机箱制作我选择使用15mm厚的亚克力板进行激光切割因为它美观、易加工、强度足够。结构分层设计底层安装两个称重传感器每个传感器四个角用螺丝固定上方放置食品级不锈钢碗托。碗与托之间垫有硅胶防滑垫。所有线路从底板预开的孔洞向下走线。中层是“设备舱”。左侧固定5L的宠物粮储粮桶桶底安装由伺服电机控制的旋转式下料阀门。右侧固定5L的饮用水桶桶盖连接出水管和蠕动泵的进水管。蠕动泵和24V电源模块固定在背板上。这一层与底层完全隔离防止水汽或粮渣污染电路。上层是“控制舱”。安装Raspberry Pi、GPIO扩展板、电源转换模块和接线端子排。侧板开有散热孔。前面板安装LCD屏幕显示IP地址和系统状态。水路与粮路粮路是从储粮桶阀门通过一段PVC管直接落入食碗。水路是从水桶经蠕动泵通过硅胶软管引到水碗上方。关键技巧在水碗上方水管末端加装一个“浮球阀”或设计一个简单的虹吸中断结构防止停泵后因虹吸效应继续滴水。防潮与安全处理所有电路板喷涂三防漆。电源接口处使用带锁紧螺母的航空插头防止被猫咪拉扯脱落。边角全部打磨圆滑避免划伤。5.2 智能猫门改造改造对象是一个普通的机械式猫门。伺服电机安装拆下原猫门的手动旋钮。使用一个3D打印的联轴器或精心切割的塑料件将伺服电机的输出轴与猫门内部的模式切换轴连接起来。伺服电机用螺丝和扎带牢固地固定在猫门内侧的框体上确保转动时不会移位。ESP32安装将ESP32开发板、一个小的5V降压模块以及PIR传感器安装在一个小型防水盒内固定在猫门上方内侧。PIR传感器的探测窗口对准通道。供电与走线从室内的USB充电器拉一根Micro USB线为整个猫门控制系统供电。所有线缆用螺旋套管包裹沿门框隐蔽走线。测试要点反复测试伺服电机旋转角度与猫门实际模式开、关、单向的对应关系并在代码中精确设定角度值。测试PIR传感器的探测范围确保能覆盖猫咪通过时的区域但又不会因远处活动而误触发。6. 系统调试、优化与常见问题排查项目集成过程中会遇到各种预期之外的问题系统的稳定性和可靠性正是在解决这些问题的过程中打磨出来的。6.1 传感器数据不准与跳变这是最常见的问题尤其是称重传感器。问题现象重量读数不稳定无负载时也在缓慢漂移或跳动。排查与解决电源噪声HX711对电源非常敏感。确保使用线性稳压电源如LM7805为其单独供电而不是直接从Pi的5V引脚取电。在HX711的电源引脚就近并联一个100μF的电解电容和一个0.1μF的陶瓷电容进行滤波。机械结构确保称重传感器只承受垂直方向的力且安装平面平整没有扭曲或侧向应力。食碗/水碗必须固定在与传感器上压板刚性连接的托架上不能有晃动。软件滤波在代码中采用中值滤波或移动平均滤波。例如连续读取10次去掉最大最小值取平均。def get_stable_weight(hx, samples10): readings [] for _ in range(samples): readings.append(hx.get_weight()) time.sleep(0.05) readings.sort() # 去掉前后两个极端值再平均 return sum(readings[2:-2]) / (samples - 4)环境因素避免风扇直吹、阳光直射造成温度变化引起热胀冷缩或气流干扰。6.2 网络通信中断与ESP32离线物联网设备最怕“失联”。问题现象前端显示猫门状态更新失败或ESP32日志显示连接断开。排查与解决Wi-Fi信号确保猫门安装位置的Wi-Fi信号强度足够可用手机测试。考虑使用Wi-Fi信号放大器或中继器。心跳与重连机制在ESP32代码中除了定期请求模式还应增加向Pi发送“心跳”包的功能。如果连续多次发送失败则执行WiFi.reconnect()。静态IP分配在路由器中为Pi和ESP32分配固定的局域网IP地址避免DHCP租约到期后IP变化导致连接失败。防火墙设置确保Pi上运行后端程序的端口如5000在防火墙中是开放的。6.3 执行机构故障伺服电机抖动或不转检查电源电压是否足够5V。测量一下电机工作时电源线上的电压如果低于4.8V说明电源带载能力不足需要更换更大电流的电源。确保PWM信号线连接牢固。蠕动泵不工作或流量小检查24V电源是否正常输出。检查MOSFET模块是否损坏可以用万用表测量信号端为高电平时输出端是否导通。蠕动泵的硅胶管长期使用会疲劳老化导致挤压不严流量下降。定期检查更换硅胶管。泵头内有杂物卡住拆开清理。6.4 数据库与后台服务稳定性问题运行几天后Web界面打不开或数据不更新。排查查看日志使用journalctl -u your_service_name或直接查看Python脚本输出的日志文件寻找错误信息。数据库锁死如果使用SQLite在高并发读写时可能发生数据库锁。考虑迁移到MySQL或优化代码减少数据库操作的频率和持有连接的时间。内存泄漏长期运行的Python脚本可能存在内存泄漏。使用htop命令监控Pi的内存使用情况。考虑使用systemd服务管理并配置服务崩溃后自动重启。# 示例 systemd 服务文件 /etc/systemd/system/cat_feeder.service [Unit] DescriptionSmart Cat Feeder Service Afternetwork.target [Service] Userpi WorkingDirectory/home/pi/cat_feeder ExecStart/usr/bin/python3 /home/pi/cat_feeder/app.py Restarton-failure RestartSec10s [Install] WantedBymulti-user.target6.5 功耗与长期运行考虑如果希望系统完全电池供电或使用太阳能功耗是关键。优化方向ESP32深度睡眠猫门在无事件时可以让ESP32进入深度睡眠模式仅由PIR传感器的信号唤醒。这能极大降低待机功耗。Pi的功耗关闭Pi的HDMI、LED灯使用raspi-config降低CPU频率。如果条件允许可以考虑使用更省电的Raspberry Pi Zero 2 W作为主机。传感器供电管理通过MOSFET或继电器模块仅在需要读数时给HX711和DS18B20供电。这个项目从构思到完成花费了远超预期的时间但收获是无价的。它不仅仅是一个自动化工具更是我与技术、与宠物之间建立的一种新的连接方式。看到猫咪自然而然地适应这个系统而你可以在办公室随时查看它今天喝了多少水那种安心感是任何成品设备都无法给予的。最大的体会是在物联网项目中硬件稳定性是第一位的一个松动的接头或一个电源干扰就可能导致 days 的调试。先分模块测试再逐步集成耐心记录每一步的现象和数据是通往成功的唯一捷径。未来我计划加入摄像头进行猫咪识别实现“专猫专用”或许再加一个物联网控制的玩具让科技更好地陪伴这些毛茸茸的家庭成员。