亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

开源脉搏血氧仪:Arduino Nano + MAX30102 + OLED 监测心率血氧

项目背景

COVID-19 导致血氧监测需求激增,商用指夹式血氧仪一度短缺。本项目开源一个低成本、可自制的脉搏血氧仪,基于 Arduino Nano、MAX30102 传感器和 128x64 OLED 显示,外壳 3D 打印。声明:本设备仅供学习/参考,不能替代医疗级设备,读数仅供参考,不作为诊断依据。

核心硬件

接线极简 (I2C 总线并联)

模块VCCGNDSDASCL
MAX301025VGNDA4A5
OLED5VGNDA4A5

INT 引脚悬空。巧板焊接时注意走线整齐,避免干扰 I2C 通信。

软件库依赖

库管理器搜索 “MAX30105” “SSD1306Ascii” 安装;spo2_algorithm.h 需手动放入库目录或同目录下。

算法流程

  1. 初始化传感器:particleSensor.setup(55, 4, 2, 200, 411, 4096) (LED 电流 55mA, 采样率 400Hz, 脉宽 411μs, ADC 4096)
  2. 采集前 50 组样本建立基线
  3. 调用 maxim_heart_rate_and_oxygen_saturation() 计算初始 HR/SpO2
  4. 进入循环:滑动窗口丢弃前 25 组,采集 25 组新样本 (约 1 秒)
  5. 重新计算 HR/SpO2,校验 validHeartRate 和 validSPO2
  6. 有效则 OLED 显示,无效显示 “Not valid”

关键代码片段

#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

MAX30105 particleSensor;
SSD1306AsciiWire oled;

#if defined(__AVR_ATmega328P__)
uint16_t irBuffer[50], redBuffer[50];  // Uno/Nano 截断为 16-bit
#else
uint32_t irBuffer[50], redBuffer[50];
#endif

int32_t spo2, heartRate;
int8_t validSPO2, validHeartRate;

void setup() {
  Serial.begin(115200);
  oled.begin(&Adafruit128x64, 0x3C);
  oled.setFont(Arial14);
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("MAX30105 not found");
    while (1);
  }
  particleSensor.setup(55, 4, 2, 200, 411, 4096);
}

void loop() {
  // 首次 50 样本校准
  for (byte i = 0; i < 50; i++) {
    while (!particleSensor.available()) particleSensor.check();
    redBuffer[i] = particleSensor.getRed();
    irBuffer[i] = particleSensor.getIR();
    particleSensor.nextSample();
  }
  maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);

  while (1) {
    // 滑动窗口
    for (byte i = 25; i < 50; i++) {
      redBuffer[i - 25] = redBuffer[i];
      irBuffer[i - 25] = irBuffer[i];
    }
    // 采集 25 新样本
    for (byte i = 25; i < 50; i++) {
      while (!particleSensor.available()) particleSensor.check();
      redBuffer[i] = particleSensor.getRed();
      irBuffer[i] = particleSensor.getIR();
      particleSensor.nextSample();
    }
    maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
    printToScreen();
  }
}

void printToScreen() {
  oled.clear(); oled.setCursor(0, 0);
  if (validSPO2 && validHeartRate) {
    oled.print(F("HR: ")); oled.println(heartRate);
    oled.print(F("SPO2: ")); oled.println(spo2);
  } else {
    oled.print(F("Not valid"));
  }
}

使用方法

  1. 组装硬件,上传代码
  2. 手指平放于 MAX30102 传感器窗口,轻合上盖 (避免环境光、施压过大影响读数)
  3. 接入 5V 供电 (USB 移动电源即可)
  4. 等待约 10 秒稳定,OLED 显示心率 (BPM) 和血氧饱和度 (%)
  5. 若长期显示 “Not valid”,调整手指位置、压力或环境光

已知局限与改进方向

文件资源

制造工艺

  1. FirePick Delta 项目日志:基于 OpenPnP 的开源微型工厂构建
  2. Arduino 数字骰子:LCD 显示随机点数的电子骰子
  3. DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
  4. Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
  5. 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
  6. 便携式血氧仪(脉搏血氧监测):Arduino Nano + MAX30100 + OLED,COVID-19 应急开源方案
  7. DIY Arduino 加湿器控制器:继电器安全控制高压电路
  8. Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
  9. DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
  10. Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
  11. Health Band 智能健康手环:基于 Infineon DPS310 的老人跌倒/步数/体温监护系统
  12. 为何开源驱动边缘创新——必读电子书