1. 项目背景与核心功能作为一名嵌入式开发工程师最近完成了一个基于STM32的智能宠物投喂器项目。这个设备解决了宠物主人在外出时无法定时喂养的痛点通过物联网技术实现了远程控制和监控功能。核心功能模块包括STM32F103C8T6作为主控制器ESP8266 WiFi模块实现云端连接HX711称重传感器监测饲料余量DHT11温湿度传感器监控环境状态5V直流电机驱动的螺旋送料机构1.44寸TFT液晶显示屏提示选择STM32F103C8T6是因为其性价比高72MHz主频足够处理传感器数据和控制逻辑且具有丰富的外设接口。2. 硬件系统设计与选型2.1 主控芯片选型对比在项目初期我对比了几款常见的MCU型号主频FlashRAM价格适用性STM32F103C8T672MHz64KB20KB¥12★★★★★STM32F407VET6168MHz512KB192KB¥35★★★☆☆ESP32-WROOM240MHz4MB520KB¥25★★★★☆最终选择STM32F103C8T6的原因成本优势明显外设资源足够满足需求开发社区支持完善与ESP8266的串口通信稳定2.2 传感器模块实现称重模块方案使用HX711称重传感器的组合测量范围0-5kg精度±1g。实际测试中发现几个关键点必须做稳定的机械结构设计需要软件滤波算法消除震动干扰定期校准是保证精度的关键我的滤波算法实现#define FILTER_NUM 10 uint32_t HX711_ReadAvg(void) { uint32_t sum 0; for(uint8_t i0; iFILTER_NUM; i) { sum HX711_Read(); delay_ms(5); } return sum/FILTER_NUM; }环境监测模块DHT11虽然精度一般温度±2℃湿度±5%RH但胜在价格低廉、接口简单。接线时特别注意上拉电阻的取值4.7KΩ最佳。3. 软件架构与关键实现3.1 系统任务划分采用前后台系统架构没有上RTOS通过状态机实现多任务调度主控制循环100ms周期传感器数据采集喂食逻辑判断显示刷新定时中断1ms系统时钟维护按键扫描去抖串口中断ESP8266数据收发调试信息输出3.2 物联网通信实现ESP8266通过AT指令与STM32交互关键配置步骤初始化串口3115200bps发送AT测试指令确认模块就绪配置WiFi连接模式STA设置MQTT客户端参数订阅云端控制主题实际开发中遇到的坑ESP8266上电需要足够长的复位时间≥500msAT指令响应需要适当延时网络异常时要实现自动重连我的解决方案是封装了带超时重试的发送函数uint8_t ESP8266_SendCmd(char* cmd, char* expect, uint16_t timeout) { uint8_t retry 3; while(retry--) { USART3_SendString(cmd); if(WaitResponse(expect, timeout)) { return 1; } } return 0; }4. 机械结构与供电设计4.1 送料机构实现经过多次迭代最终采用的方案3D打印的螺旋送料器N20减速电机30RPM光电开关检测转动圈数电机控制电路要点使用MOSFET驱动IRLZ44N添加续流二极管保护PWM频率选择1kHz4.2 电源系统设计整机供电方案输入12V/2A DC适配器主电源LM2596降压至5VMCU供电AMS1117-3.3特别要注意的是电机启停时的电压波动问题我的解决方法电源输入端增加2200μF电解电容电机电源与MCU电源分开走线在3.3V输出端添加100μF钽电容5. 云端交互与移动端5.1 数据协议设计自定义了简单的JSON格式协议{ device: PET_FEEDER_001, timestamp: 1634567890, data: { weight: 1250, temp: 25.3, humi: 60.2 } }5.2 定时任务管理在STM32端实现了6组定时任务存储使用EEPROMAT24C02保存设置。数据结构设计typedef struct { uint8_t hour; uint8_t minute; uint16_t amount; // 单位克 uint8_t enable; } FeedSchedule; FeedSchedule schedules[6];云端同步逻辑APP修改定时后下发全量数据设备接收后更新EEPROM每次上电从EEPROM加载6. 实测效果与优化经过两周的实际测试发现几个需要改进的地方称重稳定性问题现象宠物触碰食盆时读数波动大解决方案增加机械缓冲结构软件滑动滤波网络断连恢复现象WiFi断开后不会自动重连解决方案增加看门狗定时检测电机堵转保护现象饲料卡住时电机可能损坏解决方案检测电流异常并自动停止优化后的主程序逻辑流程图void main(void) { Hardware_Init(); Load_Config_From_EEPROM(); while(1) { if(SystemTick_100ms) { Read_Sensors(); Process_Feed_Logic(); Update_Display(); Check_Network(); SystemTick_100ms 0; } if(UART3_RxFlag) { Parse_Cloud_Command(); UART3_RxFlag 0; } } }7. 生产注意事项如果考虑小批量生产需要特别注意PCB设计要点电机驱动部分走线加粗≥1mm模拟信号远离数字信号保留足够的测试点结构设计改进食盆采用不锈钢材质增加防潮密封设计优化料仓拆卸方式固件升级方案预留SWD调试接口实现OTA升级功能添加版本回滚机制这个项目从原型到稳定运行历时3个月期间经历了多次设计迭代。最大的收获是嵌入式开发必须重视实际环境测试实验室表现好不等于真实场景可靠。现在我的猫咪已经用这个投喂器半年多了再也不用担心出差时饿着它了。