STM32项目实战_基于STM32F103的智能药箱设计与实现(硬件详解+软件逻辑+调试要点)

张开发
2026/4/4 7:30:55 15 分钟阅读
STM32项目实战_基于STM32F103的智能药箱设计与实现(硬件详解+软件逻辑+调试要点)
1. 项目背景与功能设计最近在帮家里老人设计一个智能药箱发现市面上的产品要么功能太简单要么价格高得离谱。于是决定用STM32F103自己动手做一个既能满足基本需求又能学习嵌入式开发。这个项目最核心的功能其实就三点精准提醒、药品管理和远程监控。先说药品管理部分。我在药箱里设计了两个独立仓位分别用光电开关检测药品取放。每次开盖取药系统会自动扣减库存。实测发现用E18-D80NK红外光电传感器效果最好比机械开关寿命长而且不受环境光影响。药品数量初始值设为50片这个参数可以在代码里随时修改。定时提醒功能依赖DS1302时钟模块这个芯片虽然老但特别稳定。我遇到过RTC走时不准的问题后来发现是备用电池接触不良。关键点在于时钟初始化一定要校验时间戳否则断电后可能恢复默认值。提醒方式用了语音播报OLED显示双保险JR6001语音模块支持自定义录音老人听着更亲切。无线通信选了JDY-32蓝牙模块成本不到10块钱。通过串口发送JSON格式的数据包手机端用MIT App Inventor做了个简易APP。这里有个坑蓝牙发送数据前要检查连接状态否则会阻塞主线程。后来我加了超时机制3秒发不出去就自动丢弃当前数据包。2. 硬件设计详解2.1 核心控制器选型STM32F103C8T6这个蓝色小开发板堪称性价比之王72MHz主频完全够用。最小系统需要特别注意三点复位电路10k上拉电阻0.1uF电容的组合最稳定晶振匹配8MHz晶振要配22pF负载电容供电滤波我在每个电源引脚都加了104瓷片电容实际调试中发现如果直接用USB供电电机工作时会导致单片机重启。后来改用AMS1117-3.3稳压芯片单独给数字部分供电问题迎刃而解。2.2 传感器电路设计药品检测部分试过三种方案方案一轻触开关成本低但易损坏方案二红外对管受环境光干扰方案三E18-D80NK漫反射光电开关最终选择E18-D80NK的接线特别简单棕色线接3.3V蓝色线接地黑色线接PA6。注意要加个1k上拉电阻否则输出信号不稳定。检测距离建议设置在3-5cm太近容易误触发。2.3 人机交互模块显示部分从LCD1602换成了0.96寸OLED原因有三显示内容更丰富支持汉字显示功耗更低仅3mA工作电流I2C接口节省IO口语音模块的TX接PA9RX接PA10。这里有个细节JR6001的工作电压是5V需要加电平转换电路。我用的是TXS0108E芯片比三极管方案更可靠。3. 软件架构与关键代码3.1 主程序框架采用状态机设计模式把系统划分为五个状态typedef enum { STATE_IDLE, // 待机状态 STATE_REMIND, // 提醒状态 STATE_CONFIRM, // 确认状态 STATE_UPDATE, // 更新状态 STATE_COMMUNICATE // 通信状态 } SystemState;主循环里用switch-case处理状态转换实测这种结构比裸写while循环更易维护。比如提醒状态的处理逻辑case STATE_REMIND: if(CheckMedicineTime()) { PlayVoiceReminder(); OLED_ShowReminder(); currentState STATE_CONFIRM; } break;3.2 蓝牙通信协议定义了一套简单的应用层协议| 起始符(0xAA) | 命令字 | 数据长度 | 数据内容 | 校验和 |校验和用异或算法实现代码非常简洁uint8_t CheckSum(uint8_t *data, uint8_t len) { uint8_t sum 0; for(int i0; ilen; i) { sum ^ data[i]; } return sum; }3.3 低功耗优化通过以下措施将待机功耗降到5mA以下关闭未用外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);采用事件唤醒机制OLED屏幕设置1分钟自动息屏4. 调试经验与问题解决4.1 时钟不准问题排查最初DS1302每天快10秒排查过程如下更换32.768kHz晶振无效调整负载电容从12pF改为6pF改善明显最终方案在初始化时同步网络时间4.2 蓝牙断连问题JDY-32模块有两个固件版本V2.3版本存在心跳包bug。解决方法ATVER查询版本号升级到V2.5以上版本添加软件看门狗4.3 抗干扰设计现场测试时发现电机干扰导致系统死机采取三重防护电源隔离数字和模拟地通过0Ω电阻单点连接信号滤波所有IO口加100Ω电阻100pF电容软件滤波关键信号做中值滤波5. 项目优化方向第一个版本完成后我又做了这些改进增加药品有效期提醒功能需要修改数据结构改用WS2812彩灯指示不同状态开发微信小程序替代蓝牙APP最实用的改进是加了震动传感器能检测药箱是否被移动过。这个功能用SW-1801P震动开关实现成本不到1块钱代码就几行if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) 0) { SendAlarm(Box moved!); }整个项目最耗时的其实是结构设计3D打印了五个版本才找到最佳开合方案。建议先用纸板做原型验证再考虑用亚克力或ABS材料制作正式外壳。

更多文章