STM32+ESP32智能宠物喂食器:从硬件设计到APP开发的物联网实战
2026/9/4 17:52:25 网站建设 项目流程

简介:本资源是一套完整的智能宠物喂食系统毕业设计/课程设计/竞赛实训项目,面向嵌入式初学者与电子信息类专业学生,解决宠物主人外出时无法定时定量投喂的现实痛点。系统以STM32F103为主控,集成ESP32 WiFi模块实现远程通信,搭配压力传感器、DHT11温湿度、BH1750光照、步进电机及蜂鸣器等硬件,支持手机APP远程控制与自动定时定量投喂。压缩包含248个文件,涵盖Keil工程源码(48个.h、46个.c)、编译中间文件(.o/.d/.lst)、原理图与PCB设计文件(.schdoc)、PDF设计文档、MP4演示视频及.hex固件,总大小263.22MB。已有611人学习下载,提供从硬件选型、电路设计、STM32底层驱动(TIM/RCC/ADC/I2C等)、ESP32联网协议、APP交互逻辑到整机联调的全流程实现,附带可直接烧录运行的工程文件与详细测试验证说明,具备强实践性与教学参考价值。

1. 项目概述与核心价值

最近几年,智能家居的概念越来越火,从智能灯泡到智能门锁,似乎万物皆可“智能”。作为一个电子工程专业出身的爱好者,我总想捣鼓点既实用又有技术含量的东西。家里养了只猫,出差或者临时加班时,最担心的就是它的“吃饭问题”。市面上的智能喂食器要么功能单一,要么价格不菲,而且很多是“黑盒”产品,作为开发者,总想自己动手搞清楚里面的门道。于是,一个基于STM32+ESP32+手机APP的智能宠物喂食系统项目就诞生了。

这个项目本质上是一个集成了机械控制、嵌入式开发、无线通信和移动应用开发的综合性系统。它不仅仅是一个能定时出粮的盒子,更是一个可以让你通过手机远程查看、随时手动投喂、甚至监控余粮状态的智能终端。对于电子、物联网、自动化相关专业的学生来说,这是一个绝佳的毕业设计、课程设计或竞赛选题,因为它覆盖了从硬件选型、电路设计、嵌入式编程到上位机开发的完整产品开发流程,技术栈丰富,实战性强。

我花了几个月时间,从零开始完成了这个系统的设计、制作与调试,过程中踩了不少坑,也积累了很多一线经验。今天,我就把这个项目的完整实物源码、原理图、PCB设计文件、设计文档以及演示视频的干货分享出来,并详细拆解其中的技术要点和实现思路。无论你是想复现一个,还是想从中汲取某个模块(比如ESP32联网、STM32电机控制)的开发经验,相信都能找到你需要的东西。

2. 系统整体架构与设计思路拆解

2.1 为什么选择STM32+ESP32这个组合?

在项目启动时,主控芯片的选择是第一个关键决策。市面上常见的方案有纯STM32加蓝牙模块、纯ESP32、或者树莓派等。我最终选择了STM32作为主控,ESP32作为网络协处理器的架构,主要基于以下几点考量:

  1. 功能解耦与性能最优:STM32(我选用的是STM32F103C8T6,即常说的“蓝莓派”最小系统)在实时控制、多外设管理(如定时器、PWM、ADC)方面具有天然优势,且功耗相对较低。让它专注于核心业务逻辑:读取传感器、控制电机、管理本地定时任务。而ESP32则专精于Wi-Fi和蓝牙连接,其内置的TCP/IP协议栈和丰富的物联网库,能极大地简化网络编程的复杂度。这种架构类似于计算机的“CPU+网卡”,各司其职,稳定高效。

  2. 开发便利性与生态:STM32拥有成熟的HAL库和标准外设库,资料丰富,社区庞大,对于控制逻辑的编写非常友好。ESP32则兼容Arduino框架和ESP-IDF,对于网络功能、JSON数据解析、MQTT/HTTP客户端等功能的实现,几行代码就能搞定。两者通过串口(UART)通信,协议简单,调试方便。

  3. 成本与功耗平衡:STM32F103和ESP32都是性价比极高的芯片。在喂食器大多数处于待机状态时,STM32可以进入低功耗模式,由ESP32负责“监听”网络指令。当需要喂食时,STM32被唤醒执行动作,完成后继续休眠。ESP32也可以配置为仅在需要通信时连接Wi-Fi,其他时间深度睡眠,从而有效控制整体功耗,适合电池供电或长期插电的场景。

整个系统的数据流是这样的:手机APP通过Wi-Fi将控制指令(如“立即喂食”、“设置定时”)发送到家庭路由器,路由器将指令转发给ESP32。ESP32通过串口将指令“翻译”给STM32。STM32解析指令后,驱动步进电机或舵机,打开储粮仓的阀门,完成出粮。同时,STM32可以读取重量传感器(用于称重余粮)或红外传感器(用于检测出粮口状态)的数据,再通过ESP32回传给手机APP,形成闭环。

2.2 核心模块选型与关键器件解析

一个可靠的智能喂食器,硬件是基础。以下是核心模块的选型分析和注意事项:

  • 主控MCU (STM32F103C8T6)

    • 理由:72MHz主频,64KB Flash,20KB RAM,资源对于本项目绰绰有余。拥有多个定时器(用于产生精准PWM控制电机)、USART(与ESP32通信)、ADC(读取模拟传感器)等,且价格低廉,开发板遍地都是。
    • 注意:务必购买正品或靠谱渠道的芯片,市面上有大量翻新或降级片,可能导致程序运行不稳定。
  • 网络模块 (ESP32-WROOM-32)

    • 理由:双核处理器,集成Wi-Fi 4和蓝牙,天线性能好。我选择的是搭载该模组的开发板(如NodeMCU-32S或ESP32-DevKitC),直接使用其USB口进行编程和供电,非常方便。
    • 注意:ESP32的3.3V GPIO口直接连接STM32的3.3V UART引脚即可,无需电平转换。但要注意两者共地。
  • 执行机构(出粮电机)

    • 方案对比
      • 舵机:控制简单,指定角度即可。适合需要精确角度控制、但扭矩要求不高的开门机构。缺点是连续旋转舵机速度慢,且长时间堵转容易烧毁。
      • 步进电机(如28BYJ-48+ULN2003驱动板):控制精准,可以精确控制旋转步数,从而控制出粮量。扭矩大,可靠性高。但需要单片机输出脉冲序列,编程稍复杂。
      • 直流电机+减速箱:力量大,速度快,但需要额外的H桥电路驱动和编码器才能实现精确的位置/速度控制,成本高。
    • 我的选择:为了精确控制每次出粮的份量,我选择了步进电机。通过实验,校准出“旋转200步 ≈ 出粮10克”的关系,这样在程序中就可以通过控制步数来精确控制喂食量。
  • 传感器

    • 余粮检测:方案有称重传感器(HX711模块+应变片)和超声波测距传感器。称重更直接准确,但成本高,安装需考虑结构承重。超声波非接触,安装简单,但精度易受粮食品状、仓内结构影响。作为原型机,我优先使用了超声波传感器(HC-SR04),通过测量粮面高度来估算余粮,基本满足提醒需求。
    • 出粮检测:可以在出粮口安装一个红外对管光遮断传感器,当有粮粒通过时产生信号,用于反馈确认出粮动作是否成功执行,增加系统可靠性。
  • 电源管理

    • 整个系统采用5V/2A的USB电源适配器供电。通过AMS1117-3.3V稳压芯片为STM32和ESP32的IO口及部分传感器提供3.3V电压。步进电机驱动板(ULN2003)直接使用5V供电。务必注意:电机启停时会产生较大的电流波动和反向电动势,可能引起电源电压跌落,导致单片机复位。解决办法是在电机的电源输入端并联一个大容量(如470uF)的电解电容,并靠近电机驱动板放置。

3. 硬件电路设计详解(原理图与PCB)

3.1 核心电路原理图分析

硬件设计是项目稳定的基石。我使用Altium Designer进行设计,所有源文件都会分享。这里挑几个关键电路讲解:

  1. STM32最小系统电路:包括核心的复位电路(10K上拉电阻+0.1uF电容到地)、8MHz晶振及负载电容(22pF)、Boot0/1启动模式选择电路(通常Boot0下拉,Boot1随意)、以及SWD调试接口(SWDIO, SWCLK, GND, 3.3V)。特别注意:每个电源引脚(VDD)附近都必须放置一个0.1uF的退耦电容,且尽可能靠近引脚,这是抑制高频噪声、保证芯片稳定工作的关键。

  2. ESP32与STM32的串口通信电路:这是双核通信的桥梁。连接非常简单:ESP32的TX(GPIO17)接STM32的RX(PA10), ESP32的RX(GPIO16)接STM32的TX(PA9)。两者共地。为了在调试时能单独给ESP32烧录程序,我在ESP32的EN(使能)引脚和IO0(引导模式)引脚上引出了测试点,并连接了轻触开关,方便手动进入下载模式。

  3. 步进电机驱动电路:ULN2003达林顿晶体管阵列驱动板是驱动28BYJ-48这类四相五线步进电机的神器。STM32的四个GPIO(例如PA0-PA3)输出脉冲序列,直接连接到驱动板的IN1-IN4。驱动板的电源接口(+, -)接5V电源和地。电机接口直接插上即可。重要经验:务必在驱动板的电源输入端并上一个大电容(我用了470uF 16V),并且电机的地线一定要和单片机系统的地线良好连接,形成统一的参考地。

  4. 传感器接口电路

    • HC-SR04超声波模块:Vcc接5V, Trig和Echo引脚分别接STM32的GPIO(需设置为推挽输出和浮空输入), GND接地。Echo引脚返回的是5V电平的脉冲,而STM32的IO口耐受5V电压(但并非所有STM32型号都支持,F103系列大部分IO是5V容忍的,但最好查阅数据手册确认),因此可以直接连接。如果担心,可以加一个简单的电阻分压电路(如1K+2K)将5V降至约3.3V。
    • 红外对管:发射管串联一个限流电阻(如150Ω)接3.3V和STM32的GPIO(输出模式)。接收管(光电晶体管)的集电极接一个上拉电阻(如10K)到3.3V,发射极接地,集电极同时接STM32的GPIO(输入模式,配置为上拉或浮空)。当有物体遮挡时,接收管导通,GPIO读到低电平。

3.2 PCB布局布线实战心得

画PCB不仅仅是连线,更是电磁兼容性(EMC)和可制造性(DFM)的考量。以下是我在本次PCB设计中的几点深刻体会:

  • 布局优先:遵循“信号流”原则。电源入口→电源稳压芯片→主控芯片→外设模块。将STM32和ESP32这两个高速数字芯片放在板子中央,其晶振尽可能靠近芯片引脚,且下方不走任何信号线,最好铺地屏蔽。电机驱动、继电器等大电流器件放在板子边缘,远离模拟传感器和晶振区域。

  • 电源树与铺铜

    • 电源走线要“粗、短、直”。我使用了至少20mil(0.5mm)的线宽给5V主干供电。从5V到3.3V LDO(AMS1117)的输入输出端,都放置了不同容值的电容进行滤波:输入端用10uF钽电容滤低频,0.1uF陶瓷电容滤高频;输出端同理。
    • 大面积铺地是降低噪声、提供稳定参考平面的不二法门。我在PCB的顶层和底层都进行了接地铺铜,并通过大量过孔将两层地平面连接起来,形成“地网”。特别注意,数字地(单片机、电机驱动)和模拟地(如果未来接高精度称重传感器)最好通过磁珠或0Ω电阻单点连接,在本项目中暂未区分。
  • 电机干扰的隔离:步进电机是主要的干扰源。在PCB上,我做了以下隔离:

    1. 物理隔离:电机驱动部分的电源线和信号线,与单片机系统的走线尽量远离,避免平行长距离走线。
    2. 电源隔离:电机的5V电源入口处,除了大电容,我还串联了一个功率磁珠(如600Ω/100MHz),用于抑制高频噪声回灌到主电源。
    3. 信号隔离:在STM32控制电机驱动的四根信号线上,我串联了22Ω的电阻,这可以起到阻尼作用,减缓信号边沿,减少振铃和过冲,也能一定程度上限制电流。在信号线靠近电机驱动板输入端的位置,对地放置一个几十皮法的小电容(如47pF),可以滤除高频毛刺。
  • 丝印与调试便利性:给每一个重要的测试点(如电源电压、关键信号)都添加了醒目的丝印标签。为SWD调试接口、ESP32的烧录接口预留了标准的排母。这些细节在调试阶段能节省大量时间。

4. 嵌入式软件设计与核心代码解析

4.1 STM32端固件:精准控制与状态管理

STM32的程序是整个系统的“心脏”,负责所有的实时控制。我使用STM32CubeMX进行初始化配置,然后用Keil MDK进行开发,采用HAL库以提高可移植性。

  • 外设初始化

    • 系统时钟:配置为72MHz,这是F103在外部8MHz晶振下能跑到的最高频率,性能足够。
    • 串口 (USART1):用于与ESP32通信。波特率设置为115200,8位数据位,无校验,1位停止位。必须开启串口接收中断,用于异步接收ESP32发来的指令。
    • 定时器 (TIM2):配置为产生PWM信号,但实际上用于步进电机控制时,我们更常用的是输出比较模式或直接GPIO翻转来模拟脉冲。我使用一个基本定时器(如TIM3)产生1ms的中断,作为系统时基,用于喂食定时、按键消抖等。
    • GPIO:控制电机的GPIO配置为推挽输出;传感器输入的GPIO配置为上拉输入或浮空输入。
  • 主程序逻辑与状态机: 程序的核心是一个状态机,它使程序逻辑清晰,易于维护。主要状态包括:IDLE(待机)、RECEIVING_CMD(解析指令)、FEEDING(执行喂食)、SENSING(读取传感器)。主循环中根据当前状态执行相应任务。

    // 伪代码示例:状态机核心逻辑 typedef enum { SYS_IDLE, SYS_PARSING_CMD, SYS_FEEDING, SYS_SENSING, SYS_ERROR } SystemState_t; SystemState_t gSystemState = SYS_IDLE; void main(void) { // 硬件初始化 HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); MX_TIM3_Init(); // ... 其他初始化 // 开启串口接收中断 HAL_UART_Receive_IT(&huart1, &rx_buffer, 1); while (1) { switch (gSystemState) { case SYS_IDLE: // 低功耗处理,或检查定时任务 check_scheduled_tasks(); break; case SYS_PARSING_CMD: parse_uart_command(); // 解析来自ESP32的指令 break; case SYS_FEEDING: execute_feeding(); // 控制电机出粮 break; case SYS_SENSING: read_sensors(); // 读取超声波、红外等传感器 send_sensor_data_to_esp32(); // 将数据发送给ESP32 gSystemState = SYS_IDLE; break; case SYS_ERROR: handle_error(); break; } // 其他后台任务,如LED闪烁指示状态 } } // 串口中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // 将接收到的字节存入命令缓冲区 cmd_buffer[cmd_index++] = rx_buffer; // 如果收到帧尾(例如换行符'\n'),则切换状态进行解析 if (rx_buffer == '\n') { gSystemState = SYS_PARSING_CMD; } // 重新开启接收中断 HAL_UART_Receive_IT(&huart1, &rx_buffer, 1); } }
  • 步进电机驱动代码: 驱动28BYJ-48需要按特定顺序给四相线圈通电。我采用单四拍方式,力矩较大。定义一个步序数组,在定时器中断中按索引切换GPIO输出。

    // 单四拍步序 (A-B-C-D) const uint8_t stepper_seq[4][4] = { {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1} }; void step_motor_rotate(int steps) { int direction = (steps > 0) ? 1 : -1; steps = abs(steps); for(int i = 0; i < steps; i++) { current_step = (current_step + direction + 4) % 4; // 循环步序索引 HAL_GPIO_WritePin(MOTOR_IN1_GPIO_Port, MOTOR_IN1_Pin, stepper_seq[current_step][0]); HAL_GPIO_WritePin(MOTOR_IN2_GPIO_Port, MOTOR_IN2_Pin, stepper_seq[current_step][1]); HAL_GPIO_WritePin(MOTOR_IN3_GPIO_Port, MOTOR_IN3_Pin, stepper_seq[current_step][2]); HAL_GPIO_WritePin(MOTOR_IN4_GPIO_Port, MOTOR_IN4_Pin, stepper_seq[current_step][3]); HAL_Delay(2); // 延时控制速度,2ms约500Hz,可根据需要调整 } // 停止时关闭所有线圈,降低功耗和发热 HAL_GPIO_WritePin(MOTOR_IN1_GPIO_Port, MOTOR_IN1_Pin, 0); // ... 关闭其他引脚 }

    关键点HAL_Delay(2)这个延时决定了电机转速。太快(延时太小)可能导致电机失步,太慢则出粮慢。需要根据实际电机和负载调整。更好的做法是使用定时器精确控制脉冲间隔。

4.2 ESP32端固件:网络通信与协议桥接

ESP32运行Arduino框架,它的核心任务是连接Wi-Fi,与手机APP通信,并作为串口透传的桥梁。

  • Wi-Fi连接与网络服务

    #include <WiFi.h> #include <WebServer.h> // 或者使用WiFiClient + TCP Server, 或AsyncTCP库 const char* ssid = "Your_SSID"; const char* password = "Your_PASSWORD"; WebServer server(80); // 创建一个端口80的Web服务器 void setup() { Serial.begin(115200); // 与STM32通信的串口 Serial2.begin(115200); // 可备用或调试 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected!"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); // 设置HTTP请求处理函数 server.on("/feed", HTTP_GET, handleFeed); // 处理立即喂食请求 server.on("/schedule", HTTP_POST, handleSetSchedule); // 处理设置定时 server.on("/status", HTTP_GET, handleGetStatus); // 获取状态 server.onNotFound(handleNotFound); server.begin(); } void loop() { server.handleClient(); // 处理客户端请求 // 也可以在这里处理从STM32串口上传来的传感器数据,并主动推送给APP(需要长连接或轮询) } void handleFeed() { // 收到喂食指令 String cmd = "FEED:10\n"; // 假设命令格式为"FEED:[克数]\n" Serial.print(cmd); // 通过串口发送给STM32 server.send(200, "text/plain", "Feeding command sent"); }

    说明:这里我使用了简单的HTTP Server。对于实时性要求更高的场景,可以使用WebSocketMQTT协议。MQTT特别适合物联网设备,功耗低,支持订阅/发布模式。你可以连接一个公共的MQTT Broker(如EMQX Cloud),手机APP和ESP32都作为客户端,通过Topic进行通信,这样即使设备在NAT后,也能实现双向通信。

  • 串口通信协议设计: STM32和ESP32之间需要定义一个简单高效的应用层协议,防止数据错乱。我设计了一个基于“帧头+命令字+数据长度+数据+校验和+帧尾”的文本协议,易于调试。

    • 帧格式示例[STX]CMD:DATA[CS][ETX]
      • [STX](0x02): 帧开始标志。
      • CMD: 命令,如FEEDSTAT
      • DATA: 数据,如10(克数)、OKERR
      • [CS]: 校验和(可选),简单累加和取模。
      • [ETX](0x03): 帧结束标志。 在STM32和ESP32的代码中,分别编写对应的解析函数,根据帧头帧尾截取完整帧,校验后执行相应操作。

5. 手机APP开发与上下位机联调

5.1 APP功能设计与实现要点

手机APP是用户交互的界面。为了快速原型开发,我选择了MIT App Inventor 2Android Studio (Java/Kotlin)。对于初学者,App Inventor图形化编程更友好;对于想深入学习的,Android Studio是正道。这里以核心功能思路为主。

  • 核心界面

    1. 主控制界面:一个大大的“立即喂食”按钮,一个显示当前余粮状态(如“充足”、“不足”)的文本框,一个显示设备连接状态(在线/离线)的指示灯。
    2. 定时设置界面:一个列表,展示已设置的喂食时间点(如08:00, 18:00)和份量。可以添加、编辑、删除定时任务。
    3. 历史记录界面:记录每次手动或自动喂食的时间、份量。
    4. 设置界面:用于配置Wi-Fi(如果ESP32支持SmartConfig)、设备名称、喂食份量校准等。
  • 网络通信

    • HTTP方式:APP向ESP32的IP地址和端口(如http://192.168.1.100/feed)发送GET或POST请求。这是最简单的方式,适合局域网内控制。
    // Android Studio (Kotlin) 示例代码片段 fun sendFeedCommand(amount: Int) { val url = "http://${deviceIP}/feed?amount=$amount" val request = Request.Builder().url(url).build() OkHttpClient().newCall(request).enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { // 处理成功响应 runOnUiThread { showToast("喂食指令发送成功") } } override fun onFailure(call: Call, e: IOException) { // 处理失败 runOnUiThread { showToast("网络连接失败") } } }) }
    • MQTT方式(推荐):APP和ESP32都连接到同一个MQTT Broker。APP发布消息到device/123/feedTopic, ESP32订阅该Topic并执行命令。ESP32也可以发布传感器数据到device/123/status, APP订阅后实时更新UI。这种方式能实现穿透内网的远程控制(需Broker有公网IP或使用云服务)。
  • 数据持久化:使用本地数据库(如SQLite)或SharedPreferences存储定时任务、设备IP等配置,确保APP重启后数据不丢失。

5.2 系统联调与集成测试心得

这是将硬件、嵌入式软件、APP串联起来的关键一步,也是最容易出问题的阶段。

  1. 分模块调试

    • STM32独立测试:不接ESP32,用USB转串口模块连接电脑,通过串口助手发送模拟指令(如FEED:10\n),观察电机是否正常转动,传感器读数是否正常。
    • ESP32独立测试:不接STM32,编写测试程序连接Wi-Fi并创建Web服务器。用手机浏览器访问ESP32的IP,测试网页接口是否正常响应。
    • APP独立测试:使用网络调试工具(如Postman)模拟APP发送HTTP请求,或者先连接一个模拟的MQTT Broker测试消息收发。
  2. 串联调试

    • 物理连接:确保STM32与ESP32的串口线(TX-RX交叉)连接正确且牢固,共地。
    • 波特率一致:双方串口初始化波特率必须完全相同(如115200)。
    • 协议一致:双方对命令格式的解析必须完全匹配,包括帧头帧尾、数据分隔符(如冒号、逗号)。强烈建议在代码中为每个发送和接收的命令添加日志打印,这是排查通信问题最有效的手段。
    // STM32端,发送数据前打印 printf("Sending to ESP32: FEED:10\\n"); HAL_UART_Transmit(&huart1, (uint8_t*)"FEED:10\n", strlen("FEED:10\n"), 1000); // ESP32端,接收数据后打印 if(Serial.available()) { String cmd = Serial.readStringUntil('\n'); Serial.print("[UART RX] "); Serial.println(cmd); // 然后解析cmd... }
  3. 稳定性测试

    • 长时间运行:让系统连续运行24小时以上,观察是否有死机、内存泄漏(对于ESP32尤其要注意)、网络断开重连是否正常。
    • 异常处理:模拟异常情况,如Wi-Fi断开后恢复、串口数据错乱、电机堵转等,看系统能否正确处理或恢复。例如,在STM32代码中加入看门狗(IWDG),防止程序跑飞。
    • 功耗测试:如果考虑电池供电,需要用万用表测量系统在不同状态(休眠、激活、电机运行)下的电流,评估续航能力。

6. 项目文档整理与演示视频制作

6.1 如何撰写一份合格的设计文档

一份清晰的设计文档对于毕业设计、课程设计或项目归档至关重要。它不仅是成果展示,更是你设计思路的体现。我的文档结构如下:

  1. 项目摘要:用一段话简要说明项目名称、目的、主要功能和技术亮点。
  2. 系统总体设计
    • 系统框图(用Visio或Draw.io绘制)。
    • 工作原理阐述(文字描述数据流、控制流)。
    • 主要技术指标(如喂食精度、网络延迟、待机功耗等)。
  3. 硬件设计详解
    • 核心器件选型表(型号、参数、数量、用途)。
    • 系统原理图(附上关键部分讲解)。
    • PCB设计图(顶层、底层、3D视图)。
    • 实物照片(多角度,标注主要模块)。
  4. 软件设计详解
    • 软件架构图(STM32与ESP32分工,APP与服务器通信)。
    • STM32程序流程图(主程序、中断服务程序)。
    • ESP32程序关键代码说明(Wi-Fi连接、服务器处理、串口通信)。
    • 手机APP界面设计图及功能说明。
    • 上下位机通信协议定义(完整帧格式表格)。
  5. 系统测试与结果分析
    • 测试环境说明。
    • 功能测试用例表(测试项、方法、预期结果、实际结果)。
    • 性能测试数据(如出粮量误差统计、网络控制响应时间)。
    • 测试中遇到的问题及解决方案。
  6. 总结与展望
    • 项目完成情况总结。
    • 创新点与特色。
    • 不足之处与可改进方向(如增加摄像头、接入语音助手、使用锂电池供电等)。
  7. 参考文献附录(源码目录结构、元件清单BOM表等)。

6.2 制作一个吸引人的演示视频

视频是展示项目效果最直观的方式。一个高质量的演示视频能给你的答辩或作品集大大加分。

  • 策划脚本:不要想到哪拍到哪。先写一个简单的分镜脚本:
    • (0-30秒) 开场与痛点:快速展示宠物等待喂食的画面,引出问题。
    • (30-60秒) 产品亮相:展示你做好的智能喂食器实物外观。
    • (1-2分钟) 核心功能演示
      • 场景一:手机APP远程点击“立即喂食”,镜头特写喂食器出粮。
      • 场景二:设置定时任务(如下午3点),视频快进到3点,展示自动出粮。
      • 场景三:APP显示“余粮不足”提醒。
    • (2-2分30秒) 技术亮点掠影:快速切换镜头展示内部电路板、软件代码界面、设计图纸等,体现技术含量。
    • (最后30秒) 总结与结尾:宠物开心吃饭的画面,加上项目名称和你的信息。
  • 拍摄与剪辑
    • 设备:手机即可,保持稳定(可用三脚架),光线充足。
    • 收音:环境安静,或后期配音。
    • 剪辑软件:剪映、Premiere等。重点:节奏要快,多用特写镜头展示细节,配上简洁的字幕说明和背景音乐。整个视频控制在3分钟以内为宜。
  • 内容发布:将视频上传至视频平台(如B站、YouTube),在项目文档和开源仓库中附上链接。一个直观的视频往往比几十页文档更能打动观众。

7. 常见问题排查与进阶优化指南

7.1 开发过程中踩过的“坑”与解决方案

  1. ESP32无法连接Wi-Fi

    • 现象:程序一直卡在WiFi.begin()循环。
    • 排查
      • 检查SSID和密码是否正确,特别是大小写和特殊字符。
      • 检查路由器是否设置了MAC地址过滤。
      • 尝试使用WiFi.setSleep(false)禁用省电模式,有些路由器兼容性差。
      • 检查ESP32的供电是否充足,Wi-Fi启动时峰值电流可能超过500mA,劣质USB线或电源可能导致不稳定。
    • 解决:使用WiFi.disconnect()WiFi.reconnect()加入重连逻辑,并增加闪烁LED指示连接状态。
  2. STM32与ESP32串口通信乱码或丢数据

    • 现象:收到的指令不完整或全是乱码。
    • 排查
      • 首要检查:双方波特率、数据位、停止位、校验位是否完全一致
      • 检查地线是否连接可靠。
      • 检查串口引脚是否接反(TX接RX, RX接TX)。
      • 在STM32端,确保串口接收中断的优先级设置合理,且中断服务函数处理要快,避免因处理过长导致数据溢出。
    • 解决:实现一个简单的环形缓冲区来接收数据,在主循环中解析,避免在中断中做复杂处理。同时,在协议中加入校验和,丢弃错误帧。
  3. 步进电机抖动、异响或不转

    • 现象:电机发出“滋滋”声但不动,或转动不顺畅。
    • 排查
      • 供电不足:这是最常见原因。用万用表测量电机驱动板电源输入端电压,在电机转动时是否跌落到5V以下。如果是,更换功率更大的电源(如5V/3A),并在电源端并联大电容。
      • 步序错误:检查代码中的步序表是否正确,是否与电机相序对应。
      • 速度过快:减少每一步之间的延时(HAL_Delay值),但不要太快,28BYJ-48的极限速度不高。
      • 机械卡死:检查喂食机构的机械部分是否阻力过大,电机扭矩是否足够。
  4. 系统偶尔死机或重启

    • 现象:设备运行一段时间后无响应或自动重启。
    • 排查
      • 电源干扰:电机启停是最大的干扰源。确保电源滤波电容足够,电机驱动部分与MCU部分在PCB上隔离良好。
      • 看门狗未喂:如果开启了独立看门狗(IWDG)或窗口看门狗(WWDG),必须在主循环中定期“喂狗”,否则会复位。
      • 堆栈溢出:检查任务堆栈大小是否足够,特别是ESP32上如果使用了FreeRTOS任务。
      • 内存泄漏:在ESP32的Arduino代码中,避免在循环中频繁动态分配内存(如String拼接),容易导致内存碎片最终崩溃。
    • 解决:加强电源滤波;加入看门狗;优化代码结构;使用内存池或静态分配。

7.2 项目进阶优化方向

完成基础功能后,你可以考虑以下方向进行升级,让项目更具竞争力:

  1. 云端化与远程控制:将ESP32连接到物联网云平台(如阿里云IoT、腾讯云IoT Explorer、ThingsBoard等)。这样,即使你不在家,也能通过互联网远程控制喂食器,云平台还能提供数据存储、可视化图表等功能。
  2. 增加视觉功能:集成一个ESP32-CAM或树莓派Zero + 摄像头模块,实现宠物识别、进食行为监控、甚至拍照推送到手机。
  3. 语音交互:接入一个离线语音识别模块(如LD3320)或在线语音助手(如通过ESP32连接天猫精灵/小爱同学开放平台),实现语音控制喂食。
  4. 功耗深度优化
    • 使用STM32的停机(Stop)模式或待机(Standby)模式,将功耗降至微安级。
    • ESP32配置为仅在定时唤醒(如每小时唤醒一次检查指令)或由STM32通过GPIO中断唤醒。
    • 整个系统采用锂电池供电,并设计充电管理电路,实现真正无线便携。
  5. 结构设计与工业化:使用3D打印或亚克力激光切割,设计一个美观、防潮、防宠物破坏的外壳。优化储粮仓和出粮机构,防止粮食卡住或受潮。

这个基于STM32+ESP32+手机APP的智能宠物喂食系统项目,从硬件到软件,从设计到调试,几乎涵盖了物联网产品开发的全部核心环节。它不仅仅是一个喂食工具,更是一个绝佳的学习平台和作品。希望我分享的这些源码、设计文件和实战经验,能为你打开一扇门,助你做出属于自己的、更棒的智能硬件作品。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询