3、硬件选型与传感器接口:主流呼吸机传感器(流量、压力、氧浓度)介绍、树莓派/STM32作为数据采集网关的选型对比

好,咱们进入第三章。这一章我打算聊聊硬件选型,说白了就是「选什么传感器」和「用什么板子来采集数据」。这两个问题,我在好几个呼吸机项目里都踩过坑,今天把经验掰开揉碎了讲给你听。

3.1 呼吸机三大核心传感器:流量、压力、氧浓度

呼吸机要监控什么?说白了就三样:气够不够(流量)、气推得猛不猛(压力)、气纯不纯(氧浓度)。这三类传感器,我一个个说。

3.1.1 流量传感器

流量传感器用来测患者吸气和呼气的流速。单位一般是 L/min 或 L/s。

主流类型:

  • 热膜式(Hot-wire):利用气体流过加热元件时的散热效应。响应快,精度高。我在项目中用过 Honeywell 的 AWM720P1,量程 0~200 L/min,响应时间 1ms 左右。缺点是怕冷凝水,得加防水膜。
  • 差压式(Differential Pressure):通过一个节流孔(比如费氏孔板),测孔两侧的压差,再换算成流量。成本低,但精度受温度影响大。我建议用在低端机型上。
  • 超声波式:利用超声波在顺流和逆流中的传播时间差。精度极高,无活动部件,但贵。我记得在 ICU 高端呼吸机上见过。

我的选型建议:

如果你做的是家用或便携式呼吸机,热膜式是性价比之王。我习惯用 Sensirion 的 SFM3000 系列,I2C 接口,直接读数字量,省去模拟调理电路。

避坑指南:

我曾经在一个项目中直接用热膜式传感器测湿化后的气体,结果传感器表面结露,读数直接飘到天上去了。后来加了加热丝和防水透气膜才解决。记住:湿化气体一定要做防冷凝处理。

3.1.2 压力传感器

压力传感器测气道压力,单位是 cmH₂O 或 hPa。呼吸机里一般需要两个压力点:气道口(近端)和机器出口(远端)。

主流类型:

  • 压阻式(Piezoresistive):硅片上的压敏电阻随压力变化。精度高,线性好。我常用 NXP 的 MPXV5050DP,量程 0~50 kPa,绝对够用。
  • 电容式:利用膜片位移改变电容。功耗极低,适合电池供电设备。但温漂大,需要软件补偿。
  • MEMS 式:微型化,集成度高。比如 Bosch 的 BMP280,虽然原本是气压计,但用在呼吸机低压端(0~10 cmH₂O)也凑合,不过精度差点。

关键参数:

  • 量程:一般呼吸机压力范围 0~60 cmH₂O(约 0~5.9 kPa),选 0~10 kPa 的传感器留余量。
  • 精度:±0.5% FS 是底线,ICU 级别要求 ±0.1% FS。
  • 响应时间:< 5ms,否则跟不上呼吸波形。

注意:

压力传感器最怕过压。我曾经在测试时忘记加泄压阀,直接给传感器打了 100 cmH₂O,膜片直接炸了。嗯,后来乖乖加了机械泄压阀和软件限幅。

3.1.3 氧浓度传感器

氧浓度传感器测吸入氧浓度(FiO₂),单位是 %。这个传感器比较特殊,因为它反应慢,而且寿命短。

主流类型:

  • 电化学式(Galvanic Cell):利用氧气在电极上发生氧化还原反应产生电流。便宜,但寿命只有 1~2 年,且需要定期校准。我建议用在低端机型上。
  • 顺磁式(Paramagnetic):利用氧气的高顺磁性。精度高,响应快,寿命长。但贵,一个传感器要几百块。我记得在 Drager 的呼吸机上见过。
  • 超声波式:通过测量声速变化来推算氧浓度。无耗材,但受温湿度影响大。

我的经验:

电化学传感器有个坑:它输出的是电流信号,非常微弱(微安级),而且线性度一般。我习惯用跨阻放大器(TIA)加低通滤波,再用 ADC 采集。另外,传感器出厂时有个校准系数,一定要写到 EEPROM 里,否则换传感器就得重新标定。

3.2 数据采集网关选型:树莓派 vs STM32

传感器选好了,接下来就是用什么板子来采集数据、做初步处理、然后上传到云端。这里有两个主流方案:树莓派(Linux 派)和 STM32(MCU)。

我直接说结论:没有绝对的好坏,只有合不合适的场景

3.2.1 树莓派方案

树莓派本质是一台微型 Linux 电脑。我常用的是树莓派 4B 或 5。

优点:

  • 生态丰富:Python、Node.js、SQLite 随便装。我写个 Flask 服务就能直接当 Web 服务器用。
  • 开发快:传感器驱动库多,比如 Adafruit 的库,几行代码就能读数据。
  • 网络能力强:自带 WiFi 和蓝牙,直接连云。
  • 存储方便:SD 卡或 SSD,日志随便存。

缺点:

  • 功耗高:树莓派 4B 待机 3W,满载 7W。电池供电的话,撑不了多久。
  • 实时性差:Linux 不是实时系统。如果你需要微秒级的采样间隔,树莓派做不到。
  • 稳定性:SD 卡容易坏,尤其是频繁写日志时。我有个项目就是 SD 卡挂了,数据全丢。

适合场景:

原型验证、小批量、需要快速迭代的项目。比如你做一个呼吸机数据记录仪,树莓派接几个 USB 传感器,写个 Python 脚本,一天就能跑起来。

3.2.2 STM32 方案

STM32 是 ARM Cortex-M 内核的 MCU。我常用 STM32F4 或 H7 系列。

优点:

  • 实时性强:中断响应时间纳秒级。我用 STM32 做呼吸波形采集,采样率能到 1kHz 以上。
  • 功耗低:STM32L4 系列待机功耗微安级。电池供电的首选。
  • 可靠性高:没有 SD 卡、没有 Linux 内核崩溃。我有个产品连续跑了 3 年没重启过。
  • 成本低:一片 STM32F103 才几块钱,树莓派要几百。

缺点:

  • 开发慢:C 语言,裸机或 RTOS,调试麻烦。我写个 I2C 驱动都要半天。
  • 网络能力弱:需要外挂 ESP8266 或 W5500 才能联网。
  • 存储有限:内部 Flash 一般 512KB~2MB,日志得外挂 SD 卡或 SPI Flash。

适合场景:

量产产品、低功耗设备、对实时性要求高的场景。比如便携式呼吸机、家用 CPAP 设备。

3.2.3 选型对比表

对比项 树莓派 4B STM32F407
处理器 BCM2711 (Cortex-A72) Cortex-M4F
主频 1.5GHz 168MHz
RAM 1~8GB 192KB
功耗 3~7W 0.1~0.5W
实时性 差(Linux 非实时) 强(中断响应 < 1μs)
开发语言 Python、C、Node.js C、C++
网络 内置 WiFi/BT 需外挂模块
成本 约 300~500 元 约 20~50 元
适合阶段 原型验证、小批量 量产、低功耗产品

3.2.4 我的实际选择策略

我个人习惯是:原型用树莓派,量产用 STM32

举个例子。我之前做的一个呼吸机数据记录仪项目,第一阶段用树莓派 4B 接三个传感器(流量、压力、氧浓度),Python 脚本每 10ms 读一次数据,存到 SQLite 里,再通过 MQTT 上传到云。整个开发只花了两周。

到了第二阶段要量产,我把树莓派换成了 STM32F407 + ESP8266。传感器驱动用 C 重写,数据通过 SPI 传给 ESP8266,再走 WiFi 上传。功耗从 5W 降到了 0.3W,成本从 400 元降到了 40 元。嗯,代价是开发时间多了两个月。

避坑指南:

我曾经在树莓派上用 Python 的 time.sleep() 做定时采样,结果发现采样间隔不稳定,有时候差几十毫秒。后来改用 GPIO 中断 + 硬件定时器才解决。记住:Python 不是实时语言,别用它做高精度定时

3.3 传感器接口电路设计要点

最后简单提一下传感器怎么接。这部分我踩过不少坑,说几个关键点。

3.3.1 模拟信号调理

大部分压力传感器和电化学氧传感器输出的是模拟电压或电流。你需要做三件事:

  • 放大:用运放(比如 MCP6002)把信号放大到 ADC 的满量程范围(0~3.3V)。
  • 滤波:加一个二阶低通滤波器,截止频率设到 100Hz 左右,滤掉工频干扰。
  • 偏置:有些传感器输出有直流偏置,需要加一个减法电路去掉。

代码示例:STM32 读取压力传感器(ADC 单次转换)

// 初始化 ADC1,通道 0(PA0)
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

// 转换为电压
float voltage = adc_val * 3.3f / 4096.0f;

// 转换为压力(假设传感器 0~5V 对应 0~50 kPa)
float pressure_kpa = (voltage / 5.0f) * 50.0f;
float pressure_cmh2o = pressure_kpa * 10.197f;  // 1 kPa ≈ 10.197 cmH₂O

3.3.2 数字接口

热膜式流量传感器(如 SFM3000)和部分压力传感器(如 BMP280)支持 I2C 或 SPI 接口。我建议优先用 I2C,因为只需要两根线,而且可以挂多个传感器。

我的习惯:

I2C 总线上挂多个传感器时,记得给每个传感器分配不同的地址。如果地址冲突,可以用多路复用器(如 TCA9548A)来解决。我曾经因为两个传感器地址一样,折腾了一整天才发现。

3.3.3 电源与隔离

呼吸机是医疗设备,安全第一。传感器供电最好用隔离电源模块(比如 B0505S),把患者端和主控端隔离开。另外,信号线上加 TVS 管防静电。

重要提醒:

如果你做的是医用级呼吸机,必须通过 IEC 60601 标准。传感器接口要有电气隔离,漏电流不能超过 10μA。我建议直接买现成的医疗级传感器模块,别自己搭模拟电路,省得认证过不了。

好了,这一章就到这里。下一章我会讲数据采集的软件架构,包括怎么用 Python 和 C 写驱动程序,以及怎么处理采样时序。到时候见。