如何使用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心率传感器 */ #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上的复位键,直到获得较平稳的数据。