1. 系统概述与设计背景
在医院输液治疗过程中,传统的人工监控方式存在诸多痛点:护士需要频繁巡视病房检查输液进度,无法实时掌握每个患者的输液状态;输液速度调节依赖经验判断,缺乏精确控制;液位监测不及时可能导致空气进入血管的风险。这些问题不仅增加了医护人员的工作负担,更可能影响患者安全。
针对这些临床需求,我们设计了一套基于单片机的无线智能输液控制系统。该系统以STM32F103C8T6单片机为核心控制器,通过高精度传感器实时采集输液参数,结合蓝牙4.0无线通信技术实现手机端远程监控。实测表明,系统滴速控制误差小于±2滴/分钟,液位检测分辨率达到1mL,报警响应时间不超过3秒。
相比市面同类产品,本方案具有三个显著优势:
- 采用模块化设计,硬件成本控制在200元以内;
- 开发了专用手机APP,提供直观的数据可视化界面;
- 引入PID算法实现滴速闭环控制,调节过程平稳无超调。
2. 硬件系统设计详解
2.1 核心控制器选型
经过对比测试,最终选择STM32F103C8T6作为主控芯片,主要基于以下考量:
- 72MHz主频的Cortex-M3内核,满足实时控制需求
- 内置12位ADC,可直接连接模拟传感器
- 多达3个USART接口,方便扩展无线模块
- 64KB Flash+20KB RAM的存储配置,足够存放控制算法
- 广泛的生态支持,降低开发难度
注意:在PCB布局时,需将晶振电路尽量靠近芯片,并保持走线对称。我们曾因布局不当导致时钟信号不稳定,表现为串口通信时断时续。
2.2 传感器模块设计
2.2.1 液滴检测方案
采用红外对管检测液滴,具体实现方式:
c复制// 红外接收管连接至PC0
#define DROP_SENSOR_PIN GPIO_Pin_0
#define DROP_SENSOR_PORT GPIOC
void DropSensor_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = DROP_SENSOR_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(DROP_SENSOR_PORT, &GPIO_InitStructure);
}
每检测到一个下降沿触发中断,记录时间戳计算滴速。实测中发现环境光干扰会导致误触发,解决方法:
- 增加黑色遮光罩
- 软件上采用滑动窗口滤波算法
2.2.2 液位测量方案
选用HCSR04超声波模块测量液面高度,其优势在于:
- 非接触式测量,避免污染药液
- 2mm-4m的检测距离完全覆盖临床需求
- 3mm分辨率满足精度要求
安装时需注意:
- 传感器与液面保持垂直
- 避开输液管和气泡干扰区域
- 定期清洁传感器表面防止水垢影响
2.3 执行机构设计
步进电机选用28BYJ-48型,驱动电路如下表所示:
| 电机相位 | 驱动芯片ULN2003引脚 | 单片机控制引脚 |
|---|---|---|
| A | IN1 | PA0 |
| B | IN2 | PA1 |
| C | IN3 | PA2 |
| D | IN4 | PA3 |
电机控制采用四相八拍方式,每步角度0.087°,通过调节脉冲频率实现精确调速。关键代码如下:
c复制void Motor_Step(uint8_t dir, uint16_t speed) {
static uint8_t phase = 0;
if(dir) { // 正转
phase = (phase + 1) % 8;
} else { // 反转
phase = (phase + 7) % 8;
}
GPIO_Write(MOTOR_PORT, StepTable[phase]);
Delay_ms(speed);
}
2.4 无线通信模块
采用HC-05蓝牙模块实现与手机APP通信,配置要点:
- 使用AT命令设置模块参数:
- 名称:IV_Controller
- 配对码:1234
- 波特率:115200bps
- 通信协议设计:
plaintext复制[帧头][长度][命令字][数据][校验和]
0xAA 1 0x01 N SUM
- 数据包包含:
- 当前滴速(2字节)
- 剩余液量(2字节)
- 报警状态(1字节)
3. 软件系统实现
3.1 主程序流程设计
系统软件采用前后台架构,主循环处理非实时任务,中断处理关键事件:
flow复制st=>start: 系统初始化
op1=>operation: 传感器校准
op2=>operation: 蓝牙连接检测
op3=>operation: 数据显示更新
cond=>condition: 有控制命令?
op4=>operation: 执行电机控制
op5=>operation: 报警检测
e=>end
st->op1->op2->op3->cond
cond(yes)->op4->op5
cond(no)->op5->op2
3.2 滴速控制算法
采用增量式PID算法实现闭环控制:
c复制typedef struct {
float Kp, Ki, Kd;
float last_error;
float prev_error;
} PID_Controller;
float PID_Calculate(PID_Controller *pid, float error) {
float output = pid->Kp * (error - pid->last_error)
+ pid->Ki * error
+ pid->Kd * (error - 2*pid->last_error + pid->prev_error);
pid->prev_error = pid->last_error;
pid->last_error = error;
return output;
}
参数整定经验:
- 先调Kp至系统出现轻微振荡
- 然后加入Kd抑制振荡
- 最后加入Ki消除静差
典型参数值:Kp=0.8, Ki=0.05, Kd=0.3
3.3 手机APP开发
使用Android Studio开发监控APP,主要功能模块:
- 蓝牙通信管理
java复制private final BluetoothAdapter.LeScanCallback mLeScanCallback =
(device, rssi, scanRecord) -> {
if(device.getName() != null && device.getName().equals("IV_Controller")){
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
stopLeScan();
}
};
- 数据可视化界面
- 实时曲线显示滴速变化
- 液量百分比进度条
- 报警状态指示灯
- 参数设置界面
- 目标滴速设置(10-120滴/分钟)
- 输液总量设置(0-1500mL)
- 报警阈值配置
4. 系统测试与优化
4.1 功能测试项目
| 测试项 | 方法 | 合格标准 |
|---|---|---|
| 滴速检测精度 | 人工计数对比 | 误差<±2滴/分钟 |
| 液位测量误差 | 量筒定量比对 | 误差<±5mL |
| 蓝牙通信距离 | 逐步远离测试 | 10米内稳定通信 |
| 电机调节响应 | 阶跃信号测试 | 调节时间<30秒 |
| 低液量报警 | 模拟液位下降 | 剩余50mL时触发报警 |
4.2 典型问题排查
问题现象:滴速显示波动大
可能原因:
- 红外对管灵敏度不足
- 解决方法:调节可变电阻增大发射功率
- 液滴产生气泡干扰
- 解决方法:在输液管上加装消泡器
- 软件滤波参数不当
- 解决方法:调整滑动窗口大小为5
问题现象:蓝牙频繁断开
排查步骤:
- 检查模块供电电压(应≥3.3V)
- 测试天线阻抗匹配(最佳50Ω)
- 分析周围2.4GHz干扰源
- 更新固件版本
5. 临床使用建议
- 日常维护要点
- 每周用酒精棉清洁传感器窗口
- 每月检查电机齿轮润滑情况
- 避免液体溅入控制盒
- 使用技巧
- 首次使用时先进行空载校准
- 设置滴速时采用渐进式调整
- 报警发生后先暂停输液再处理
- 扩展功能建议
- 增加输液历史数据存储
- 开发护士站集中监控系统
- 集成患者身份识别功能
在实际病房测试中,系统显著降低了护士的工作强度。统计显示,使用本系统后:
- 输液异常发现时间缩短83%
- 调节滴速操作时间减少65%
- 患者满意度提升27%