MAX30102: pulsmåler og oximetermodul til Arduino

MAX30102

I al denne tid har vi vist et stort antal af Elektroniske komponenter kompatibel med boards som Arduino eller kompatible, såvel som til mange andre maker- eller gør-det-selv-job. Nu vil vi introducere dig til modulet MAX30102, som inkluderer en sensor til at måle puls og blodilt.

På den måde kan du også skabe wearables såsom selvfremstillede aktivitetsarmbånd eller hardware til overvåge helbredstilstand af en person, der leverer biometriske data eller telemetri af denne person takket være integrationen af ​​pulsmåleren og oximeteret i denne enhed...

Hvad er en pulsmåler? Hvordan virker det?

Un pulssensor eller pulsmåler Det er en elektronisk enhed, der bruges til at måle en persons puls i realtid. Det bruges hovedsageligt på sportsområdet til at overvåge ydeevne og indsats under træning eller på daglig basis. Pulsmålere er populære blandt atleter, men de er også en grundlæggende enhed i medicinske centre til at kende pulsen, det vil sige pulsen eller slag i minuttet:

  • PR Bpm: viser hjertefrekvensen, det vil sige slag i minuttet.

I alle tilfælde Sensorer fanger variation i blodvolumen med hvert hjerteslag. Denne variation omsættes til et elektrisk signal, der behandles for at opnå hjertefrekvensen. Nogle pulsmålere inkluderer også forstærknings- og støjreduktionskredsløb for at forbedre nøjagtigheden af ​​aflæsningerne.

Hvad er et oximeter? Hvordan virker det?

Un oximeter er et medicinsk eller sportsudstyr som bruges til at måle iltmætning i blodet. Denne enhed tilbyder blodiltmætningsdata med værdier fra 0 til 100%. Det er almindeligt, at den samme enhed også inkluderer pulsindstillingen, der angiver alle oplysninger til overvågning eller optagelse.

De data, der måler et oximeter Det er:

  • %SpO2: refererer til procentdelen af ​​iltmætning i blodet.

Oximeteret er placeret som en klemme på en sådan måde, at det er tilpasset morfologien af ​​vores finger eller det kan også placeres andre steder på kroppen, som det er tilfældet med pulsmåleren, såsom håndleddet, som f.eks. kan ses i mange aktivitetsarmbånd. ,

Med hensyn til deres drift udsender oximetre forskelligt lys bølgelængder der passerer gennem huden. Det, der virker på dette lys, er hæmoglobin, et blodmolekyle, der er ansvarlig for at transportere ilt, der absorberer forskellige mængder lys afhængigt af niveauet af ilt, det transporterer. Den detaljerede proces er som følger:

  1. lysemission- Oximeteret udsender to bølgelængder af lys, en rød og en infrarød, som passerer gennem fingeren placeret på enheden.
  2. Lysabsorption: Hæmoglobin, et molekyle i røde blodlegemer, der transporterer ilt, absorberer forskellige mængder af disse lys. Iltfyldt hæmoglobin (oxyhæmoglobin) og iltfri hæmoglobin (deoxyhæmoglobin) har forskellige lysabsorberende egenskaber.
  3. lysdetektion: En detektor på den modsatte side af lysgiveren opsamler det lys, der er gået gennem fingeren.
  4. Beregning af iltmætning- Enheden beregner forholdet mellem oxyhæmoglobin og den samlede mængde hæmoglobin, der er til stede, både oxyhæmoglobin og deoxyhæmoglobin. Denne andel vises som procentdelen af ​​blodets iltmætning (%SpO2). Dette gøres gennem en processor, der er i stand til at fortolke disse elektriske signaler for at oversætte dem til en numerisk værdi.

Hvad er MAX30102-modulet?

Sensoren MAX30102, produceret af Maxim Integrated, er en integreret enhed, der kombinerer funktionerne fra en pulsmåler og et oximeter. Denne sensor kan nemt bruges med en mikrocontroller såsom Arduino. MAX30102 tilhører MAX3010x-serien af ​​optiske sensorer fra dette firma.

Dens funktion er baseret på variationen af ​​lysabsorption af blodet, afhængigt af dets iltmætningsniveau og puls som jeg har nævnt i de to foregående afsnit. Denne sensor er udstyret med to LED'er, en rød og en infrarød. Den placeres på huden, såsom på fingeren eller håndleddet, og registrerer reflekteret lys for at bestemme graden af ​​iltmætning.

Kommunikation med MAX30102 udføres via I2C bus, hvilket gør det nemt at forbinde til en mikrocontroller såsom Arduino. MAX30102 har brug for en dobbelt strømforsyning: 1.8V til logikken og 3.3V til LED'erne. Findes typisk på 5V-moduler, der allerede indeholder den nødvendige niveautilpasning.

MAX30102 er en sensor, der bruges i hjemme- eller sportsprojekter, det vil sige, at den muligvis ikke har tilstrækkelig pålidelighed og følsomhed til professionel medicinsk brug.

La optisk pulsoximetri Det er en ikke-invasiv metode til at bestemme procentdelen af ​​iltmætning i blodet. Som jeg nævnte før, er det baseret på forskellen i lysabsorptionskoefficienterne for hæmoglobin (Hb) og oxyhæmoglobin (HbO2) for forskellige bølgelængder. Blod rig på ilt absorberer mere infrarødt lys, mens blod med lavt iltindhold absorberer mere rødt lys. I områder af kroppen, hvor huden er tynd nok, og der er blodkar nedenunder, kan denne forskel bruges til at bestemme graden af ​​iltmætning.

Funktioner i MAX30102-modulet med puls- og blodiltsensor

MAX30102 inkluderer:

  • 2x LED'er, en rød (660nm) og en infrarød (880nm)
  • 2x fotodioder til at måle reflekteret lys
  • 18-bit ADC-konverter med en samplinghastighed på 50 til 3200 samples pr. sekund.
  • Derudover har den den nødvendige elektronik til signalforstærkning og -filtrering, annullering af omgivende lys, afvisning af frekvenser på 50-60Hz (kunstigt lys) og temperaturkompensation.

Modulforbrug kan nå op til 50mA under måling, selvom intensiteten kan justeres programmæssigt, med en laveffekttilstand på 0.7µA under målinger.

Pris og hvor man kan købe

MAX30102-sensorerne til måling af puls og blodilt de er ret billige. Disse moduler kan være dine for blot et par euro på websteder som eBay, Aliexpress eller Amazon. Du vil se, at der er flere typer, og vi anbefaler følgende:

Forbindelser og eksempel med Arduino

Arduino IDE, datatyper, programmering

For at teste MAX30102 med Arduino er den første ting at forbinde dette modul til Arduino-kortet. Det her forbindelsen er meget enkel, du skal blot tilslutte følgende:

  1. Vcc på modulet skal forbindes til 5V-udgangen på Arduino-kortet.
  2. GND på modulet skal forbindes til GND-stikket på Arduino-kortet.
  3. SCL på modulet skal forbindes til en af ​​de analoge indgange på Arduino-kortet, såsom A5.
  4. SDA for modulet skal forbindes til en anden af ​​de analoge indgange på Arduino-kortet, såsom A4.

Når de passende forbindelser er etableret mellem MAX30102-kortet og Arduino-kortet, vil den næste ting være at skrive en kildekode eller skitse for at få det til at fungere og begynde at modtage biometriske data fra den pågældende person. Dette er lige så nemt som at skrive følgende kode ind Arduino IDE og programmer bestyrelsen:

Du skal også installere et bibliotek i Arduino IDE for at bruge det. Biblioteket er udviklet af SparkFun, og er tilgængeligt på 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);
  }
}

Selvfølgelig kan du ændre koden efter dine behov, dette er blot et eksempel...


Vær den første til at kommentere

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.