MAX30102: pulsmätare och oximetermodul för Arduino

MAX30102

Under hela denna tid har vi visat ett stort antal Elektroniska komponenter kompatibel med brädor som Arduino eller kompatibla, såväl som för många andra tillverkare eller gör-det-själv-jobb. Nu kommer vi att introducera dig till modulen MAX30102, som inkluderar en sensor för att mäta puls och blodsyre.

På så sätt kan du även skapa wearables som egentillverkade aktivitetsarmband eller hårdvara till övervaka hälsotillstånd av en person, tillhandahåller biometriska data eller telemetri för nämnda person tack vare integrationen av pulsmätaren och oximetern i denna enhet...

Vad är en pulsmätare? Hur fungerar det?

Un pulssensor eller pulsmätare Det är en elektronisk enhet som används för att mäta en persons hjärtfrekvens i realtid. Den används främst inom idrottsområdet för att övervaka prestation och ansträngning under träning eller dagligen. Pulsmätare är populära bland idrottare, men de är också en grundläggande enhet på vårdcentraler för att veta pulsen, det vill säga hjärtfrekvensen eller slag per minut:

  • PR Bpm: visar hjärtfrekvensen, det vill säga slag per minut.

I alla fall Sensorer fångar variation i blodvolym med varje hjärtslag. Denna variation översätts till en elektrisk signal som bearbetas för att erhålla hjärtfrekvensen. Vissa pulsmätare inkluderar även förstärknings- och brusreduceringskretsar för att förbättra avläsningarnas noggrannhet.

Vad är en oximeter? Hur fungerar det?

Un oximeter är en medicinsk eller sportutrustning som används för att mäta syremättnaden i blodet. Denna enhet erbjuder blodsyremättnadsdata med värden från 0 till 100 %. Det är vanligt att samma enhet även inkluderar pulsalternativet, vilket anger all information för övervakning eller inspelning.

Uppgifterna som mäter en oximeter är:

  • %SpO2: hänvisar till andelen syremättnad i blodet.

Oximetern är placerad som en klämma på ett sådant sätt att den är anpassad till vårt fingers morfologi eller så kan den också placeras på andra ställen på kroppen, vilket är fallet med pulsmätaren, såsom handleden, som t.ex. kan ses i många aktivitetsarmband. ,

När det gäller deras funktion, avger oximetrar olika ljusvåglängder som passerar genom huden. Det som verkar på detta ljus är hemoglobin, en blodmolekyl som ansvarar för transport av syre, som absorberar olika mängder ljus beroende på nivån av syre det transporterar. Den detaljerade processen är som följer:

  1. ljusemission- Oximetern avger två våglängder av ljus, en röd och en infraröd, som passerar genom fingret som placeras på enheten.
  2. Ljusabsorption: Hemoglobin, en molekyl i röda blodkroppar som transporterar syre, absorberar olika mängder av dessa ljus. Syrefyllt hemoglobin (oxihemoglobin) och syrefritt hemoglobin (deoxihemoglobin) har olika ljusabsorptionsegenskaper.
  3. Ljusdetektering: En detektor på motsatt sida av ljussändaren samlar upp ljuset som passerat genom fingret.
  4. Beräkning av syremättnad- Enheten beräknar förhållandet mellan oxyhemoglobin och den totala mängden hemoglobin som finns, både oxyhemoglobin och deoxyhemoglobin. Denna andel presenteras som procentandelen av blodets syremättnad (%SpO2). Detta görs genom en processor som kan tolka dessa elektriska signaler för att översätta dem till ett numeriskt värde.

Vad är MAX30102-modulen?

Sensorn MAX30102, tillverkad av Maxim Integrated, är en integrerad enhet som kombinerar funktionerna hos en pulsmätare och en oximeter. Denna sensor kan enkelt användas med en mikrokontroller som Arduino. MAX30102 tillhör MAX3010x-serien av optiska sensorer från detta företag.

Dess funktion är baserad på variationen av ljusabsorption av blodet, beroende på dess syremättnadsnivå och puls som jag har nämnt i de två föregående avsnitten. Denna sensor är utrustad med två lysdioder, en röd och en infraröd. Den placeras på huden, till exempel på fingret eller handleden, och detekterar reflekterat ljus för att bestämma graden av syremättnad.

Kommunikation med MAX30102 utförs via I2C-buss, vilket gör det enkelt att ansluta till en mikrokontroller som Arduino. MAX30102 behöver dubbel strömförsörjning: 1.8V för logiken och 3.3V för lysdioderna. Finns vanligtvis på 5V-moduler som redan inkluderar den nödvändiga nivåmatchningen.

MAX30102 är en sensor som används i hem- eller sportprojekt, det vill säga att den kanske inte har tillräcklig tillförlitlighet och känslighet för professionell medicinsk användning.

La optisk pulsoximetri Det är en icke-invasiv metod för att bestämma andelen syremättnad i blodet. Som jag nämnde tidigare så är den baserad på skillnaden i ljusabsorptionskoefficienterna för hemoglobin (Hb) och oxyhemoglobin (HbO2) för olika våglängder. Blod rikt på syre absorberar mer infrarött ljus, medan blod med låg syrehalt absorberar mer rött ljus. I områden på kroppen där huden är tillräckligt tunn och det finns blodkärl under, kan denna skillnad användas för att bestämma graden av syremättnad.

Funktioner hos MAX30102-modulen med puls- och blodsyresensor

MAX30102 inkluderar:

  • 2x lysdioder, en röd (660nm) och en infraröd (880nm)
  • 2x fotodioder för att mäta reflekterat ljus
  • 18-bitars ADC-omvandlare med en samplingshastighet på 50 till 3200 sampel per sekund.
  • Dessutom har den nödvändig elektronik för signalförstärkning och filtrering, avstängning av omgivande ljus, avvisande av frekvenser på 50-60Hz (artificiellt ljus) och temperaturkompensation.

Modulförbrukning kan nå upp till 50mA under mätning, även om intensiteten kan justeras programmatiskt, med ett lågeffektläge på 0.7 µA under mätningar.

Pris och var du kan köpa

MAX30102-sensorerna för att mäta puls och blodsyre de är ganska billiga. Dessa moduler kan vara dina för bara några euro på sajter som eBay, Aliexpress eller Amazon. Du kommer att se att det finns flera typer, och vi rekommenderar följande:

Anslutningar och exempel med Arduino

Arduino IDE, datatyper, programmering

För att testa MAX30102 med Arduino är det första att ansluta denna modul till Arduino-kortet. Detta anslutningen är mycket enkel, du behöver bara ansluta följande:

  1. Modulens Vcc måste anslutas till 5V-utgången på Arduino-kortet.
  2. GND på modulen måste anslutas till GND-uttaget på Arduino-kortet.
  3. SCL på modulen måste anslutas till en av de analoga ingångarna på Arduino-kortet, såsom A5.
  4. SDA för modulen måste anslutas till en annan av de analoga ingångarna på Arduino-kortet, såsom A4.

När lämpliga kopplingar har upprättats mellan MAX30102-kortet och Arduino-kortet, blir nästa sak att skriva en källkod eller skiss för att få det att fungera och börja ta emot biometrisk data från personen i fråga. Detta är lika enkelt som att skriva in följande kod Arduino IDE och programmera styrelsen:

Du måste också installera ett bibliotek i Arduino IDE för att använda det. Biblioteket har utvecklats av SparkFun, och finns 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);
  }
}

Naturligtvis kan du modifiera koden efter dina behov, detta är bara ett exempel...


Bli först att kommentera

Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.