MAX30102: modul monitoru srdečního tepu a oxymetru pro Arduino

MAX30102

Za celou tu dobu jsme ukázali velké množství Elektronické komponenty kompatibilní s desky jako Arduino nebo kompatibilní, stejně jako pro mnoho dalších tvůrců nebo kutilů. Nyní vám modul představíme MAX30102, který obsahuje senzor pro měření tepu a kyslíku v krvi.

Tímto způsobem můžete také vytvářet nositelná zařízení, jako jsou náramky nebo hardware pro vlastní výrobu sledovat zdravotní stav osoby, poskytující biometrická data nebo telemetrii této osoby díky integraci monitoru srdečního tepu a oxymetru v tomto zařízení...

Co je monitor srdečního tepu? Jak to funguje?

Un snímač pulsu nebo monitor srdečního tepu Jde o elektronické zařízení sloužící k měření srdeční frekvence člověka v reálném čase. Používá se především ve sportovní oblasti ke sledování výkonu a námahy během tréninku nebo na denní bázi. Monitory srdečního tepu jsou oblíbené mezi sportovci, ale jsou také základním zařízením v lékařských centrech, které zjišťuje srdeční frekvenci, tedy srdeční frekvenci nebo tepy za minutu:

  • PR Bpm: zobrazuje tepovou frekvenci, tedy počet tepů za minutu.

Ve všech případech, Senzory zachycují změny v objemu krve s každým srdečním tepem. Tato změna je převedena na elektrický signál, který je zpracován za účelem získání srdeční frekvence. Některé monitory srdečního tepu také obsahují obvody pro zesílení a potlačení hluku, aby se zlepšila přesnost měření.

Co je to oxymetr? Jak to funguje?

Un oxymetr je lékařské nebo sportovní zařízení který se používá k měření saturace krve kyslíkem. Tento přístroj nabízí údaje o saturaci krve kyslíkem s hodnotami od 0 do 100 %. Je běžné, že stejné zařízení obsahuje také možnost srdeční frekvence, která uvádí všechny informace pro sledování nebo záznam.

Data, která měří oxymetr Je to:

  • %SpO2: označuje procento saturace kyslíkem v krvi.

Oxymetr se umísťuje jako svorka tak, že se přizpůsobí morfologii našeho prstu nebo jej lze umístit i na jiná místa na těle, jako je tomu u měřičů srdečního tepu, např. zápěstí, např. lze vidět v mnoha náramcích s aktivitami.

Pokud jde o jejich činnost, oxymetry vyzařují různé světelné vlnové délky které procházejí kůží. To, co působí na toto světlo, je hemoglobin, molekula krve zodpovědná za transport kyslíku, absorbující různá množství světla v závislosti na hladině kyslíku, kterou transportuje. Podrobný postup je následující:

  1. vyzařování světla- Oxymetr vyzařuje dvě vlnové délky světla, jednu červenou a jednu infračervenou, které procházejí prstem umístěným na zařízení.
  2. Absorpce světla: Hemoglobin, molekula v červených krvinkách, která přenáší kyslík, absorbuje různá množství těchto světel. Hemoglobin zatížený kyslíkem (oxyhemoglobin) a hemoglobin bez kyslíku (deoxyhemoglobin) mají různé absorpční vlastnosti světla.
  3. Detekce světla: Detektor na opačné straně světelného zářiče shromažďuje světlo, které prošlo prstem.
  4. Výpočet saturace kyslíkem- Přístroj vypočítá poměr oxyhemoglobinu k celkovému množství přítomného hemoglobinu, a to jak oxyhemoglobinu, tak deoxyhemoglobinu. Tento podíl je uveden jako procento saturace krve kyslíkem (%SpO2). To se provádí pomocí procesoru schopného interpretovat tyto elektrické signály a převést je na číselnou hodnotu.

Co je modul MAX30102?

Senzor MAX30102, výrobce Maxim Integrated, je integrované zařízení, které kombinuje funkce monitoru srdeční frekvence a oxymetru. Tento senzor lze snadno použít s mikrokontrolérem, jako je Arduino. MAX30102 patří do řady optických senzorů MAX3010x od této firmy.

Jeho činnost je založena na kolísání absorpce světla krví v závislosti na jejím úroveň saturace kyslíkem a puls jak jsem zmínil v předchozích dvou částech. Tento senzor je vybaven dvěma LED diodami, jednou červenou a jednou infračervenou. Je umístěn na kůži, například na prstu nebo zápěstí, a detekuje odražené světlo, aby určil stupeň nasycení kyslíkem.

Probíhá komunikace s MAX30102 přes I2C sběrnici, což usnadňuje připojení k mikrokontroléru, jako je Arduino. MAX30102 potřebuje dvojité napájení: 1.8 V pro logiku a 3.3 V pro LED. Obvykle se vyskytuje na 5V modulech, které již obsahují potřebné přizpůsobení úrovně.

MAX30102 je senzor používaný v domácích nebo sportovních projektech, to znamená, že nemusí mít dostatečnou spolehlivost a citlivost pro profesionální lékařské použití.

La optická pulzní oxymetrie Jde o neinvazivní metodu stanovení procenta saturace krve kyslíkem. Jak jsem již zmínil, je založen na rozdílu koeficientů absorpce světla hemoglobinu (Hb) a oxyhemoglobinu (HbO2) pro různé vlnové délky. Krev bohatá na kyslík absorbuje více infračerveného světla, zatímco krev s nízkým obsahem kyslíku absorbuje více červeného světla. V oblastech těla, kde je kůže dostatečně tenká a pod ní jsou krevní cévy, lze tento rozdíl použít k určení stupně nasycení kyslíkem.

Vlastnosti modulu MAX30102 se senzorem tepu a kyslíku v krvi

MAX30102 obsahuje:

  • 2x LED, jedna červená (660nm) a jedna infračervená (880nm)
  • 2x fotodiody pro měření odraženého světla
  • 18bitový ADC převodník se vzorkovací frekvencí 50 až 3200 vzorků za sekundu.
  • Navíc má potřebnou elektroniku pro zesílení a filtraci signálu, potlačení okolního světla, potlačení frekvencí 50-60Hz (umělé světlo) a teplotní kompenzaci.

Spotřeba modulu může dosáhnout až 50 mA během měření, ačkoli intenzitu lze nastavit programově, s režimem nízké spotřeby 0.7 µA během měření.

Cena a kde koupit

Senzory MAX30102 pro měření tepu a kyslíku v krvi jsou docela levné. Tyto moduly mohou být vaše za pouhých pár eur na stránkách jako eBay, Aliexpress nebo Amazon. Uvidíte, že existuje několik typů a my doporučujeme následující:

Zapojení a příklad s Arduinem

Arduino IDE, datové typy, programování

Chcete-li otestovat MAX30102 s Arduino, první věcí je připojit tento modul k desce Arduino. Tento připojení je velmi jednoduché, stačí připojit následující:

  1. Vcc modulu musí být připojen k 5V výstupu desky Arduino.
  2. GND modulu musí být připojeno k zásuvce GND desky Arduino.
  3. SCL modulu musí být připojen k jednomu z analogových vstupů desky Arduino, jako je A5.
  4. SDA modulu musí být připojen k jinému z analogových vstupů desky Arduino, jako je A4.

Jakmile budou navázána příslušná spojení mezi deskou MAX30102 a deskou Arduino, další věcí bude napsat zdrojový kód nebo skicu, aby to fungovalo a začít přijímat biometrická data od dotyčné osoby. Je to stejně snadné jako napsat následující kód Arduino ide a naprogramujte desku:

Abyste ji mohli používat, musíte také nainstalovat knihovnu do IDE Arduino. Knihovna byla vyvinuta společností SparkFun a je k dispozici na adrese 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);
  }
}

Kód si samozřejmě můžete upravit podle svých potřeb, toto je jen příklad...


Buďte první komentář

Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.