MAX30102: modulo cardiofrequenzimetro e ossimetro per Arduino

MAX30102

Durante tutto questo tempo, ne abbiamo mostrati un gran numero Componenti elettronici compatibile con schede come Arduino o compatibili, così come per molti altri lavori creativi o fai-da-te. Ora ti presenteremo il modulo MAX30102, che include un sensore per misurare il polso e l'ossigeno nel sangue.

In questo modo, puoi anche creare oggetti indossabili come braccialetti per attività fai da te o hardware per monitorare lo stato di salute di una persona, fornendo dati biometrici o telemetrici di detta persona grazie all'integrazione del cardiofrequenzimetro e dell'ossimetro in questo dispositivo...

Cos'è un cardiofrequenzimetro? Come funziona?

Un sensore pulsazioni o cardiofrequenzimetro È un dispositivo elettronico utilizzato per misurare la frequenza cardiaca di una persona in tempo reale. Viene utilizzato principalmente in ambito sportivo per monitorare la prestazione e lo sforzo durante l'allenamento o nella quotidianità. I cardiofrequenzimetri sono molto apprezzati dagli atleti, ma sono un dispositivo fondamentale anche nei centri medici per conoscere la frequenza cardiaca, cioè la frequenza cardiaca o i battiti al minuto:

  • PR Bpm: mostra la frequenza cardiaca, cioè i battiti al minuto.

In tutti i casi, il I sensori catturano la variazione del volume del sangue ad ogni battito cardiaco. Questa variazione viene tradotta in un segnale elettrico che viene elaborato per ottenere la frequenza cardiaca. Alcuni cardiofrequenzimetri includono anche circuiti di amplificazione e cancellazione del rumore per migliorare la precisione delle letture.

Cos'è un ossimetro? Come funziona?

Un l'ossimetro è un dispositivo medico o sportivo che viene utilizzato per misurare la saturazione di ossigeno nel sangue. Questo dispositivo offre dati sulla saturazione di ossigeno nel sangue con valori dallo 0 al 100%. È frequente che lo stesso dispositivo includa anche l'opzione della frequenza cardiaca, indicando tutte le informazioni per il monitoraggio o la registrazione.

I dati che misura un ossimetro è:

  • %SPO2: si riferisce alla percentuale di saturazione di ossigeno nel sangue.

L'ossimetro si posiziona come una pinza in modo tale da adattarsi alla morfologia del nostro dito o può essere posizionato anche in altri punti del corpo, come nel caso del cardiofrequenzimetro, come il polso, come può essere visto in molti braccialetti di attività. ,

Per quanto riguarda il loro funzionamento, gli ossimetri emettono in modo diverso lunghezze d'onda della luce che passano attraverso la pelle. Ciò che agisce su questa luce è l'emoglobina, una molecola del sangue responsabile del trasporto dell'ossigeno, che assorbe diverse quantità di luce a seconda del livello di ossigeno che trasporta. Il processo dettagliato è il seguente:

  1. emissione luminosa- L'ossimetro emette due lunghezze d'onda di luce, una rossa e una infrarossa, che passano attraverso il dito posto sul dispositivo.
  2. Assorbimento della luce: L'emoglobina, una molecola dei globuli rossi che trasporta l'ossigeno, assorbe diverse quantità di queste luci. L'emoglobina ricca di ossigeno (ossiemoglobina) e l'emoglobina priva di ossigeno (deossiemoglobina) hanno proprietà diverse di assorbimento della luce.
  3. Rilevamento della luce: Un rilevatore sul lato opposto dell'emettitore di luce raccoglie la luce che è passata attraverso il dito.
  4. Calcolo della saturazione di ossigeno- Il dispositivo calcola il rapporto tra ossiemoglobina e la quantità totale di emoglobina presente, sia ossiemoglobina che deossiemoglobina. Questa proporzione viene presentata come percentuale di saturazione di ossigeno nel sangue (%SpO2). Ciò avviene attraverso un processore in grado di interpretare questi segnali elettrici per tradurli in un valore numerico.

Cos'è il modulo MAX30102?

Il sensore MAX30102, prodotto da Maxim Integrated, è un dispositivo integrato che unisce le funzionalità di un cardiofrequenzimetro e di un ossimetro. Questo sensore può essere facilmente utilizzato con un microcontrollore come Arduino. Il MAX30102 appartiene alla serie MAX3010x di sensori ottici di questa azienda.

Il suo funzionamento si basa sulla variazione dell'assorbimento della luce da parte del sangue, a seconda della sua livello di saturazione dell'ossigeno e polso come ho accennato nei due paragrafi precedenti. Questo sensore è dotato di due LED, uno rosso e uno infrarosso. Viene posizionato sulla pelle, ad esempio sul dito o sul polso, e rileva la luce riflessa per determinare il grado di saturazione di ossigeno.

Viene effettuata la comunicazione con il MAX30102 tramite bus I2C, semplificando la connessione a un microcontrollore come Arduino. Il MAX30102 necessita di una doppia alimentazione: 1.8 V per la logica e 3.3 V per i LED. Tipicamente si trova su moduli da 5 V che includono già la corrispondenza di livello necessaria.

Il MAX30102 è un sensore utilizzato in progetti domestici o sportivi, ovvero potrebbe non avere affidabilità e sensibilità sufficienti per l'uso medico professionale.

La pulsossimetria ottica È un metodo non invasivo per determinare la percentuale di saturazione di ossigeno nel sangue. Come ho detto prima, si basa sulla differenza nei coefficienti di assorbimento della luce dell'emoglobina (Hb) e dell'ossiemoglobina (HbO2) per diverse lunghezze d'onda. Il sangue ricco di ossigeno assorbe più luce infrarossa, mentre il sangue povero di ossigeno assorbe più luce rossa. Nelle zone del corpo in cui la pelle è sufficientemente sottile e sotto sono presenti vasi sanguigni, questa differenza può essere utilizzata per determinare il grado di saturazione di ossigeno.

Caratteristiche del modulo MAX30102 con sensore di pulsazioni e ossigeno nel sangue

Il MAX30102 include:

  • 2x LED, uno rosso (660 nm) e uno a infrarossi (880 nm)
  • 2x fotodiodi per misurare la luce riflessa
  • Convertitore ADC a 18 bit con una frequenza di campionamento da 50 a 3200 campioni al secondo.
  • Inoltre, dispone dell'elettronica necessaria per l'amplificazione e il filtraggio del segnale, la cancellazione della luce ambientale, il rifiuto delle frequenze di 50-60 Hz (luce artificiale) e la compensazione della temperatura.

Consumo del modulo può raggiungere fino a 50mA durante la misurazione, sebbene l'intensità possa essere regolata in modo programmatico, con una modalità a basso consumo di 0.7μA durante le misurazioni.

Prezzo e dove acquistare

I sensori MAX30102 per misurare il polso e l'ossigeno nel sangue sono abbastanza economici. Questi moduli possono essere tuoi per pochi euro su siti come eBay, Aliexpress o Amazon. Vedrai che ne esistono diversi tipi e ti consigliamo quanto segue:

Collegamenti ed esempio con Arduino

Arduino IDE, tipi di dati, programmazione

Per testare il MAX30102 con Arduino, la prima cosa è collegare questo modulo alla scheda Arduino. Questo il collegamento è molto semplice, devi solo collegare quanto segue:

  1. La Vcc del modulo deve essere collegata all'uscita 5V della scheda Arduino.
  2. Il GND del modulo deve essere collegato alla presa GND della scheda Arduino.
  3. SCL del modulo deve essere collegato a uno degli ingressi analogici della scheda Arduino, come A5.
  4. L'SDA del modulo deve essere collegato a un altro degli ingressi analogici della scheda Arduino, come A4.

Una volta stabilite le connessioni appropriate tra la scheda MAX30102 e la scheda Arduino, il passo successivo sarà scrivere un codice sorgente o uno schizzo per farlo funzionare e iniziare a ricevere i dati biometrici della persona in questione. Questo è facile come scrivere il seguente codice Arduino IDE e programmare la scheda:

È inoltre necessario installare una libreria nell'IDE di Arduino per utilizzarla. La libreria è stata sviluppata da SparkFun ed è disponibile su 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);
  }
}

Naturalmente potete modificare il codice in base alle vostre esigenze, questo è solo un esempio...


Puoi essere il primo a lasciare un commento

Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.