基于STM32的智能药箱系统开发实战:从硬件搭建到云端监控

张开发
2026/4/16 4:47:37 15 分钟阅读

分享文章

基于STM32的智能药箱系统开发实战:从硬件搭建到云端监控
1. 为什么需要智能药箱记得去年我奶奶因为忘记按时吃药血压突然升高被送进医院。医生说她这种情况很常见很多老年人都会因为记忆力减退或者视力不好而漏服、错服药物。这件事让我意识到传统的药箱已经不能满足现代健康管理的需求了。智能药箱的核心价值在于它能主动提醒、精准管理。想象一下当你工作忙得晕头转向时药箱会准时发出提醒当你打开药箱取药时它能自动记录服药情况当药品快用完时它会提前通知你补充。这些功能对于需要长期服药的慢性病患者和老年人来说简直就是救命稻草。市面上的智能药箱产品价格普遍偏高动辄上千元。而用STM32开发板自己做一个成本可能不到200元。更重要的是你可以根据自己的需求定制功能比如增加心率监测、体温检测等模块。这也是为什么越来越多开发者选择自己动手开发智能药箱。2. 硬件选型与电路设计2.1 核心控制器选型STM32F103C8T6是我最推荐的选择江湖人称蓝莓派。这款芯片有72MHz主频、64KB Flash、20KB RAM性能完全够用。更重要的是它的价格只要十几块钱性价比超高。我在某宝上买过几十片从来没遇到过质量问题。如果你想要更省电的版本可以考虑STM32L系列。比如STM32L051C8T6工作电流只有100μA/MHz特别适合需要长时间待机的场景。不过要注意L系列的外设资源会少一些开发时可能需要更精细的资源管理。2.2 传感器模块选择药量检测我推荐HX711称重传感器的方案。HX711是24位高精度ADC价格不到5块钱。实测下来精度可以达到0.1g完全能满足药量检测的需求。记得第一次用HX711时我犯了个低级错误——没接滤波电容导致数据跳得跟心电图似的。后来在VCC和GND之间加了个0.1μF的电容数据立马就稳了。温湿度监测方面DHT11虽然便宜但精度确实一般。如果预算允许建议用SHT30精度能到±2%RH和±0.2°C。我在一个医疗项目中用过SHT30效果非常好就是价格要贵三四倍。2.3 通信模块配置ESP8266 WiFi模块绝对是性价比之王支持802.11 b/g/n内置TCP/IP协议栈。我用AT指令测试过连接阿里云IoT平台完全没问题。有个小技巧给ESP8266供电时最好单独用一个LDO不要直接从STM32的3.3V取电否则容易因为电流不足导致模块重启。如果你需要更稳定的连接可以考虑ESP32它集成了蓝牙和WiFi双模性能更强。不过对于药箱这种应用ESP8266已经绰绰有余了。3. 系统软件设计3.1 开发环境搭建我习惯用Keil MDKSTM32CubeMX的组合。CubeMX可以快速配置时钟树和引脚分配生成初始化代码能省去很多重复劳动。记得第一次用CubeMX时我被它的图形化界面惊艳到了——原来STM32开发可以这么简单对于新手我强烈建议安装ST-Link驱动后先用CubeMX生成个LED闪烁的工程试试水。这个Hello World级别的实验能帮你快速验证开发环境是否配置正确。3.2 主程序设计主程序采用经典的时间片轮询架构这样既能保证实时性又不会让代码变得太复杂。下面是核心逻辑while(1){ // 每100ms执行一次 if(timer_100ms_flag){ timer_100ms_flag 0; sensor_read(); // 读取传感器数据 key_scan(); // 扫描按键 } // 每1s执行一次 if(timer_1s_flag){ timer_1s_flag 0; check_medicine(); // 检查药量 check_time(); // 检查服药时间 wifi_upload(); // 上传数据到云端 } // 其他任务... }这种设计最大的好处是各个功能模块互不干扰调试起来特别方便。我曾经尝试过用RTOS发现对于药箱这种功能相对简单的应用反而增加了不必要的复杂性。3.3 关键算法实现药量检测算法要注意去皮和滤波。我用的方法是连续采样10次去掉最大最小值后取平均。为了提高精度还做了温度补偿——因为称重传感器的输出会受温度影响。float get_medicine_weight(void){ static float temp_compensation 0.0; float raw_data[10]; float sum 0; // 采样10次 for(int i0; i10; i){ raw_data[i] hx711_read(); delay_ms(10); } // 排序 bubble_sort(raw_data, 10); // 去掉最大最小值后取平均 for(int i1; i9; i){ sum raw_data[i]; } // 温度补偿 float temp sht30_read_temp(); temp_compensation 0.01 * (temp - 25.0); // 25°C为基准温度 return (sum/8 - tare_weight) * scale_factor - temp_compensation; }定时提醒功能要用到RTC实时时钟。STM32内置的RTC精度一般我建议外接DS1302或DS3231。DS3231精度能达到±2ppm年误差约1分钟而且自带温度补偿价格也就10块钱左右。4. 云端监控系统实现4.1 物联网平台选择阿里云IoT平台对个人开发者非常友好免费额度完全够用。我比较过三大平台的API文档阿里云的最清晰易懂。创建产品后记得要保存好三元组ProductKey、DeviceName、DeviceSecret这是设备连接云端的身份证。MQTT协议是物联网的首选它轻量、高效特别适合像药箱这种低功耗设备。ESP8266内置了MQTT客户端用起来非常方便。下面是我封装的一个发送函数void mqtt_publish(const char *topic, const char *payload){ char cmd[256]; snprintf(cmd, sizeof(cmd), ATMQTTPUB0,\%s\,\%s\,0,0\r\n, topic, payload); esp8266_send_cmd(cmd, OK, 2000); }4.2 数据可视化设计阿里云IoT平台自带的数据可视化工具很好用拖拽就能生成图表。我通常会上传这些数据实时药量单位克或粒箱内温湿度最近一次服药时间电池电量如果是便携式对于高级用户可以用Node-RED搭建更复杂的逻辑比如当检测到连续3次未按时服药时自动给家属发短信提醒。我在一个商业项目中实现过这个功能客户反馈特别好。4.3 手机APP对接如果不想从头开发APP可以用阿里云提供的飞燕解决方案它已经封装了设备配网、控制、状态显示等基础功能。我测试过从零开始到APP上线最快只要2天时间。对于更定制化的需求可以用Flutter跨平台开发。下面是一个简单的药品数据模型class Medicine { String name; int totalCount; int remaining; DateTime nextAlarm; Medicine({ required this.name, required this.totalCount, required this.remaining, required this.nextAlarm, }); }5. 系统优化与调试技巧5.1 低功耗设计如果药箱是用电池供电低功耗就特别重要。我的经验是把STM32主频降到8MHz对药箱足够用不用外设时关闭时钟使用STOP模式只有RTC和外部中断能唤醒给ESP8266设置深度睡眠每小时只唤醒一次上传数据实测下来2000mAh的锂电池可以坚持3个月以上。有个坑要注意STM32的GPIO在STOP模式下会保持状态但部分外设如UART的IO口可能会漏电记得把这些引脚设为模拟输入模式。5.2 抗干扰措施药箱放在家里可能会遇到各种干扰特别是WiFi信号不稳定的时候。我总结了几条实战经验在电源入口处加TVS二极管防止浪涌所有信号线串联22Ω电阻能有效抑制振铃模拟信号走线要远离数字信号给ESP8266天线周围留出足够的净空区有一次客户反映药箱在微波炉工作时会误报警后来发现是电源滤波不够。在LDO输入端加了个100μF的钽电容后问题就解决了。5.3 量产注意事项如果打算小批量生产比如100台以内建议用贴片元件手工焊接也容易选择JLC PCB的SMT贴片服务省时省力烧录程序用SWD接口速度快功能测试要包括称重校准RTC时间设置WiFi连接测试云端数据同步我帮朋友做过50台的订单最大的教训是没有提前做老化测试。有3台在连续工作一周后出现了死机问题后来发现是电源芯片过热导致的。加上散热片后再没出过问题。

更多文章