在这个项目中,我们将MAX30100 脉搏血氧仪传感器与 Arduino 连接起来。MAX30100 传感器能够测量血氧和心率。我们可以使用任何显示器(如16×2 LCD 显示器)来查看SpO2和BPM的值。血氧浓度(称为 SpO2)以百分比为单位测量,心跳/脉搏率以 BPM 为单位测量。
MAX30100 是一款脉搏血氧仪和心率监测传感器解决方案。它结合了两个LED、一个光电探测器、优化的光学元件和低噪声模拟信号处理,用于检测脉搏血氧仪和心率信号。您可以将此传感器与任何微控制器(如 Arduino 、ESP8266或ESP32 )一起使用,并轻松测量患者的健康参数。这款便宜的DIY 脉搏血氧仪传感器仅售 5 元左右,如果您是初学者或电子爱好者,它可以用于多种应用。
材料清单
以下是将 MAX30100 脉搏血氧仪传感器与 Arduino 连接所需的组件。您可以从亚马逊在线购买所有组件。组件名称以及购买链接如下。
序号 | 成分 | 数量 | |
---|---|---|---|
1 | Arduino UNO 板 | 1 | |
2 | MAX30100 脉搏血氧仪传感器 | 1 | |
4 | 16x2 LCD 显示屏 | 1 | |
5 | 电位器10K | 1 | |
6 | 连接线 | 10 | |
7 | 面包板 | 1 |
脉搏血氧仪如何工作?
氧气进入肺部,然后进入血液。血液将氧气输送到我们身体的各个器官。氧气进入血液的主要方式是通过血红蛋白。在脉搏血氧仪读数期间,将一个小的夹子状装置放在手指、耳垂或脚趾上。
小光束穿过手指中的血液,测量氧气含量。它通过测量含氧或缺氧血液中光吸收的变化来实现这一点。
MAX30100脉搏血氧仪
该传感器是集成脉搏血氧仪和心率监测传感器解决方案。它结合了两个 LED、一个光电探测器、优化的光学元件和低噪声模拟信号处理,用于检测脉搏和心率信号。它采用1.8V和3.3V电源供电,可通过软件断电,待机电流可忽略不计,允许电源始终保持连接。
特征
1. 功耗极低(工作电压为 1.8V 和 3.3V)
2. 超低关断电流(典型值 0.7µA)
3. 快速数据输出能力
4. 接口类型:I2C
MAX30100 脉搏血氧仪和心率传感器的工作原理
该设备有两个 LED,一个发出红光,另一个发出红外光。测量脉搏率只需要红外光。红光和红外光都用于测量血液中的氧气含量。
当心脏泵血时,由于血液量增加,含氧血液会增加。当心脏放松时,含氧血液的量也会减少。通过了解含氧血液增加和减少之间的时间,可以确定脉搏率。
事实证明,含氧血液吸收更多的红外光并传递更多的红光,而缺氧血液吸收红光并传递更多的红外光。这是 MAX30100 的主要功能:它读取两种光源的吸收水平并将其存储在可通过I2C通信协议读取的缓冲区中。
将 MAX30100 脉搏血氧仪传感器与 Arduino 连接
现在让我们将 MAX30100 脉搏血氧仪传感器与 Arduino 连接并在串行监视器中显示值。电路图和连接非常简单。您可以遵循相同的方法。
将 MAX30100 的 Vin 引脚连接到 Arduino 的5V或3.3V引脚,将 GND 连接到 GND。将 MAX30100 的 I2C 引脚(即SCL 和 SDA)连接到Arduino 的A5 和 A4 。
源代码/程序
用于将MAX30100 脉搏血氧仪与 Arduino接口的源代码/程序是用 Arduino IDE 的 C 程序编写的。此代码将在串行监视器中显示值。复制此代码并将其上传到 Arduino 板。
但在此之前,请从这里下载MAX30100 库:
Arduino MAX30100 库
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
PulseOximeter pox;
uint32_t tsLastReport = 0;
void onBeatDetected()
{
Serial.println("Beat!");
}
void setup()
{
Serial.begin(115200);
Serial.print("Initializing pulse oximeter..");
// Initialize the PulseOximeter instance
// Failures are generally due to an improper I2C wiring, missing power supply
// or wrong target chip
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
// Register a callback for the beat detection
pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop()
{
// Make sure to call update as fast as possible
pox.update();
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
Serial.print("Heart rate:");
Serial.print(pox.getHeartRate());
Serial.print("bpm / SpO2:");
Serial.print(pox.getSpO2());
Serial.println("%");
tsLastReport = millis();
}
}
上传代码后,打开串行监视器以查看图像中所示的值。最初,BPM 和 SpO2 值显示为不正确的值,但很快您就可以观察到正确的稳定读数。
在 LCD 显示屏上显示 MAX30100 SpO2 和 BPM 值
现在让我们使用16X2 LCD 显示器而不是串行监视器来查看BPM 和 SpO2的值。按照下面的电路图组装电路。
将 MAX30100 的 Vin 引脚连接到 Arduino 5V 或 3.3V 引脚,将 GND 连接到 GND。将 MAX30100 的 I2C 引脚、SCL 和 SDA 连接到 Arduino 的 A5 和 A4。同样,将 LCD 引脚 1、5、16 连接到 Arduino 的 GND,将 2、15 连接到 5V VCC。同样,将 LCD 引脚 4、6、11、12、13、14 连接到 Arduino 引脚 13、12、11、10、9、8。在 LCD 的引脚 3 处使用 10K 电位器来调整 LCD 的对比度。
源代码/程序
#include <LiquidCrystal.h>
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
#define REPORTING_PERIOD_MS 1000
PulseOximeter pox;
uint32_t tsLastReport = 0;
void onBeatDetected()
{
Serial.println("Beat!");
}
void setup()
{
Serial.begin(115200);
Serial.print("Initializing pulse oximeter..");
lcd.begin(16,2);
lcd.print("Initializing...");
delay(3000);
lcd.clear();
// Initialize the PulseOximeter instance
// Failures are generally due to an improper I2C wiring, missing power supply
// or wrong target chip
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
// Register a callback for the beat detection
pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop()
{
// Make sure to call update as fast as possible
pox.update();
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
Serial.print("Heart rate:");
Serial.print(pox.getHeartRate());
Serial.print("bpm / SpO2:");
Serial.print(pox.getSpO2());
Serial.println("%");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("BPM : ");
lcd.print(pox.getHeartRate());
lcd.setCursor(0,1);
lcd.print("SpO2: ");
lcd.print(pox.getSpO2());
lcd.print("%");
tsLastReport = millis();
}
}
MAX30100 不工作故障排除
如果您购买了下图所示的 MAX30100 模块,那么它可能无法工作,因为它存在严重的设计问题。MAX30100 IC 使用 1.8V 作为 VDD,而此特定模块使用两个调节器来实现此电压。
这没什么问题。但是,如果你仔细观察,SCL 和 SDA 引脚通过 4.7k 欧姆电阻上拉至 1.8V!这意味着它无法与逻辑电平更高的微控制器很好地配合使用。
有两种方法可以解决此问题并使 MAX30100 工作。
第一种方法
解决方案是从电路板上移除电阻器(下图中圈出的部分),并将外部 4.7k 欧姆电阻器连接到 SDA、SCL 和 INT 引脚。
移除所有 4.7K 电阻后,将 INT、SDA、SCL 引脚连接到外部 4.7K 上拉电阻。
第二种方法
如果不喜欢第一种方法,可以使用第二种方法解决这个问题。只需在红十字位置切断路径并制作一个跳线,如黄线所示。跳线不需要绝缘线。您可以从绞合线中取出镀锡绞线。电路板上覆盖有保护罩,并且不会与铜灌注短路。