Arduino驱动MAX30102心率血氧传感器模块

  • 前言
  • 一、使用硬件
  • 二、主要参数
  • 三、原理说明
  • 四、实践操作
  • 1、接线
  • 2、程序驱动
  • 五、实验结果
  • 六、总结


前言

MAX30102是一个集成的脉搏血氧仪和心率监测器模块。MAX30102包括内部led,光电探测器,光学元件,和低噪声电子元件,具有环境光反射特征。MAX30102提供了一个完整的系统解决方案,以简化移动和可穿戴设备的设计过程。MAX30102运行在一个1.8V电源和一个单独的5.0V电源上。通过一个标准的i2c兼容的接口进行通讯。该模块可以通过软件来关断电源,待机模式下的电流消耗量几乎为零。

一、使用硬件

MAX30102心率血氧传感器模块

Arduino驱动emmc例程_嵌入式硬件

原装正版Arduino uno 开发板

Arduino驱动emmc例程_单片机_02

Arduino驱动emmc例程_单片机_03

二、主要参数

供电电压

1.8-5V(一般建议3.3V、5V)

信号接口

I2C

工作电流

1.5mA (3.3V输入)

心率精确度

+/-5bpm(静态),+/-10bpm(动态)

分辨率

1bpm

采样率

100Hz(STM32程序)/ 25Hz(arduino程序)

三、原理说明

传统的脉搏测量方法主要有三种:
1、从心电信号中提取
2、从测量血压时压力传感器测到的波动来计算脉率
3、光电容积法

前两种会限制病人的活动,长时间使用会加重病患的心理和生理负担,而光电容积法在实际中时普遍使用的一种有效方法,其特点:方法简单、佩戴方便、可靠性高。

光电容积法基本原理:
利用人体组织在血管搏动时造成透光率不同来进行脉搏和血氧饱和度测量的。其使用的传感器由光源和光电变换器两部分组成,通过绑带或夹子固定在病患的手指、手腕或耳垂上。光源一般采用对动脉血中氧合血红蛋白(Hb02)和血红蛋白(Hb)有选择性的特定波长的发光二极管(一般使用660nm附近的红光和900nm附近的红外光)。当光束透过人体外周血管,由于动脉搏动充血容积变化导致这束光的透光率发生改变,此时由光电变换器接收经人体组织反射的光线,转变为电信号并将其放大和输出。

模块原理图

Arduino驱动emmc例程_Arduino驱动emmc例程_04


在red led外面有一个玻璃盖,玻璃盖的作用是能够有效的排除外界和内部光的干扰,但完全排除还是实现不了的。当led光射向手腕上皮肤时,人体组织会反射光线给光电变换器,而光电变换器将这个光转换成了电信号并且将它变大和输出,电信号最后再经过AD转化为数字信号。简单来说就是光变电变数字信号。

四、实践操作

1、接线

MAX30102与Arduino的接线:

MAX30102

Arduino

蜂鸣器

GND

GND

GND

SDA

A4

-

SCL

A5

-

VIN

5V

-

-

8

VCC

2、程序驱动

所用到的程序:

#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4; 
byte rates[RATE_SIZE]; // 心率数组
byte rateSpot = 0;
long lastBeat = 0; // 最后记录心率的时间
float beatsPerMinute;
int beatAvg;
int Buzzer; 
int pin=8;
void setup()
{
  Serial.begin(115200);
  
  Serial.println("Initializing...");

  //   初始化传感器
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //   默认使用I2C,400KHZ频率
  {
    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(); //使用默认设置配置传感器
  particleSensor.setPulseAmplitudeRed(0x0A); // 将红色LED拉低,表示传感器正在运行
}
void loop()
{
  long irValue = particleSensor.getIR();

  if (checkForBeat(irValue) == true)
  {
    //  感应到心率
    long delta = millis() - lastBeat;
    lastBeat = millis();
    beatsPerMinute = 60 / (delta / 1000.0);
    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
      rates[rateSpot++] = (byte)beatsPerMinute; // 将此读数存储在数组中
      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;
      if (beatsPerMinute > 70)
      {
       digitalWrite(8,HIGH) ;   //蜂鸣器响
       delay(1000);           //延时1000ms
       digitalWrite(8,LOW);   //蜂鸣器关闭
      }
    }
  }
  Serial.print("IR=");  
  Serial.print(irValue);
  Serial.print(", BPM="); 
  Serial.print(beatsPerMinute);
  Serial.print(", Avg BPM="); 
  Serial.print(beatAvg);
 
  if (irValue < 50000)
    Serial.print(" 未识别?");

  Serial.println();
}

五、实验结果

未把手指放上时------

Arduino驱动emmc例程_Arduino驱动emmc例程_05


把手指放上检测------

Arduino驱动emmc例程_Arduino驱动emmc例程_06

其中IR表示脉搏,BPM表示心率,Avg BPM表示平均心率;另外,该实验还添加了报警器,当所测心率值大于70时,蜂鸣器就会报警一次,这样方便大家实时监控自己心率,可以根据自己的情况设定心率波动期间,超出这个范围会报警提示。

实物展示------

Arduino驱动emmc例程_嵌入式硬件_07

六、总结

(1)串口默认波特率为115200,可在‘’ Serial.begin(115200)‘’语句进行波特率更改如(9600)。
(2)脉搏传感器必须紧贴人体,刚开始波动值较大,等到十几秒后数值趋于稳定,此时所测心率与实际值在精度范围内,模块在长时间使用过程中数据正常。