如何使用Arduino和MAX30102心率传感器进行心率监测

1.1 介绍:

MAX30102心率传感器主要用到MAX30102EFD元件,它是一个集成脉搏血氧仪和心率监视仪的传感器。它集成了一个红外LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。

传感器包含I2C通信接口。使用时,我们利用该通信接口将采集到的数据传输给带有I2C通信接口的单片机,然后进行心率和血氧的计算。

1.2 模块相关资料:

工作电压:

3.3V-5V(DC)

工作电流:

50mA

最大功率:

0.25W

通信方式:

标准IIC通信协议

尺寸:

31.6mmx23.7mm

原理:MAX30102是一套完整的脉搏血氧仪和心率传感器系统解决方案模块,专为可穿戴设备的要求而设计。该设备保持一个非常小的解决方案的大小,而不牺牲光学或电气性能。要集成到可穿戴系统中,需要最少的外部硬件组件。

MAX30102完全可通过软件寄存器,和数字输出数据可以存储在一个32-deep FIFO IC。FIFO允许MAX30102被连接到微控制器或处理器在一个共享的总线,数据没有被从MAX30102读取连续的寄存器。

动脉血氧饱和度子系统

MAX30102的SpO2子系统包含环境光取消(ALC)、持续时间的sigma-delta ADC和专有的离散时间过滤器。ALC有一个内部轨道/保持电路来取消环境光和增加有效的动态范围。动脉血氧饱和度ADC具有可编程的全面范围从2µa 16µa。酒精度可以取消200µa周围的电流。

内部ADC是一个连续时间过采样的sigma-delta变换器,具有18位分辨率。ADC采样率为10.24MHz。ADC输出数据速率可以从50sps(每秒样本)到3200sps。

1.3实验器材:

控制板* 1

USB线*1

MAX30102*1

5P 转杜邦线母*1

1.4模块接线图:

1.5 实验代码:

/*

MAX30102心率传感器

https://sourl.cn/NbKeBf

*/

#include <Wire.h>

#include "MAX30105.h"

#include "heartRate.h"

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.

byte rates[RATE_SIZE]; //Array of heart rates

byte rateSpot = 0;

long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute;

int beatAvg;

void setup()

{

Serial.begin(115200);

Serial.println("Initializing…");

// Initialize sensor

if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed

{

Serial.println("MAX30105 was not found. Please check wiring/power. ");

while (1);

}

Serial.println("Place your index finger on the sensor with steady pressure.");

particleSensor.setup(); //Configure sensor with default settings

particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running

particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED

}

void loop()

{

long irValue = particleSensor.getIR();

if (checkForBeat(irValue) == true)

{

//We sensed a beat!

long delta = millis() – lastBeat;

lastBeat = millis();

beatsPerMinute = 60 / (delta / 1000.0);

if (beatsPerMinute < 255 && beatsPerMinute > 20)

{

rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array

rateSpot %= RATE_SIZE; //Wrap variable

//Take average of readings

beatAvg = 0;

for (byte x = 0 ; x < RATE_SIZE ; x++)

beatAvg += rates[x];

beatAvg /= RATE_SIZE;

}

}

Serial.print("IR=");

Serial.print(irValue);

Serial.print(", BPM=");

Serial.print(beatsPerMinute);

Serial.print(", Avg BPM=");

Serial.print(beatAvg);

if (irValue < 50000)

Serial.print(" No finger?");

Serial.println();

}

程序编译前需要导入库文件,否则编译不通过,具体操作参考

资料的第四小节:库文件的添加(若前面已添加,无需重复)

1.6实验结果

按照接线图接线,上传测试代码成功,利用USB线上电后,打开串口监视器,设置波特率为115200,串口监视器显示如下图。

IR值为判断有无手指靠近的值(当手指没有靠近传感器时,IR值较小且显示No finger?贴近传感器后IR值剧增,且待测试数据进入测试范围值后开始示数),BMP值为心率,AVG BMP值为血氧饱和度。(Avg BPM)血氧饱和度是75-100,心率(BPM)60-150。

特别注意:注意事项:测试前先感应手指脉动,手指脉搏要完全贴合传感器15秒左右,才会显示稳定数据,串口监视器无数据显示时应挪动手指脉搏处利于传感器感应,或按UNO上的复位键,直到获得较平稳的数据。

物联沃分享整理
物联沃-IOTWORD物联网 » 如何使用Arduino和MAX30102心率传感器进行心率监测

发表评论