STM32智能宠物投喂系统设计
喂食喂水自动补给+ESP32-CAM远程视频+LU-ASR01语音控制,出差一周也不怕毛孩子挨饿
出差三五天,最放心不下的就是家里的猫狗:饭没人添、水没人换、想看一眼都看不着。这篇基于 STM32 的智能宠物投喂系统就是冲着这些痛点去的:DHT11 监测温湿度、SR-01 电阻式水位传感器盯水量、TCRT5000 红外检测食盆余粮、缺水缺粮自动报警补给,自动/手动双模式,配 ESP32-CAM 摄像头远程看宠物实时活动、LU-ASR01 语音识别动口不动手、ESP8266 联网手机 APP 远程操控。选型对比、电路接线、程序流程、整机调试一次讲透。
一、系统功能拆解
一句话总结:多参数采集(温湿度/水量/食物量)→ 阈值判断自动补给/环境调节 → 本地显示 + 视频 + 语音 + APP 四通道交互。
| 功能 | 实现方式 | 对应硬件 |
|---|---|---|
| 温湿度监测 | 数字温湿度传感器,阈值联动加热/除湿 | DHT11 |
| 水量检测 | 电阻式水位传感器模拟量采样 | SR-01 + ADC |
| 自动补水 | 水量低于阈值 → 报警并补给 | 继电器 + 水泵 |
| 食物检测 | 红外反射检测食盆余粮,缺粮自动投喂 | TCRT5000 |
| 环境调节 | 温度低自动加热、湿度高自动除湿 | 继电器 + 加热/除湿模块 |
| 模式切换 | 自动模式阈值闭环 / 手动模式直接控制 | 独立按键 |
| 语音控制 | 语音指令操作投喂、加水等功能 | LU-ASR01 |
| 远程视频 | 实时视频流上传 APP 查看宠物活动 | ESP32-CAM(OV2640) |
| 远程监控 | 数据上传 + APP 切换模式/远程操控 | ESP8266-01S |
| 数据显示 | 温湿度、水量、食物状态实时刷新 | OLED12864(SSD1306) |
这套系统的差异化看点是"视频 + 语音"双通道:普通投喂器只管喂,这台还让你远程"看"和现场"喊"——ESP32-CAM 独立跑视频流不占主控资源,LU-ASR01 离线语音识别不依赖网络,两个都是十几块钱的模块,成本压得很低。
二、器件选型:每个模块都对比过
| 器件 | 选型结果 | 淘汰方案 | 核心理由 |
|---|---|---|---|
| 主控 | STM32F103C8T6 | PIC32MX795F512L | 72MHz 够用、生态成熟、成本减半 |
| 温湿度 | DHT11 | DHT22 | ±2°C/±5%RH 对环境调节足够,便宜一半 |
| 水位 | SR-01 电阻式 | MS-5803-01BA 压力式 | 结构简单安装方便,宠物水盆场景够用 |
| 摄像 | ESP32-CAM(OV2640 2MP) | OV5640(5MP) | 自带 WiFi+TCP 推流,主控零负担 |
| 语音 | LU-ASR01 | XY-V21 | 嘈杂环境识别更稳、32MB 闪存词条多 |
| 食物检测 | TCRT5000 | QTR-8A 八路阵列 | 单点检测食盆余粮,一个够用 |
| 显示 | OLED12864 | LCD2004 | 自发光无需背光、IIC 只占两根线 |
| 无线 | ESP8266-01S | LoRa SX1278 | 直连 WiFi 入互联网,LoRa 到不了手机 APP |
几个关键选型理由展开讲:
- ESP32-CAM vs OV5640:OV5640 分辨率高一档,但它是"裸摄像头",得主控配 DCMI 接口接收、再想办法压缩传输,STM32F1 干这个很吃力;ESP32-CAM 是摄像头+CPU+WiFi 一体的独立小系统,自己完成采集、JPEG 压缩、TCP 推流,STM32 只需要通过 APP 逻辑控制它开/关——视频这种重活必须让专职模块干。
- SR-01 vs 压力式水位:MS-5803 精度高还能测深水,但宠物水盆就几厘米深,压力式的高精度完全是浪费;SR-01 十几块钱,插在水盆里通过电极电阻变化反映水位,配 ADC 多次均值采样,精度足够判断"该补水了"。
- LU-ASR01 vs XY-V21:语音交互的生死线是噪声鲁棒性——宠物在家里叫、电视开着、风扇转着,识别率掉到 70% 以下就形同虚设;LU-ASR01 的降噪表现和可扩展词条量都是为这种场景准备的。
- DHT11 vs DHT22:环境调节的联动阈值(比如低于 15°C 开加热)对精度要求不高,±2°C 完全够用,DHT22 的 0.5°C 精度在这个场景买不回差价。
整套物料成本约 90~120 元,比市售带摄像头的智能投喂器(300 元起)便宜一大截,而且功能可以自己改。
三、电路设计:接线表 + 关键要点
主控最小系统:3.3V 供电,HSE 8MHz 晶振 + RTC 32.768kHz,复位电路按键 + RC 组合拉低 NRST。
| 模块 | 接口方式 | 连接引脚(参考) | 备注 |
|---|---|---|---|
| DHT11 | 单总线 | DATA → 数字 IO | 5V 供电,DATA 需 10kΩ 上拉 |
| SR-01 | 模拟输出 | S → ADC 输入通道 | 5V 供电,多次采样取均值 |
| TCRT5000 | 数字输出 | OUT → GPIO 上拉输入 | 5V 供电,低电平 = 检测到食物 |
| ESP32-CAM | 独立 WiFi 系统 | 无需接主控(可选 IO 控制开关) | 5V 供电,峰值电流 250mA+ |
| LU-ASR01 | UART | TXD → 主控 RX | 115200bps,中断接收 |
| ESP8266-01S | UART2 | PA2(TX)/PA3(RX),RST→PA4 | 3.3V,CH_PD 拉高 |
| OLED12864 | IIC | PB6(SCL)/PB7(SDA) | 3.3V |
| 继电器组 | GPIO 输出 | 水泵/出粮/加热/除湿各一路 | 三极管驱动 |
接线五个坑:
- ESP32-CAM 供电必须 5V 且要粗:WiFi 发射 + 摄像头工作瞬间峰值电流 250mA 以上,从 STM32 板载 3.3V 借电必死机黑屏,独立 5V 供电加 470µF 大电容是标配。
- 双无线模块 WiFi 配置要一致:ESP32-CAM 和 ESP8266 各自连 WiFi,SSID/密码要写对同一套,且都要在路由器 2.4G 频段——5G-only 的路由器两个模块全都连不上。
- SR-01 电极长期泡水会电解腐蚀:电阻式水位传感器的探针在水里持续通电会产生电解,水位值越漂越远,一是选镀金探针版本,二是软件上周期性采样(不要高频连续通电),三是每隔几周检查清洗一次。
- TCRT5000 检测"有没有粮"的安装角度:装在出粮口下方检测落粮,或装在食盆边缘检测余粮高度,两种用途安装位置完全不同,先想清楚检测逻辑再打孔,装反了"缺粮报警"就变成"投喂成功报警"。
- 继电器组与 ADC 信号线分区走线:水泵/加热继电器吸合的感性干扰耦合进 SR-01 的模拟信号线,水位读数会瞬间乱跳,信号线远离继电器输出侧,必要时加 RC 滤波。
四、软件设计
4.1 主程序框架
int main(void)
{
SystemInit();
delay_init();
KEY_Init(); // 模式切换 + 阈值设定 + 手动控制
DHT11_Init(); // 温湿度
ADC1_Init(); // SR-01 水位采样
OLED_Init();
Relay_Init(); // 水泵/出粮/加热/除湿
USART1_Init(115200); // LU-ASR01 语音
USART2_Init(115200); // ESP8266
ESP8266_Connect(); // STA 连 WiFi → 透传 → TCP 服务器
while (1)
{
DHT11_Read(&temp, &humi);
water = Get_Water_Level(); // ADC 均值 → 水位换算
food = Food_Scan(); // TCRT5000 低电平=有粮
if (mode == AUTO)
{
if (water < water_th) { Alarm(ON); Relay_Pump(ON); } // 缺水报警+补水
else { Relay_Pump(OFF); }
if (!food) { Alarm(ON); Relay_Feed(ON); } // 食盆空→投喂
else { Relay_Feed(OFF); }
if (temp < temp_th) Relay_Heat(ON); // 温度低→加热
if (humi > humi_th) Relay_Dehum(ON); // 湿度高→除湿
}
key_scan(); // 手动模式:按键直控投喂/补水/加热/除湿
voice_cmd_handle(); // 语音指令解析(串口中断收到的命令字)
OLED_Show(temp, humi, water, food, mode);
WiFi_Report(temp, humi, water, food);
Handle_APP_Cmd(); // APP 下发:切模式 / 远程投喂 / 开关摄像头
}
}
4.2 DHT11 读取:单总线时序
u8 DHT11_Read(u8 *temp, u8 *humi)
{
DHT11_Rst(); // 主机拉低 20ms → 拉高 30us
if (DHT11_Check() != 0) // 等 DQ 低 80us → 高 80us 响应
return 1; // 传感器不在线
/* 连续读 5 字节:湿度整数/小数 + 温度整数/小数 + 校验 */
buf[0] = DHT11_Read_Byte();
...
buf[4] = DHT11_Read_Byte();
if (buf[0]+buf[1]+buf[2]+buf[3] == buf[4]) // 校验和
{
*humi = buf[0];
*temp = buf[2];
return 0;
}
return 1; // 校验失败
}
每个字节的读取是"50us 低电平起始 + 26~70us 高电平表数据位",高电平持续时间决定 0 还是 1——时序全部用 us 级延时函数实现,期间不能被中断打断,把 DHT11 读取放在主循环里关中断做,或者干脆用定时器捕获。
4.3 SR-01 水位:ADC 采样 + 均值换算
u16 Get_Water_Level(void)
{
u32 sum = 0;
u8 i;
for (i = 0; i < 10; i++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等转换完成
sum += ADC_GetConversionValue(ADC1); // 12bit: 0~4095
}
return Water_Convert(sum / 10); // 按传感器量程标定换算实际水位
}
采样时间配 239.5 周期,10 次均值后水位读数才稳定。换算系数要实测标定:空盆记一次 ADC 值,满盆记一次,两点连线就是标定曲线——直接抄别人的系数,水量能差出一半。
4.4 TCRT5000 食物检测:低电平 + 防抖确认
u8 Food_Scan(void)
{
if (GPIO_ReadInputDataBit(GPIO_FOOD, PIN_FOOD) == Bit_RESET) // 低=有食物
{
delay_ms(10); // 消抖
if (GPIO_ReadInputDataBit(GPIO_FOOD, PIN_FOOD) == Bit_RESET)
return 1; // 二次确认仍有粮
}
return 0; // 无粮 → 触发投喂
}
引脚配上拉输入,低电平有效,10ms 防抖后二次确认——光电开关的输出在粮粒滚动的瞬间会抖动,单次判断会误触发投喂。
4.5 ESP32-CAM 视频推流
ESP32-CAM 是独立小系统,程序思路:STA 模式连 WiFi(关闭 WiFi 睡眠提速,重试 20 次)→ 启动 TCP 服务器监听 8080 端口 → 关闭小包合并(Nagle)降延迟 → 有客户端接入后循环:取摄像头帧缓冲 → 按 1024 字节分包加开始/结束标志发送 → 清空帧缓冲。STM32 侧不参与视频链路,只通过 APP 命令控制摄像头开/关和 LED。
4.6 LU-ASR01 语音指令
模块出厂已烧录识别固件,主控侧只做"听串口":串口中断收到 0xC0 帧头表示新命令块开始,累积字节后按命令 ID 分发——比如 0x01 投喂、0x02 补水、0x03 切换模式。串口配置 115200-8-N-1,接收引脚浮空输入。词条在模块端用厂商上位机录制烧录,先唤醒词再命令词的两级结构可以大幅降低误触发。
4.7 ESP8266 联网与透传
RST 拉低复位 → 等 "ready"
AT+CWMODE=1 → STA 模式
AT+CWJAP="SSID","PWD" → 连 WiFi 等 "OK"
AT+CIPMUX=0 → 关多路连接
AT+CIPMODE=1 → 透传模式
AT+CIPSTART="TCP",... → 连 TCP 服务器等 "CONNECT"
之后串口即网络:主控周期上报 T:xx;H:xx;W:xx;F:x,APP 下发的模式切换和远程投喂指令经透传直达串口中断解析执行。
五、整机调试:按功能逐项验证
Keil 5 + ST-Link 开发调试,软件先跑通各模块驱动,再联调逻辑闭环。
| 测试项 | 操作 | 预期结果 |
|---|---|---|
| 温湿度 | 对比温湿度计 + 呵气加湿 | 读数一致,响应及时 |
| 水位标定 | 空盆→满盆两点标定 → 中间水位验证 | 显示与实际水量吻合 |
| 自动补水 | 放掉水盆的水到阈值下 | 报警响 + 水泵启动,补到设定值停 |
| 食物检测 | 取走食盆食物 | 检测无粮 → 自动出粮投喂 |
| 环境调节 | 温度降到阈值下 / 湿度升到阈值上 | 加热/除湿分别联动 |
| 语音控制 | 喊唤醒词+命令词(开电视造噪声) | 嘈杂环境识别仍可靠 |
| 视频推流 | APP 连接 8080 端口 | 实时画面流畅,延迟可接受 |
| APP 远程 | 切换模式 / 远程投喂 / 查看数据 | 指令执行 + 状态回传 |
| 手动模式 | 按键直接控制四路负载 | 即按即动,互不干扰 |
六、常见坑汇总
- 原论文主流程里有句表述要警惕:“当水量低于阈值或者检测到食物时,系统触发报警并自动投喂”——检测到食物就投喂?逻辑显然反了:正确逻辑是"食盆空了(检测不到食物)才投喂"。改写程序时按后者实现,不然食盆越满投得越欢,宠物直接吃成球。
- DHT11 读取被中断打断:单总线时序全靠 us 级延时,串口中断一插进来时序就乱,读数校验失败率飙升。读 DHT11 前关中断(或确保读取期间无中断),读完再开。
- ESP32-CAM 与 ESP8266 抢路由器:两个模块同时推流/上报时,廉价路由器可能掉一个,测试时先单独调通一个再并另一个;路由器务必开 2.4G 频段。
- 水位电极电解漂移(见接线坑 3):表现为系统用了几天后"明明有水却报缺水",先查标定曲线是否漂了,重新标定一次即可恢复。
- 语音模块误触发:电视里的声音、家人闲聊都可能撞上词条,一定要用"唤醒词+命令词"两级确认,并且把唤醒词选得生僻一点(比如设备名而不是"小爱同学"这种大众词)。
- 投喂量不做反馈会越积越多:出粮电机转固定时间=固定份量,但猫粮颗粒大小/出粮口堵塞都会让实际量漂移,有条件加称重反馈(一片 HX711),没条件至少在 APP 里做投喂记录供主人核对。
七、可扩展方向
- 出粮口加 5V 称重模块(HX711),从"定时定量"升级"按克投喂",多宠家庭还能做配额;
- 视频 + 移动侦测,宠物异常行为(长时间不进食)自动推送提醒;
- 换 4G 模块或接入智能家居网关,租房没 WiFi 的场景也能用。
六、资料内容完整工程资料(原理图、PCB、代码、元件清单)

七、资料获取方式

更多推荐



所有评论(0)