用于 COVID-19 的开源脉搏血氧仪
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
| ||||
|
应用和在线服务
| ||||
|
关于这个项目
COVID-19 的挑战
COVID-19 是一种由 SARS-CoV-2 病毒引起的疾病,主要攻击人的呼吸系统。一些较轻微的症状可能包括发烧、疼痛和发冷,但也可能导致更严重的情况,例如肺炎。一个患有肺炎甚至轻微呼吸急促的人可能不知道什么时候去医院,尤其是当他们开始变得更加不堪重负时。这就是我创建这个开源脉搏血氧仪的原因,它可以帮助人们获得他们需要的帮助并获得有关他们当前状况的准确信息。
一点免责声明
此设备/项目不得用作准确的医疗诊断工具!
电子产品
MAX30102
128x64 像素 OLED
图>Arduino纳米
逐步构建设备
以下是有关如何构建此项目的分步演练。
1. 打印并清洁部件
首先从该项目的附件部分下载每个片段并将其加载到您选择的切片器中。我使用了大约 70-80% 的填充物和中等支撑,全部使用 PLA。打印完成后,我取下支撑物并轻轻打磨以确保它们都能很好地结合在一起。
图> 图> 图>
2. 焊接电子设备
整个设备围绕 Arduino Nano 设计,Arduino Nano 安装在一块 44mm x 30mm 穿孔板上。首先,将电线焊接到传感器的 VIN、GND、SDA 和 SCL 引脚,然后在床件下方连接到 Arduino Nano。
接下来,OLED 的连接器连接到 Nano,然后连接到显示器本身。
最后,整个电子组件滑入外壳并用几个 3 毫米螺钉固定。
3. 组装设备
插入电子设备后,只需将 OLED 屏幕连接到顶部,然后用几个 3 毫米螺钉将其固定到机箱的其余部分。您可以通过轻轻上下铰接盖子来测试它的运动。
图>
4. 上传草图
包含的草图执行几个操作来显示用户的当前心率和氧饱和度。要上传它,只需安装所需的库并从工具菜单的板列表中选择 Arduino Nano,然后单击上传。
至于草图本身,它首先初始化 OLED 和 MAX30102,同时报告可能出现的任何错误。接下来,它读取 100 个值以校准传感器并开始显示它们。然后设备进入一个循环,在其中读取 25 个新值并计算它们的移动平均值。最后,它检查这些值是否有效,如果有效则将它们打印到屏幕上。
5. 使用它
要使用脉搏血氧仪,请将指尖放在传感器上并轻轻合上顶盖。然后插上电源,等待数据显示出来。
图> 图>
代码
- 脉搏血氧仪代码
脉搏血氧仪代码C/C++
/* Hardware Connections (Breakoutboard to Arduino):-5V =5V (3.3V is allowed) -GND =GND -SDA =A4 (or SDA) -SCL =A5 (or SCL) -INT =Not connected The MAX30105 Breakout 可以处理 5V 或 3.3V I2C 逻辑。我们建议使用 5V 为电路板供电,但它也会以 3.3V 的电压运行。*/#include#include "MAX30105.h"#include "spo2_algorithm.h"#include "SSD1306Ascii.h"#include "SSD1306AsciiWire .h"MAX30105particleSensor;SSD1306AsciiWire oled;#define MAX_BRIGHTNESS 255#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)//Arduino Uno 没有足够的 SRAM 来存储 50 个 32 位格式的 IR LED 数据和红色 LED 数据样本//为了解决这个问题,采样数据的 16 位 MSB 将被截断。样本变成 16 位 data.uint16_t irBuffer[50]; //红外LED传感器 datauint16_t redBuffer[50]; //红色LED传感器数据#elseuint32_t irBuffer[50]; //红外LED传感器 datauint32_t redBuffer[50]; //红色LED传感器数据#endifint32_t spo2; //SPO2 valueint8_t validSPO2; //指示SPO2计算是否有效int32_t heartRate; //心率值int8_t validHeartRate; //指示心率计算是否有效void setup(){ Serial.begin(115200); // 以每秒 115200 位的速率初始化串行通信:oled.begin(&Adafruit128x64, 0x3C); oled.setFont(Arial14); // 初始化传感器 if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //使用默认 I2C 端口,400kHz 速度 { Serial.println(F("MAX30105 was not found. Please check wire/power."));而 (1); }particleSensor.setup(55, 4, 2, 200, 411, 4096); //使用这些设置配置传感器}void loop(){ //读取前 50 个样本,并确定信号范围 (byte i =0; i <50; i++) { while (particleSensor.available() ==false ) //我们有新数据吗?粒子传感器检查(); //检查传感器是否有新数据 redBuffer[i] =particleSensor.getRed(); irBuffer[i] =particleSensor.getIR();粒子传感器.nextSample(); //我们完成了这个样本,所以移到下一个样本 Serial.print(F("red=")); Serial.print(redBuffer[i], DEC); Serial.print(F(", ir=")); Serial.println(irBuffer[i], DEC); } //在前50个样本(样本的前4秒)后计算心率和SpO2 maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate); //不断从MAX30102采样。心率和 SpO2 每 1 秒计算一次 while (1) { //将前 25 组样本转储到内存中并将最后 25 组样本移至顶部 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() ==false) //我们有新数据吗?粒子传感器检查(); //检查传感器是否有新数据 redBuffer[i] =particleSensor.getRed(); irBuffer[i] =particleSensor.getIR();粒子传感器.nextSample(); //我们完成了这个样本,所以移到下一个样本 Serial.print(F("red=")); Serial.print(redBuffer[i], DEC); Serial.print(F(", ir=")); Serial.print(irBuffer[i], DEC); Serial.print(F(", HR=")); Serial.print(heartRate, DEC); Serial.print(F(", HRvalid=")); Serial.print(validHeartRate, DEC); Serial.print(F(", SPO2=")); Serial.print(spo2, DEC); Serial.print(F(", SPO2Valid=")); Serial.println(validSPO2, DEC); } //收集25个新样本后重新计算HR和SP02 maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);打印到屏幕(); }}void printToScreen() { oled.clear(); oled.setCursor(0,0); if(validSPO2 &&validHeartRate) { oled.print(F("HR:")); oled.println(heartRate, DEC); oled.print(F("SPO2:")); oled.println(spo2, DEC); } else { oled.print(F("无效")); }}
定制零件和外壳
示意图
制造工艺