MAX30102: Arduino용 심박수 모니터 및 산소농도 측정기 모듈

MAX30102

그동안 우리는 많은 것을 보여주었습니다. 전자 부품 호환 가능 Arduino와 같은 보드 또는 호환 가능, 다른 많은 제작자 또는 DIY 작업에도 적용됩니다. 이제 모듈을 소개하겠습니다. MAX30102, 맥박과 혈중 산소를 측정하는 센서가 포함되어 있습니다.

이러한 방식으로 자체 제작 활동 팔찌나 하드웨어와 같은 웨어러블 제품을 만들 수도 있습니다. 건강 상태를 모니터링하다 이 장치에 심박수 모니터와 산소 측정기가 통합되어 해당 사람의 생체 인식 데이터 또는 원격 측정 기능을 제공합니다.

심박수 모니터란 무엇입니까? 어떻게 작동하나요?

Un 맥박 센서 또는 심박수 모니터 사람의 심박수를 실시간으로 측정하는 데 사용되는 전자 장치입니다. 주로 스포츠 분야에서 훈련 중이나 일상적인 성과와 노력을 모니터링하는 데 사용됩니다. 심박수 모니터는 운동선수들에게 인기가 있지만 의료 센터에서 심박수, 즉 심박수 또는 분당 심박수를 아는 기본 장치이기도 합니다.

  • PR BPM: 심박수, 즉 분당 심박수를 표시합니다.

모든 경우에, 센서는 각 심장 박동에 따른 혈액량의 변화를 포착합니다.. 이 변화는 심박수를 얻기 위해 처리되는 전기 신호로 변환됩니다. 일부 심박수 모니터에는 판독 정확도를 높이기 위해 증폭 및 소음 제거 회로도 포함되어 있습니다.

산소농도측정기란 무엇입니까? 어떻게 작동하나요?

Un 산소 농도계는 의료 또는 스포츠 장치입니다. 혈액의 산소 포화도를 측정하는 데 사용됩니다. 이 장치는 0~100% 값의 혈중 산소 포화도 데이터를 제공합니다. 동일한 장치에는 모니터링 또는 기록을 위한 모든 정보를 나타내는 심박수 옵션도 포함하는 것이 일반적입니다.

로스 다 토스 산소 농도계를 측정하다 입니다 :

  • %SpO2:혈액의 산소 포화도를 백분율로 나타냅니다.

산소농도계는 손가락의 형태에 맞게 클램프처럼 배치되거나 손목과 같은 심박수 모니터의 경우처럼 신체의 다른 위치에 배치할 수도 있습니다. 많은 활동 팔찌에서 볼 수 있습니다. ,

작동과 관련하여 산소 농도계는 서로 다른 방출을 방출합니다. 빛의 파장 피부를 통과하는 것입니다. 이 빛에 작용하는 것은 산소 운반을 담당하는 혈액 분자인 헤모글로빈이며 운반하는 산소 수준에 따라 서로 다른 양의 빛을 흡수합니다. 자세한 과정은 다음과 같습니다.

  1. 발광- 산소 포화도 측정기는 빨간색과 적외선이라는 두 가지 파장의 빛을 방출하며, 이 빛은 장치에 있는 손가락을 통과합니다.
  2. 빛 흡수: 산소를 운반하는 적혈구의 분자인 헤모글로빈은 다양한 양의 빛을 흡수합니다. 산소가 풍부한 헤모글로빈(옥시헤모글로빈)과 무산소 헤모글로빈(디옥시헤모글로빈)은 서로 다른 광 흡수 특성을 가지고 있습니다.
  3. 빛 감지: 발광체 반대쪽에 있는 검출기가 손가락을 통과한 빛을 수집합니다.
  4. 산소 포화도 계산- 장치는 산소헤모글로빈과 디옥시헤모글로빈 모두 존재하는 총 헤모글로빈 양에 대한 산소헤모글로빈의 비율을 계산합니다. 이 비율은 혈중 산소 포화도(%SpO2)의 백분율로 표시됩니다. 이는 이러한 전기 신호를 해석하여 수치 값으로 변환할 수 있는 프로세서를 통해 수행됩니다.

MAX30102 모듈이란 무엇입니까?

센서 MAX30102, Maxim Integrated 생산는 심박수 모니터와 산소농도 측정기의 기능을 결합한 통합 장치입니다. 이 센서는 Arduino와 같은 마이크로 컨트롤러와 함께 쉽게 사용할 수 있습니다. MAX30102는 이 회사의 MAX3010x 광학 센서 시리즈에 속합니다.

그 작동은 혈액의 빛 흡수 정도에 따라 달라집니다. 산소 포화도 및 맥박 이전 두 섹션에서 언급했듯이. 이 센서에는 2개의 LED(빨간색 LED 1개, 적외선 LED 1개)가 장착되어 있습니다. 손가락이나 손목 등 피부에 부착해 반사광을 감지해 산소포화도를 판단한다.

MAX30102와의 통신이 수행됩니다. I2C 버스를 통해, Arduino와 같은 마이크로 컨트롤러에 쉽게 연결할 수 있습니다. MAX30102에는 로직용으로 1.8V, LED용으로 3.3V의 이중 전원 공급 장치가 필요합니다. 일반적으로 필요한 레벨 매칭이 이미 포함되어 있는 5V 모듈에서 발견됩니다.

MAX30102는 가정이나 스포츠 프로젝트에 사용되는 센서입니다. 즉, 전문적인 의료용으로 사용하기에는 충분한 신뢰성과 감도를 갖지 못할 수 있습니다.

La 광학 펄스 산소 측정기 이는 혈액 내 산소 포화도 비율을 결정하는 비침습적 방법입니다. 앞서 언급했듯이 이는 서로 다른 파장에 대한 헤모글로빈(Hb)과 산소헤모글로빈(HbO2)의 광흡수 계수의 차이를 기반으로 합니다. 산소가 풍부한 혈액은 적외선을 더 많이 흡수하고, 산소가 적은 혈액은 적색광을 더 많이 흡수합니다. 피부가 충분히 얇고 그 아래에 혈관이 있는 신체 부위에서는 이 차이를 사용하여 산소 포화도를 결정할 수 있습니다.

맥박 및 혈중 산소 센서를 갖춘 MAX30102 모듈의 특징

MAX30102에는 다음이 포함됩니다.

  • LED 2개, 빨간색(660nm) 880개 및 적외선(XNUMXnm) XNUMX개
  • 반사광을 측정하기 위한 2개의 포토다이오드
  • 초당 18~50샘플의 샘플링 속도를 제공하는 3200비트 ADC 변환기입니다.
  • 또한 신호 증폭 및 필터링, 주변광 제거, 50~60Hz(인공광) 주파수 거부 및 온도 보상에 필요한 전자 장치를 갖추고 있습니다.

모듈 소비 최대 50mA에 도달할 수 있습니다. 측정 중에는 강도를 프로그래밍 방식으로 조정할 수 있지만 측정 중 0.7μA의 저전력 모드를 사용하면 됩니다.

가격 및 구입처

맥박과 혈중 산소를 측정하는 MAX30102 센서 그들은 꽤 싸다. 이 모듈은 eBay, Aliexpress 또는 Amazon과 같은 사이트에서 단 몇 유로만 내면 구입할 수 있습니다. 여러 유형이 있음을 알 수 있으며 다음을 권장합니다.

Arduino와의 연결 및 예

Arduino IDE, 데이터 유형, 프로그래밍

Arduino로 MAX30102를 테스트하려면 먼저 이 모듈을 Arduino 보드에 연결해야 합니다. 이것 연결은 아주 간단해요, 다음을 연결하기만 하면 됩니다.

  1. 모듈의 Vcc는 Arduino 보드의 5V 출력에 연결되어야 합니다.
  2. 모듈의 GND는 Arduino 보드의 GND 소켓에 연결되어야 합니다.
  3. 모듈의 SCL은 A5와 같은 Arduino 보드의 아날로그 입력 중 하나에 연결되어야 합니다.
  4. 모듈의 SDA는 A4와 같은 Arduino 보드의 다른 아날로그 입력에 연결되어야 합니다.

MAX30102 보드와 Arduino 보드 사이에 적절한 연결이 설정되면 다음 작업은 소스 코드나 스케치를 작성하여 작동하도록 하고 문제의 사람으로부터 생체 인식 데이터를 수신하기 시작하는 것입니다. 다음 코드를 작성하는 것만큼 쉽습니다. 아두 이노 IDE 보드를 프로그래밍합니다.

또한 이를 사용하려면 Arduino IDE에 라이브러리를 설치해야 합니다. 이 라이브러리는 SparkFun에서 개발되었으며 다음 위치에서 사용할 수 있습니다. https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library.
#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"

MAX30102 pulsioximetro;


#define MAX_BRIGHTNESS 255


#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
//Arduino Uno no tiene suficiente SRAM para almacenar 100 muestreos, por lo que hay que truncar las muestras en 16-bit MSB.
uint16_t pulsoBuffer[100]; //infrared LED sensor data
uint16_t oxiBuffer[100];  //red LED sensor data

#else
uint32_t pulsoBuffer[100]; //Sensores
uint32_t oxiBuffer[100];  

#endif

int32_t BufferLongitud; //Longitud de datos
int32_t spo2; //Valor de SPO2
int8_t SPO2valido; //Indicador de validez del valor SPO2
int32_t rangopulsacion; //PR BPM o pulsaciones
int8_t validrangopulsacion; //Indicador de validez del valor PR BPM

byte pulsoLED = 11; //Pin PWM
byte lecturaLED = 13; //Titila con cada lectura

void setup()
{
  Serial.begin(115200); // Inicia la comunicación con el microcontrolador a 115200 bits/segundo

  pinMode(pulsoLED, OUTPUT);
  pinMode(lecturaLED, OUTPUT);

  // Inicializar sensores
  if (!pulsioximetro.begin(Wire, I2C_SPEED_FAST)) //Usar el bus I2C a 400kHz 
  {
    Serial.println(F("MAX30102 no encontrado. Por favor, comprueba la conexión y alimentación del módulo."));
    while (1);
  }

  Serial.println(F("Pon el sensor en contacto con tu dedo y presiona cualquier tecla para iniciar la conversión."));
  while (Serial.available() == 0) ; //Esperar hasta que se pulsa una tecla
  Serial.read();

  byte brilloLED = 60; //Opciones: 0=Apagado hasta 255=50mA
  byte mediaMuestreo = 4; //Opciones: 1, 2, 4, 8, 16, 32
  byte ModoLED = 2; //Opciones: 1 = Rojo solo, 2 = Rojo + IR, 3 = Rojo + IR + Verde
  byte rangoMuestreo = 100; //Opciones: 50, 100, 200, 400, 800, 1000, 1600, 3200
  int anchoPulso = 411; //Opciones: 69, 118, 215, 411
  int rangoADC = 4096; //Opciones: 2048, 4096, 8192, 16384

  pulsioximetro.setup(brilloLED, mediaMuestreo, ModoLED, rangoMuestreo, anchoPulso, rangoADC); //Configuración del módulo
}

void loop()
{
  BufferLongitud = 100; //10 almacenamientos en el buffer con 4 segundos corriendo a 25sps

  //Leer las primeras 100 muestras
  for (byte i = 0 ; i < BufferLongitud ; i++)
  {
    while (pulsioximetro.available() == false) //Comprobar nuevos datos
      pulsioximetro.check(); 
    oxiBuffer[i] = pulsioximetro.getRed();
    pulsoBuffer[i] = pulsioximetro.getIR();
    pulsioximetro.siguienteMuestreo(); //Muestreo terminado, ir al siguiente muestreo

    Serial.print(F("red="));
    Serial.print(oxiBuffer[i], DEC);
    Serial.print(F(", ir="));
    Serial.println(pulsoBuffer[i], DEC);
  }

  //Calcular el valor del pulso PM y SpO2 tras los primeros 100 samples
  maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion);

  //Calcular muestreos continuos
  while (1)
  {
    //Volcar los 25 primeros valores en memoria y desplazar los últimos 75 arriba
    for (byte i = 25; i < 100; i++)
    {
      oxiBuffer[i - 25] = oxiBuffer[i];
      pulsoBuffer[i - 25] = pulsoBuffer[i];
    }

    for (byte i = 75; i < 100; i++)
    {
      while (pulsioximetro.available() == false) //Comprobar si existen nuevos datos
        pulsioximetro.check(); 

      digitalWrite(lecturaLED, !digitalRead(lecturaLED)); //Parpadea el LED on-board con cada dato

      oxiBuffer[i] = pulsioximetro.getRed();
      pulsoBuffer[i] = pulsioximetro.getIR();
      pulsioximetro.siguienteMuestreo(); //Al finalizar, moverse al siguiente muestreo

      Serial.print(F("Oxígeno="));
      Serial.print(oxiBuffer[i], DEC);
      Serial.print(F(", Pulso="));
      Serial.print(pulsoBuffer[i], DEC);

      Serial.print(F(", HR="));
      Serial.print(rangopulsacion, DEC);

      Serial.print(F(", HRvalid="));
      Serial.print(validrangopulsacion, DEC);

      Serial.print(F(", SPO2="));
      Serial.print(spo2, DEC);

      Serial.print(F(", SPO2 válido="));
      Serial.println(SPO2valido, DEC);
    }

    //Recalcular tras los primeros muestreos
    maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion);
  }
}

물론 필요에 따라 코드를 수정할 수 있습니다. 이는 단지 예일 뿐입니다...


코멘트를 첫번째로 올려

코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.