1. 项目概述
在医疗护理场景中,输液监控和病房呼叫是两项基础但至关重要的功能。传统的有线解决方案存在布线复杂、灵活性差等问题。这个基于STM32和FreeRTOS的无线智能系统,通过NRF24L01无线模块实现了病房端与护士站之间的实时数据传输,同时利用对射式红外传感器精确监测输液速度。
病房端采用STM32F103C8T6作为主控,负责采集输液滴速和呼叫按键信号;护士站使用性能更强的STM32F103ZET6,配合FreeRTOS实现多任务处理,包括数据显示、报警管理和病人信息存储。系统亮点在于:
- 非阻塞式程序设计提升响应速度
- 滴速异常的多级报警机制
- 模块化设计便于功能扩展
- 无线通信避免复杂布线
2. 硬件设计解析
2.1 病房端硬件配置
2.1.1 滴速检测模块
采用对射式红外传感器(GPIO PA6)检测液滴下落。当液滴通过红外光束时,接收端信号会产生跳变。利用STM32的TIM3输入捕获功能,测量两次中断的时间间隔,进而计算滴速。
关键设计细节:
- 传感器安装位置应距离滴壶2-3cm,确保液滴能完全遮挡光束
- 红外发射管需串联限流电阻(通常220Ω)
- 接收端建议添加10kΩ上拉电阻增强信号稳定性
2.1.2 无线通信模块
NRF24L01模块通过SPI接口与MCU连接:
- SCK(PB14), MOSI(PB13), MISO(PB12) - SPI通信引脚
- CE(PA8) - 芯片使能
- CSN(PB15) - SPI片选
硬件连接注意事项:
- 电源引脚需并联100nF去耦电容
- 天线周围避免金属遮挡
- 传输距离测试:在病房环境可达15-20米(视障碍物情况)
2.1.3 呼叫按键设计
简单机械按键连接PA0引脚,采用内部上拉电阻配置。通过定时器中断实现软件消抖,避免使用阻塞式delay函数。
2.2 护士站硬件配置
2.2.1 增强型无线模块
同样使用NRF24L01,但引脚映射不同:
- SCK(PE9), MOSI(PE10), MISO(PE8)
- CE(PE11), CSN(PE12)
为提高通信可靠性,建议:
- 在CE引脚添加10kΩ下拉电阻
- SPI时钟速率设置为8MHz以下
- 定期检查RF通道质量(通过NRF24L01的CD寄存器)
2.2.2 数据存储方案
W25Q64 Flash芯片(8MB容量)通过SPI接口连接:
- SCK(PF12), MOSI(PF13), MISO(PF15)
- CS(PF14)
存储策略:
- 每个病人数据占用一页(256字节)
- 采用wear-leveling算法均衡擦写次数
- 关键数据保存前计算CRC校验值
2.2.3 人机交互接口
- OLED显示屏:I2C接口(SCL-PE1, SDA-PE2)
- 三个功能按键:KEY0(PE3), KEY1(PE4), WK_UP(PA0)
- 蜂鸣器:PB8驱动,添加1kΩ限流电阻
3. 软件架构设计
3.1 病房端软件实现
3.1.1 滴速测量算法
c复制// 输入捕获回调函数示例
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_CC1) == SET)
{
static uint32_t last_capture = 0;
uint32_t current_capture = TIM_GetCapture1(TIM3);
if(last_capture != 0) {
uint32_t interval = (current_capture > last_capture) ?
(current_capture - last_capture) :
(0xFFFF - last_capture + current_capture);
current_drop_interval = interval;
}
last_capture = current_capture;
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
}
}
滴速计算关键点:
- 使用32位变量存储时间间隔,避免65535μs溢出问题
- 添加数字滤波(移动平均法)消除异常值
- 设置5秒无信号自动归零机制
3.1.2 无线数据包设计
c复制#pragma pack(push, 1)
typedef struct {
uint8_t packet_type; // 0x01:滴速数据, 0x02:呼叫信号
uint16_t drop_rate; // 每分钟滴数
uint8_t bed_id; // 病床编号
uint32_t crc32; // 校验码
} WirelessPacket;
#pragma pack(pop)
通信优化技巧:
- 采用短前导码减少空中传输时间
- 设置自动重传次数(ARC)为3次
- 动态调整发射功率(0dBm~-18dBm)
3.2 护士站FreeRTOS任务设计
3.2.1 任务优先级规划
| 任务名称 | 优先级 | 堆栈大小 | 说明 |
|---|---|---|---|
| NRF24L01_Rx | 4 | 256 | 无线接收最高优先级 |
| BEEP_Alert | 3 | 128 | 报警及时响应 |
| OLED_Refresh | 2 | 384 | 界面刷新 |
| KEY_Scan | 1 | 128 | 按键检测 |
3.2.2 关键数据结构
c复制typedef struct {
char name[16];
uint8_t age;
uint8_t gender; // 0:男, 1:女
uint8_t bed_id;
uint16_t drop_rate;
uint8_t alert_status; // 0:正常, 1:过慢, 2:过快
uint32_t last_update;
} PatientRecord;
3.2.3 队列通信机制
创建三个消息队列:
- wireless_queue - 传输无线接收数据
- alert_queue - 报警信息传递
- display_queue - 显示更新指令
使用xQueueCreateSet()实现多队列监听:
c复制QueueSetHandle_t xQueueSet = xQueueCreateSet(3);
xQueueAddToSet(wireless_queue, xQueueSet);
xQueueAddToSet(alert_queue, xQueueSet);
xQueueAddToSet(display_queue, xQueueSet);
// 在任务中等待任意队列消息
QueueSetMemberHandle_t xActivatedQueue = xQueueSelectFromSet(xQueueSet, pdMS_TO_TICKS(100));
4. 核心功能实现细节
4.1 滴速异常检测算法
c复制#define ALARM_THRESHOLD_LOW 20 // 滴/分钟
#define ALARM_THRESHOLD_HIGH 120
void check_drop_rate(uint16_t current_rate)
{
static uint8_t alert_counter = 0;
if(current_rate < ALARM_THRESHOLD_LOW) {
alert_counter++;
if(alert_counter > 3) {
send_alert(ALERT_LOW);
alert_counter = 0;
}
}
else if(current_rate > ALARM_THRESHOLD_HIGH) {
alert_counter++;
if(alert_counter > 2) { // 高速报警响应更快
send_alert(ALERT_HIGH);
alert_counter = 0;
}
}
else {
alert_counter = 0;
}
}
4.2 护士站数据存储方案
W25Q64存储布局:
code复制扇区0: 系统配置 (4KB)
扇区1-10: 病床1-10数据 (各4KB)
扇区11: 日志记录 (4KB)
存储优化技巧:
- 采用XOR校验代替CRC32减少计算量
- 关键数据双备份存储
- 定期执行碎片整理(夜间模式)
4.3 无线通信抗干扰措施
- 信道选择算法:
c复制uint8_t select_best_channel(void)
{
uint8_t channel_quality[16] = {0};
uint8_t best_channel = 0;
for(uint8_t i=0; i<16; i++) {
nrf24_set_channel(76 + i*4);
delay_ms(50);
channel_quality[i] = nrf24_get_carrier_detect();
}
// 选择干扰最小的信道
for(uint8_t i=1; i<16; i++) {
if(channel_quality[i] < channel_quality[best_channel]) {
best_channel = i;
}
}
return 76 + best_channel*4;
}
- 数据包重传机制:
- 指数退避算法
- 动态调整payload大小
- 信道质量监测
5. 系统优化与调试经验
5.1 常见问题排查指南
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 滴速检测不准 | 1. 传感器安装位置不当 2. 环境光干扰 |
1. 调整传感器与滴壶距离 2. 添加遮光罩 3. 软件增加数字滤波 |
| 无线通信断续 | 1. 电源噪声 2. 信道冲突 |
1. 检查电源滤波电容 2. 更换通信信道 3. 降低发射功率 |
| OLED显示异常 | 1. I2C总线冲突 2. 刷新率过高 |
1. 检查上拉电阻 2. 限制刷新率30Hz以内 |
5.2 性能优化技巧
- FreeRTOS配置优化:
c复制#define configUSE_PREEMPTION 1
#define configUSE_TIME_SLICING 0 // 禁用时间片轮转
#define configTICK_RATE_HZ 1000 // 1kHz系统时钟
#define configMINIMAL_STACK_SIZE 128 // 最小任务堆栈
- 电源管理策略:
- 无线模块间歇工作模式(1s唤醒,100ms休眠)
- 滴速检测动态采样(正常时1Hz,异常时10Hz)
- 背光自动调节(根据环境光照)
- 内存优化:
- 使用内存池管理动态内存
- 关键数据结构packed对齐
- 启用编译器优化-O2
5.3 实测性能指标
经过72小时连续测试:
- 滴速检测误差:±2滴/分钟
- 无线通信成功率:99.7%(3米距离)
- 系统平均功耗:28mA(病房端),45mA(护士站)
- 报警响应延迟:<200ms
6. 扩展功能建议
- 蓝牙双模通信:增加BLE接口连接移动设备
- 输液量估算:结合滴速计算剩余输液时间
- 云端对接:通过WiFi模块上传数据至护理系统
- 语音提示:添加TTS模块播报报警信息
- 电池备份:支持UPS不间断供电
实际部署中发现,在病房密集区域需要特别注意无线信道规划。我们最终采用的方案是为每个病房分配固定信道,并在护士站实现多通道接收功能。另外,将蜂鸣器报警改为振动+灯光提示,显著降低了夜间噪音干扰。
