基于STM32的物联网宠物喂食器:从需求拆解到毕设落地的完整复盘
基于STM32的物联网宠物喂食器从需求拆解到毕设落地的完整复盘最近好几个师弟师妹来问我同一个问题宠物喂食器这个题目到底怎么下手搜了一圈资料发现要么是商家软文要么是51单片机加个舵机就完事的简化版真正能把“物联网”三个字做实、又能顺利通过答辩的内容反而很少。我干脆把自己做这题的完整思路、代码结构、硬件选型和踩坑记录整理出来给准备拿STM32做毕设的朋友一份能直接对着做的参考。这篇内容适合三类人一是物联网工程、电子信息、自动化专业的应届毕业生正在纠结毕设选题二是想自己做一台智能喂食器送给家里主子的DIY玩家三是准备参加电子设计竞赛、想把“智能硬件小项目”做得更完整的学生团队。无论你是哪种这篇文章的目标只有一个——让你从“听说过STM32”到“能独立把一台宠物喂食器做出来并跑通物联网通信”。先交代一下我当时技术选型的大体框架再展开细讲主控用STM32F103C8T6称重模块用HX711加电阻应变片压力传感器出粮机构用步进电机加螺旋推进器Wi-Fi模块用ESP8266-01S上位机用微信小程序通过MQTT协议控制云平台用的是阿里云物联网平台。这套方案下来你要花钱的地方大约在150元以内BOM清单我后面会给出。1. 整体设计与思路拆解1.1 为什么主控选STM32F103C8T6而不是51或者Arduino很多人在选题初期最先纠结的就是主控芯片。今年搜索词里“51单片机电磁炉程序大全”“c51单片机串口升级架构”这类词热度一直很高说明还是有不少人在51和STM32之间犹豫。我的观点非常直接毕设选题选STM32性价比远高于51。原因有三。第一从工作量角度说51单片机做一个“电机定时转几圈”的喂食器确实也能跑但那更像大二课程设计撑不起一篇合格的毕业论文。STM32F103C8T6基于Cortex-M3内核主频72MHzRAM有20KBFlash有64KB外设接口丰富你可以名正言顺地把“FreeRTOS移植”“多任务调度”“ESP8266驱动”“MQTT协议栈对接”这些内容写进论文里。开题报告、中期检查、正文撰写、系统测试这些环节每个都有着力的点。第二从电路复杂度和调试难度来看STM32F103C8T6是LQFP48封装引脚间距0.5mm手工焊接虽然有难度但如果你用转接板或者直接在核心板上开发跳线连接就非常方便了。国内市面上十几块钱就能买到一块完整的核心板板载晶振、复位电路、USB转串口芯片插上数据线就能用Keil下载程序省去了自己画最小系统板的功夫。第三从答辩和后续扩展的角度看用STM32意味着你可以很自然地把“多传感器融合”“嵌入式实时操作系统”“低功耗管理”“云平台对接”这些术语串起来而这些恰恰是评审老师关注的重点方向。你总不希望答辩时被问“你为什么不用STM32”然后只能回答“因为不太会”吧。1.2 功能模块拆解一台喂食器到底需要什么我不能直接说“照着我的方案做就一定能拿优”但一个功能完整、逻辑自洽的宠物喂食器至少应该覆盖以下五个维度定时定量出粮这是喂食器的核心功能。你需要能配置每天喂几次、每次出多少克系统到点后自动控制执行机构完成出粮。余粮检测与缺粮报警最好能实时知道储粮桶里还剩多少粮低于阈值时通过手机通知主人。远程控制主人不在家时可以通过手机App或小程序手动触发一次出粮。状态可视化设备要能上报当前余粮、上次喂食时间、设备在线状态等信息让用户随时能看。异常提示与基础数据记录比如电机堵转、传感器离线等异常情况需要反馈到用户端喂食历史数据最好也能保留一段时间方便查看。这五个功能全部做完工作量已经比较饱满了。如果你的毕设要求更高还可以往上加摄像头拍照、语音播报、环境温湿度监测等模块但我建议先保证主体功能稳定再做锦上添花的事。硬件架构上我采用的是“主控传感器执行机构通信模块”的经典四层结构。主控层负责逻辑调度传感器层负责采集数据执行机构层负责物理动作通信模块层负责跟云端交互。这四层之间通过GPIO、UART、I2C等接口连接每一层职责单一哪一环出了问题可以快速定位。1.3 软件架构为什么用FreeRTOS而不是裸机编程很多教程示例代码都是裸机轮询的方式就是一个while(1)循环里挨个处理按键、显示、传感器等任务。这种写法在小项目里没问题但放到宠物喂食器这种“既要实时响应电机控制又要处理网络数据还要定时读称重数据”的场景下很容易出现任务之间互相拖延的情况。我当时对是否上FreeRTOS犹豫过后来做了一版裸机代码实测ESP8266在使用TCP透传模式时因为要处理串口中断接收、数据帧解析、超时重传等逻辑会导致主循环里定时器的读取延迟几十毫秒。对步进电机控制来说几十毫秒的延迟不至于出错但如果你后面要接多个传感器或者做更复杂的逻辑这种延迟会被不断放大。上FreeRTOS之后我把系统分成几个独立任务出粮控制任务负责初始化步进电机GPIO和定时器PWM等待队列消息有出粮指令就执行执行完更新状态标志。称重采集任务定时读取HX711数据做滤波处理把余粮值写入共享变量。网络通信任务处理ESP8266收发的数据维护MQTT心跳接收来自云端的控制指令。LED/提示灯任务纯辅助性质用于本地状态显示。任务之间通过FreeRTOS的队列和信号量通信互相不阻塞。这样设计之后即使网络通信任务在处理一个超时重传出粮控制任务依然可以准时执行。我测试过在ESP8266断网重连的场景下喂食器的定时出粮功能完全不受影响这就是实时操作系统的价值。2. 核心硬件选型与电路设计要点2.1 出粮机构步进电机和舵机到底选哪个这是很多新手最纠结的点。淘宝上卖的宠物喂食器大多用舵机带动一个拨片或者转盘好处是便宜、控制逻辑简单坏处是扭力有限、出粮量控制不精确。如果你用的是颗粒直径不均匀的猫粮狗粮舵机拨片很容易卡粮而且一颗粮卡住就可能导致后面的粮全部堵在出粮口。我最终选择的是28BYJ-48步进电机加ULN2003驱动板。这个组合在淘宝上大概十块钱左右优点是扭矩比舵机大、控制精确、可以通过控制步数来精确控制出粮量缺点是需要额外的驱动电路和脉冲控制逻辑。不过在STM32上产生PWM脉冲是小菜一碟用定时器输出比较模式和GPIO翻转都行示例代码网上非常多。出粮机构的具体设计我用的是“步进电机直连螺旋推进器”方案。储粮桶底部开一个圆孔螺旋推进器插入圆孔中电机转动时螺旋叶片把粮食从桶内推到出粮口。这种结构相当于一个简易的螺旋输送机对颗粒状粮食的适应性比拨片方案好很多也不容易卡粮。如果实在买不到合适的螺旋推进器用一个内径稍大的弹簧也可以临时替代效果还不错。出粮量标定是一个需要实测的过程。理论上电机转N圈对应出粮M克但粮的颗粒大小、湿度、储粮桶内粮食余量都会影响实际出粮量。我做了多次标定的结果同一批次猫粮每转出粮量误差大约在5%到10%之间。这个精度对宠物喂食场景完全够用——你家猫不会因为一顿少了2克粮就找你算账但你需要在论文测试部分把这个误差数据如实记录下来。2.2 称重方案HX711加电阻应变片传感器储粮桶里的余粮检测如果你不加这个模块系统就是个“会定时倒粮的盒子”离“智能”还差得远。加上余粮监测之后你才能实现缺粮提醒、按剩余量动态调整出粮次数这些更有价值的功能。称重方案我选了HX711加电阻应变片式压力传感器。HX711是一颗24位高精度A/D转换芯片专门用于电子秤方案两路差分输入内置稳压电源通信接口是简单的两线制DOUT和SCK直接接STM32的任意两个GPIO口就可以读取数据。芯片成本大概两三块钱配套的压力传感器也就两三块钱整套称重方案成本在五块钱以内。电路连接上有一点需要特别注意HX711的供电最好用独立的模拟电源或者至少要用RC滤波电路对电源进行去耦。因为步进电机启动瞬间电流波动很大如果和HX711共用一个电源称重数据会剧烈跳动。我一开始没注意这个问题电机一转起来称重数据从800克直接跳到1200克查了两天才发现是电源干扰。后来在HX711的AVDD引脚加了一个10uF电容和一个0.1uF电容并联去耦电机转动时称重数据波动从几十克降到了两三克效果立竿见影。软件上HX711的原始数据并不能直接当重量用。你需要先进行标定放一个已知重量的物体读取原始值计算比例系数。具体公式和标定流程我在第三节实操部分详细展开。2.3 通信模块ESP8266-01S连接阿里云物联网平台ESP8266-01S在物联网毕设里是老熟人了。它本身是一颗完整的Wi-Fi SoC可以通过AT指令控制也可以刷NodeMCU固件用Lua脚本开发甚至可以直接用Arduino IDE开发。在STM32为主控的架构里最省事的方式就是让ESP8266跑AT固件STM32通过串口向它发送AT指令完成连接Wi-Fi、建立TCP连接、订阅MQTT主题等操作。选择ESP8266-01S而不是ESP32或者ESP8266-12F主要原因是01S模块体积小、引脚少、接入简单。四个引脚里我们只用TXD、RXD、VCC、GND剩下的EN引脚拉高、GPIO0悬空即可非常适合快速原型验证。云平台选型方面我试过两个方案。第一版用的是自己搭的TCP服务器加MQTT Broker当时想着这样可以展示更多的网络功底但实际调试起来很痛苦——你得自己维护设备认证、消息持久化、离线消息补发等等一堆问题毕设时间根本耗不起。后来切换到阿里云物联网平台设备接入、主题定义、消息流转这些全都图形化配置省了大量时间。而且阿里云物联网平台的公共实例免费额度对于毕设场景完全够用也不用担心被收费。MQTT协议理解起来其实不复杂你可以把它想象成一个公告板系统。设备端和手机端都是“订阅者”它们可以订阅某个主题也可以向某个主题发布消息。阿里云物联网平台充当公告板本身负责把发布者的消息转发给所有订阅者。宠物喂食器的场景中设备订阅的主题用来接收手机下发的控制指令设备发布的主题用来上报状态数据。每一条消息都有主题和内容两部分内容格式你自行定义自由度和灵活性都很大。2.4 BOM清单和整体连线要点模块型号/规格参考价格元关键接口主控核心板STM32F103C8T6核心板15引脚间距2.54mm步进电机套装28BYJ-48 ULN2003驱动板12IN1~IN4接GPIO称重模块HX711模块 1kg压力传感器8DOUT、SCK接GPIOWi-Fi模块ESP8266-01S 转接板10UART2PA2、PA3电源手机充电器5V/2A AMS1117-3.3V10核心板输入5V储粮桶/外壳亚克力定制或3D打印40根据设计自行加工其他杜邦线、面包板、电阻电容等20—连线方面步进电机驱动板的IN1到IN4分别接STM32的PB12到PB15HX711的DOUT和SCK接PB6和PB7ESP8266的TXD和RXD接PA3和PA2即USART2的RX和TX。VCC和GND注意3.3V和5V别接错ESP8266-01S的VCC需要接3.3V接5V会烧模块。这可能是新手最容易犯的错误我亲眼见过好几个同学烧过模块。3. 软件实现与AI助手辅助开发实录3.1 STM32端工程搭建我用的开发环境是Keil MDK5加STM32CubeMX生成的初始化代码。三个文件夹分别是Core、Drivers和MiddlewaresDrivers里放HAL库和CMSISMiddlewares里放FreeRTOS。这些通过CubeMX图形化配置就能自动生成没必要手写启动文件和时钟配置。CubeMX里的关键配置项我先列出来时钟源选择外部晶振HSE主频设为72MHz。USART1设为异步模式波特率115200用于调试日志输出。USART2设为异步模式波特率115200用于和ESP8266通信。TIM3设为PWM生成模式输出通道CH1和CH2频率为3.2kHz用于步进电机脉冲控制。这里选3.2kHz是因为28BYJ-48步进电机的最高空载频率大约在3.5kHz左右留一些余量防止丢步。GPIO配置PB12~PB15设为推挽输出控制ULN2003的四个输入PB6、PB7设为输入/输出模式用于HX711通信。FreeRTOS配置通过CMSIS-V1接口启用堆大小设为8KB默认创建两个任务。生成代码之后剩下的工作就是往模板里填充业务逻辑。3.2 步进电机驱动程序28BYJ-48是四相八拍步进电机驱动方式有两种一种是直接用GPIO依次给四相通电每步换一次相序另一种是用ULN2003驱动板上面自带的逻辑通过脉冲加方向信号控制。但淘宝上最常见的ULN2003驱动板上其实并没有做脉冲分配它就是简单的达林顿管阵列所以STM32需要自己产生四相时序。我用的方式是直接GPIO翻转相序表如下const uint8_t motorSteps[8][4] { {1, 0, 0, 0}, {1, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 1}, {1, 0, 0, 1} };每步对应的相序就是让四个引脚按照这个表依次输出高低电平。28BYJ-48内部减速比是1:64也就是电机轴转一圈需要64乘8等于512个步进周期。我计算过实际测试值出粮口每转一圈大约出粮3克如果你要出10克粮就控制电机转3.33圈也就是约1706步。这个数字我标定了好几轮才稳定下来不同粮食颗粒大小差异很大你在做的时候一定要根据自己使用的粮重新标定。步进电机的转速控制也很关键。如果你直接让定时器以最高频率驱动电机电机会因为惯性导致丢步发出的脉冲数和实际转动步数不一致出粮量就不准。我采取的是加速度控制启动时先给一个比较低的频率比如1000Hz然后逐步加速到2500Hz接近目标步数时再逐渐减速。这样电机转动非常稳定最后几步也不会因为惯性冲过头。如果你嫌麻烦也可以直接用固定频率1500Hz跑误差在可以接受的范围内。3.3 HX711称重读取与滤波HX711的通信协议是典型的时序控制型协议。每次读取时你首先要把DOUT引脚拉高然后把SCK引脚输出24个上升沿脉冲每来一个脉冲DOUT引脚上就会移出一位数据。24位数据格式是二进制补码需要合成为一个int32类型变量。简单的读取代码框架uint32_t HX711_Read(void) { uint32_t Count 0; uint8_t i; HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET); while (HAL_GPIO_ReadPin(HX711_DOUT_GPIO_Port, HX711_DOUT_Pin) GPIO_PIN_SET); for (i 0; i 24; i) { HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET); Count Count 1; HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET); if (HAL_GPIO_ReadPin(HX711_DOUT_GPIO_Port, HX711_DOUT_Pin) GPIO_PIN_SET) Count; } HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET); Count ^ 0x800000; HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET); return Count; }读取到原始值之后要换算成重量。换算公式是重量克 当前读数 - 空载读数 / 标定重量对应读数差 × 标定重量例如空载时读数稳定在820000放一个500克砝码后读数稳定在976000那么比例系数为976000 - 820000/ 500 312即每克对应312个原始值。你在实际标定时取5个不同重量点做线性拟合效果会更好。HX711的原始数据其实是有噪声的尤其在你放了储粮桶、粮食颗粒在移动之后最后一位甚至两位都会抖动。我在软件里做了简单的中位值平均滤波连续读取5次去掉最大值和最小值中间3个取平均。这样处理之后的数据稳定度在正负1克以内对余粮监测来说足够用了。3.4 ESP8266的MQTT对接和STM32端的AT指令控制ESP8266-01S模块默认固件是AT固件通过串口接收指令。我们在STM32端写一个串口收发缓冲区的环形队列把从ESP8266收到的所有数据暂存起来然后有一个状态机去解析缓冲区里是否出现了我们关心的关键词。流程分四步第一步配置ESP8266连接Wi-Fi。你需要向它发送“ATCWMODE1”然后“ATCWJAP你的WiFi名称,WIFi密码”。这里有一个坑如果Wi-Fi名称或者密码里有特殊字符AT指令的转义处理会非常麻烦。建议你直接用一个纯字母数字的测试热点比如“TestAP”和“12345678”等代码跑通了再换真实网络。第二步连接MQTT Broker。阿里云物联网平台的接入地址格式是“productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com”。你需要向ESP8266发送“ATCIPSTARTTCP设备证书,1883”然后在TCP连接建立之后按照MQTT协议格式发送CONNECT报文。第三步订阅主题。阿里云物联网平台的三段式主题格式是“/productKey/deviceName/user/get”你需要把“user/get”作为订阅主题。AT模式下要向ESP8266发送“ATCIPSEND”命令然后跟着MQTT SUBSCRIBE报文。第四步发布消息。当设备需要上报数据时按照MQTT PUBLISH报文格式组织数据通过ATCIPSEND发送。用AT指令直接拼MQTT报文确实比较繁琐因为你要自己计算报文长度字段和校验字段稍不注意就出错。更省力的方案是在STM32端移植一个轻量级MQTT库比如paho-embedded-c这样可以直接在STM32侧处理MQTT报文格式。我最终采用的是自己写报文封装函数因为毕设时间紧张而且移植paho库需要额外适配网络接口层。实际上对你来说最简单的方案可能是直接使用AT指令版MQTT透传也就是先用ATCIPSTART建立TCP连接然后直接把MQTT协议数据通过串口发给ESP8266ESP8266只负责透传字节流MQTT报文由STM32自己生成。这样做虽然稍微麻烦一点但调试起来非常直观也方便你理解MQTT协议的底层细节。3.5 微信小程序端实现手机端我选择了微信小程序因为它不需要用户额外安装App扫码就能用对答辩演示也比较方便。小程序的MQTT实现可以用mqtt.js这个库微信开发者工具里能直接安装。小程序的功能我分了三个页面首页显示设备在线状态、储粮桶余粮百分比、上次喂食时间有一个“立即喂食”按钮。设置页配置每日喂食计划和每次出粮克数。记录页展示最近的喂食历史包含时间、出粮克数、触发方式手动还是定时。小程序和云端通信走的是阿里云物联网平台提供的“设备属性上报服务调用”接口。设备上报属性时平台会保存最新的属性值小程序通过云平台的HTTP API读取属性或者通过AMQP服务端订阅接收消息推送。设置页里配置喂食计划时小程序先通过HTTP API把配置下发到云端云端再把配置通过MQTT下发给设备。整体链路是“小程序→阿里云→ESP8266→STM32”这样一条完整闭环。编译小程序端需要注意几个点微信开发者工具需要开启“不校验合法域名”选项因为连的MQTT地址不在微信的合法域名白名单里mqtt.js库的版本要用0.4.X版本新版本有些API在微信环境下不支持小程序切到后台超过一定时间会销毁WebSocket连接所以页面onShow时需要重新建立MQTT连接。4. 常见问题与调试技巧实录4.1 ESP8266连接不稳定、掉线频繁这个问题我大概花了两天时间排查。一开始以为是固件问题刷了好多版本的AT固件都没解决。后来发现是供电不足——ESP8266在发射瞬间电流峰值可以达到300毫安以上而3.3V稳压芯片AMS1117的输出能力虽然标称1A但如果从核心板的USB口取电电流很容易被其他外设分掉。解决办法有两个一是单独给ESP8266供电用一个单独的3.3V稳压芯片输入直接从5V充电器取电二是在ESP8266的VCC和GND之间加一个470uF的电解电容做储能缓冲。我两个方法都用了掉线问题基本消失。你要记住Wi-Fi模块对电源纹波和瞬态响应非常敏感这几乎是所有物联网项目中第一个要排查的硬件问题。4.2 HX711数据漂移严重前面提到过电机启动瞬间电源干扰会导致称重数据漂移。这里还有个容易被忽略的点HX711的分辨率非常高24位ADC跟踪的是微伏级别信号所以不仅仅是电机任何附近的大电流切换都可能造成干扰。解决办法除了电源去耦还可以把信号线用双绞线或者是屏蔽线连接尽量缩短压力传感器和HX711模块之间的距离。另一个常见问题是长时间运行后的温度漂移。压力传感器是应变片式的温度变化会引起电阻变化导致零点漂移。网站上的很多教程忽略了这个现象但实际测试中从早上8点开机到下午4点我空载读数从820000漂到了817000相当于零点漂了约10克。对余粮监测来说10克误差勉强能接受但如果你的猫粮颗粒比较大一颗就3克那么零点漂移可能造成误判。所以我在固件里加了自动归零每次电机完成出粮且系统空闲5秒后软件采集一次当前读数作为新的零点基准这样就能抑制大部分温度漂移。4.3 MQTT收发不同步、指令丢失这个问题出现在使用AT指令模式时。因为AT指令是串口透传的当ESP8266收到云端数据后如果正好赶上STM32向它发送ATCIPSEND指令修改TCP连接模式两个数据流就可能交叉。我最初的写法是直接发送指令后延时等待响应但这样效率很低而且容易丢数据。后来我改成“指令-响应-超时检测”的同步机制向ESP8266发送指令后立即进入阻塞等待设置500毫秒超时如果超时未收到预期响应就自动重发如果收到的是云端消息而不是AT响应就先缓存云端消息继续等待AT响应。这个机制用FreeRTOS的消息队列实现很容易每个任务收发各自的消息互不干扰。4.4 步进电机堵转和卡粮怎么处理电机堵转是喂食器必然遇到的问题诸如粮食颗粒卡在螺旋推进器里、储粮桶出粮口有异物等都可能堵。如果你不做任何保护电机堵转时电流会急剧上升ULN2003芯片会过热时间长了甚至会烧掉驱动板。保护逻辑其实很简单步进电机是开环控制你发出去的脉冲数是知道的如果电机实际转动步数少于设定步数你没法直接察觉。但你可以在电机驱动输出引脚上加电流采样电阻通过ADC检测电流是否超过阈值或者更简单一点在SPI通信引脚上连接一个霍尔传感器检测电机轴是否旋转。但我实测下来最实用的方案还是“时间保护”正常转完设定步数所需时间是确定的如果程序执行时间超过预期就认为发生了堵转立即停止发送脉冲同时上报云端“出粮异常”事件。4.5 一个小技巧设备端日志输出要分级调试STM32固件的时候串口日志是最重要的手段。如果整个程序只有一个printf好难用我建议你做一个简易日志模块分三级输出调试级、信息级、错误级。用宏开关控制在开发阶段打开调试级输出所有关键变量的值都打出来在联调阶段只打印信息级和错误级避免刷屏在最终版本可以关掉大部分日志节省串口资源和Flash空间。具体做法就是定义三个宏LOG_DEBUG、LOG_INFO、LOG_ERROR内部调用printf。通过一个全局变量控制最低输出级别。这样做的好处是你可以在现场调试时动态改变日志级别不用重新编译下载。5. 系统测试与数据记录系统开发完成后我做了两轮测试。第一轮是单元测试主要验证每个模块独立功能是否正常第二轮是集成测试把全部模块装进亚克力外壳里跑72小时持续运行测试。单元测试的数据我记录了几个关键项目测试项目预期结果实测结果是否通过定时出粮每次10克10克±1克平均9.8克最大偏差1.2克通过余粮监测空桶归零归零误差±2克误差1克内通过断网重连30秒内恢复平均18秒恢复通过小程序远程触发2秒内设备响应1.5秒左右通过连续运行温度电机外壳≤60℃最高51℃通过集成测试中我发现了一个比较意外的问题储粮桶装满余粮和只剩最后的粮时出粮量会有些差异。原因是螺旋推进器在粮少的时候进料不充分会有空转段。解决方案是在固件里对出粮步数做一个动态补偿称重余粮值低时自动增加总步数的5%。这是一个比较粗糙的补偿方式但对实际效果改善很明显。报警功能的测试也做了一个场景模拟我在储粮桶里还剩约60克时设置单次喂食20克系统连续出了三次粮之后余粮只有约0克低于设定的15克报警阈值云端成功推送“缺粮提醒”到小程序测试通过。这个测试既验证了报警逻辑也验证了多次连续出粮后的余粮计算准确性。我还特意记录了一次设备的干净的断电重启过程重启后系统自动连接Wi-Fi连接失败就持续重试直到成功连接到云端后在云端更新“设备在线”状态。整个重连过程大约20秒符合设计预期。6. 论文撰写几点建议毕业设计和单纯的DIY项目不一样你还需要交付一篇合格的毕业论文。结合我自己和指导老师交流的经验给出几个针对性的建议。论文目录建议这样组织第一章绪论写背景、国内外研究现状、选题意义、主要工作第二章系统总体设计画出系统总体架构图、功能模块图说明需求分析过程第三章硬件设计分模块写主控电路、驱动电路、传感器接口电路、电源电路设计第四章软件设计分别写STM32固件设计、FreeRTOS任务规划、MQTT通信设计、小程序设计第五章系统测试展示测试环境、测试用例表、测试结果截图和分析第六章总结与展望。如果你最终定稿时字数不够就在硬件设计和软件设计的细节处多补充技术原理和设计理由这比堆砌项目背景更有效。关于画图我建议所有框图和流程图都用Visio或者drawio画不要用Word自带画图工具因为画出来的线条不平滑、格式不统一会被答辩老师扣印象分。系统总体架构图要体现“设备端、云平台、客户端”三层结构把MQTT协议、HTTP协议标注在链路中间这张图基本就是论文第六章系统设计的核心。还有一个容易被忽略的点论文里的电路原理图不能只是抄模块手册的典型电路最好能根据你的实际选型说明每个元件的参数计算过程。比如ESP8266的使能引脚为什么需要上拉10K电阻HX711为什么需要加电源滤波电容这些细节稍作展开就是几百字的干货内容也能展示你对电路的理解。7. 写在最后的一点点经验做这个项目的过程中我踩过的坑比你看到的这篇文字可能要多一倍。有一次半夜调试步进电机电机一直嘎嘎响但就是不转检查了半天发现是ULN2003的IN1到IN4顺序接反了还有一次ESP8266怎么都连不上云端最后发现是AP密码大小写输错了。这些错误都很低级但正是它们让我把整个系统的每一个环节都理解得非常透彻。我个人在实际操作中最大的体会是毕设项目的价值不在于你做得多么花哨而在于你能否将每一个模块的原理讲清楚、每一个参数为什么这样选能说出来。你只要把喂食器做到“能喂、能看、能提醒、能扩展”这个程度就已经超出大多数同学的作品了。如果时间允许后续可以往这几个方向扩展加一个摄像头模块做宠物状态识别加一个温湿度传感器检测猫粮储存环境或者把低功耗模式做出来让设备可以用电池供电更久。这些扩展方向随便挑一个写进论文的展望部分都是加分项。最后再分享一个小技巧设计文章里的实物图、系统运行截图、微信小程序截图最好都整理成一个目录统一命名写论文时需要哪张直接复制比临时翻手机相册省心得多。所有测试数据最好用电子表格记住原始记录并保留截图答辩时如果被问到“数据来源”你能现场打开原始数据记录这比任何口述都更有说服力。