喂食喂水自动补给+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 离线语音识别不依赖网络,两个都是十几块钱的模块,成本压得很低。

二、器件选型:每个模块都对比过

器件选型结果淘汰方案核心理由
主控STM32F103C8T6PIC32MX795F512L72MHz 够用、生态成熟、成本减半
温湿度DHT11DHT22±2°C/±5%RH 对环境调节足够,便宜一半
水位SR-01 电阻式MS-5803-01BA 压力式结构简单安装方便,宠物水盆场景够用
摄像ESP32-CAM(OV2640 2MP)OV5640(5MP)自带 WiFi+TCP 推流,主控零负担
语音LU-ASR01XY-V21嘈杂环境识别更稳、32MB 闪存词条多
食物检测TCRT5000QTR-8A 八路阵列单点检测食盆余粮,一个够用
显示OLED12864LCD2004自发光无需背光、IIC 只占两根线
无线ESP8266-01SLoRa 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 → 数字 IO5V 供电,DATA 需 10kΩ 上拉
SR-01模拟输出S → ADC 输入通道5V 供电,多次采样取均值
TCRT5000数字输出OUT → GPIO 上拉输入5V 供电,低电平 = 检测到食物
ESP32-CAM独立 WiFi 系统无需接主控(可选 IO 控制开关)5V 供电,峰值电流 250mA+
LU-ASR01UARTTXD → 主控 RX115200bps,中断接收
ESP8266-01SUART2PA2(TX)/PA3(RX),RST→PA43.3V,CH_PD 拉高
OLED12864IICPB6(SCL)/PB7(SDA)3.3V
继电器组GPIO 输出水泵/出粮/加热/除湿各一路三极管驱动

接线五个坑:

  1. ESP32-CAM 供电必须 5V 且要粗:WiFi 发射 + 摄像头工作瞬间峰值电流 250mA 以上,从 STM32 板载 3.3V 借电必死机黑屏,独立 5V 供电加 470µF 大电容是标配。
  2. 双无线模块 WiFi 配置要一致:ESP32-CAM 和 ESP8266 各自连 WiFi,SSID/密码要写对同一套,且都要在路由器 2.4G 频段——5G-only 的路由器两个模块全都连不上。
  3. SR-01 电极长期泡水会电解腐蚀:电阻式水位传感器的探针在水里持续通电会产生电解,水位值越漂越远,一是选镀金探针版本,二是软件上周期性采样(不要高频连续通电),三是每隔几周检查清洗一次。
  4. TCRT5000 检测"有没有粮"的安装角度:装在出粮口下方检测落粮,或装在食盆边缘检测余粮高度,两种用途安装位置完全不同,先想清楚检测逻辑再打孔,装反了"缺粮报警"就变成"投喂成功报警"。
  5. 继电器组与 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 远程切换模式 / 远程投喂 / 查看数据指令执行 + 状态回传
手动模式按键直接控制四路负载即按即动,互不干扰

六、常见坑汇总

  1. 原论文主流程里有句表述要警惕:“当水量低于阈值或者检测到食物时,系统触发报警并自动投喂”——检测到食物就投喂?逻辑显然反了:正确逻辑是"食盆空了(检测不到食物)才投喂"。改写程序时按后者实现,不然食盆越满投得越欢,宠物直接吃成球。
  2. DHT11 读取被中断打断:单总线时序全靠 us 级延时,串口中断一插进来时序就乱,读数校验失败率飙升。读 DHT11 前关中断(或确保读取期间无中断),读完再开。
  3. ESP32-CAM 与 ESP8266 抢路由器:两个模块同时推流/上报时,廉价路由器可能掉一个,测试时先单独调通一个再并另一个;路由器务必开 2.4G 频段。
  4. 水位电极电解漂移(见接线坑 3):表现为系统用了几天后"明明有水却报缺水",先查标定曲线是否漂了,重新标定一次即可恢复。
  5. 语音模块误触发:电视里的声音、家人闲聊都可能撞上词条,一定要用"唤醒词+命令词"两级确认,并且把唤醒词选得生僻一点(比如设备名而不是"小爱同学"这种大众词)。
  6. 投喂量不做反馈会越积越多:出粮电机转固定时间=固定份量,但猫粮颗粒大小/出粮口堵塞都会让实际量漂移,有条件加称重反馈(一片 HX711),没条件至少在 APP 里做投喂记录供主人核对。

七、可扩展方向

  • 出粮口加 5V 称重模块(HX711),从"定时定量"升级"按克投喂",多宠家庭还能做配额;
  • 视频 + 移动侦测,宠物异常行为(长时间不进食)自动推送提醒;
  • 换 4G 模块或接入智能家居网关,租房没 WiFi 的场景也能用。

六、资料内容完整工程资料(原理图、PCB、代码、元件清单)


七、资料获取方式

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐