MAX30102 : module cardiofréquencemètre et oxymètre pour Arduino

MAX30102

Pendant tout ce temps, nous avons montré un grand nombre de composants électroniques compatible avec cartes comme Arduino ou compatible, ainsi que pour de nombreux autres travaux de maker ou de bricolage. Nous allons maintenant vous présenter le module MAX30102, qui comprend un capteur pour mesurer le pouls et l’oxygène dans le sang.

De cette façon, vous pouvez également créer des objets portables tels que des bracelets d'activité faits maison ou du matériel pour surveiller l'état de santé d'une personne, fournissant des données biométriques ou télémétrie de ladite personne grâce à l'intégration du moniteur de fréquence cardiaque et de l'oxymètre dans cet appareil...

Qu'est-ce qu'un moniteur de fréquence cardiaque ? Comment ça marche?

Un capteur de pouls ou moniteur de fréquence cardiaque Il s’agit d’un appareil électronique permettant de mesurer la fréquence cardiaque d’une personne en temps réel. Il est principalement utilisé dans le domaine sportif pour suivre les performances et les efforts lors des entraînements ou au quotidien. Les moniteurs de fréquence cardiaque sont populaires parmi les athlètes, mais ils constituent également un appareil fondamental dans les centres médicaux pour connaître la fréquence cardiaque, c'est-à-dire la fréquence cardiaque ou les battements par minute :

  • RP Bpm: affiche la fréquence cardiaque, c'est-à-dire les battements par minute.

Dans tous les cas, le Les capteurs capturent la variation du volume sanguin à chaque battement cardiaque. Cette variation se traduit par un signal électrique qui est traité pour obtenir la fréquence cardiaque. Certains moniteurs de fréquence cardiaque comprennent également des circuits d'amplification et d'annulation du bruit pour améliorer la précision des lectures.

Qu'est-ce qu'un oxymètre ? Comment ça marche?

Un l'oxymètre est un appareil médical ou sportif qui est utilisé pour mesurer la saturation en oxygène dans le sang. Cet appareil propose des données de saturation en oxygène du sang avec des valeurs de 0 à 100 %. Il est courant que le même appareil inclut également l'option de fréquence cardiaque, indiquant toutes les informations à surveiller ou à enregistrer.

Les données qui mesure un oxymètre est la suivante:

  • %SpO2: désigne le pourcentage de saturation en oxygène dans le sang.

L'oxymètre est placé comme une pince de manière à s'adapter à la morphologie de notre doigt ou il peut également être placé à d'autres endroits du corps, comme c'est le cas du moniteur de fréquence cardiaque, comme le poignet, comme peut être vu dans de nombreux bracelets d'activité. ,

Concernant leur fonctionnement, les oxymètres émettent différents longueurs d'onde de la lumière qui traversent la peau. Ce qui agit sur cette lumière, c'est l'hémoglobine, une molécule sanguine responsable du transport de l'oxygène, absorbant différentes quantités de lumière en fonction du niveau d'oxygène qu'elle transporte. Le processus détaillé est le suivant :

  1. émission de lumière- L'oxymètre émet deux longueurs d'onde de lumière, une rouge et une infrarouge, qui traversent le doigt placé sur l'appareil.
  2. Absorption de la lumière: L'hémoglobine, une molécule des globules rouges qui transporte l'oxygène, absorbe différentes quantités de ces lumières. L'hémoglobine chargée en oxygène (oxyhémoglobine) et l'hémoglobine sans oxygène (désoxyhémoglobine) ont des propriétés d'absorption de la lumière différentes.
  3. Détection de lumière: Un détecteur situé du côté opposé de l'émetteur de lumière collecte la lumière qui a traversé le doigt.
  4. Calcul de la saturation en oxygène- L'appareil calcule le rapport entre l'oxyhémoglobine et la quantité totale d'hémoglobine présente, à la fois l'oxyhémoglobine et la désoxyhémoglobine. Cette proportion est présentée comme le pourcentage de saturation en oxygène du sang (%SpO2). Cela se fait grâce à un processeur capable d'interpréter ces signaux électriques pour les traduire en valeur numérique.

Qu'est-ce que le module MAX30102 ?

Le capteur MAX30102, produit par Maxim Integrated, est un appareil intégré qui combine les fonctionnalités d'un moniteur de fréquence cardiaque et d'un oxymètre. Ce capteur peut facilement être utilisé avec un microcontrôleur tel qu'Arduino. Le MAX30102 appartient à la série MAX3010x de capteurs optiques de cette société.

Son fonctionnement repose sur la variation de l'absorption de la lumière par le sang, en fonction de son niveau de saturation en oxygène et pouls comme je l'ai mentionné dans les deux sections précédentes. Ce capteur est équipé de deux LED, une rouge et une infrarouge. Il est placé sur la peau, par exemple sur le doigt ou le poignet, et détecte la lumière réfléchie pour déterminer le degré de saturation en oxygène.

La communication avec le MAX30102 s'effectue via le bus I2C, facilitant la connexion à un microcontrôleur tel qu'Arduino. Le MAX30102 a besoin d'une double alimentation : 1.8 V pour la logique et 3.3 V pour les LED. Généralement trouvé sur les modules 5V qui incluent déjà la correspondance de niveau nécessaire.

Le MAX30102 est un capteur utilisé dans des projets domestiques ou sportifs, c'est-à-dire qu'il peut ne pas avoir une fiabilité et une sensibilité suffisantes pour un usage médical professionnel.

La oxymétrie de pouls optique C'est une méthode non invasive pour déterminer le pourcentage de saturation en oxygène dans le sang. Comme je l'ai mentionné précédemment, cela est basé sur la différence des coefficients d'absorption lumineuse de l'hémoglobine (Hb) et de l'oxyhémoglobine (HbO2) pour différentes longueurs d'onde. Le sang riche en oxygène absorbe davantage de lumière infrarouge, tandis que le sang pauvre en oxygène absorbe davantage de lumière rouge. Dans les zones du corps où la peau est suffisamment fine et où se trouvent des vaisseaux sanguins en dessous, cette différence peut être utilisée pour déterminer le degré de saturation en oxygène.

Caractéristiques du module MAX30102 avec capteur de pouls et d'oxygène dans le sang

Le MAX30102 comprend :

  • 2x LED, une rouge (660 nm) et une infrarouge (880 nm)
  • 2x photodiodes pour mesurer la lumière réfléchie
  • Convertisseur ADC 18 bits avec un taux d'échantillonnage de 50 à 3200 XNUMX échantillons par seconde.
  • De plus, il dispose de l'électronique nécessaire pour l'amplification et le filtrage du signal, l'annulation de la lumière ambiante, le rejet des fréquences de 50-60 Hz (lumière artificielle) et la compensation de température.

Consommation des modules peut atteindre jusqu'à 50 mA pendant la mesure, bien que l'intensité puisse être ajustée par programme, avec un mode faible consommation de 0.7 µA pendant les mesures.

Prix ​​et où acheter

Les capteurs MAX30102 pour mesurer le pouls et l'oxygène dans le sang ils sont assez bon marché. Ces modules peuvent être à vous pour quelques euros seulement sur des sites comme eBay, Aliexpress ou Amazon. Vous verrez qu’il en existe plusieurs types, et nous recommandons les suivants :

Connexions et exemple avec Arduino

Arduino IDE, types de données, programmation

Pour tester le MAX30102 avec Arduino, la première chose est de connecter ce module à la carte Arduino. Ce la connexion est très simple, il vous suffit de connecter les éléments suivants :

  1. Le Vcc du module doit être connecté à la sortie 5V de la carte Arduino.
  2. Le GND du module doit être connecté à la prise GND de la carte Arduino.
  3. Le SCL du module doit être connecté à l'une des entrées analogiques de la carte Arduino, telle que A5.
  4. Le SDA du module doit être connecté à une autre des entrées analogiques de la carte Arduino, telle que A4.

Une fois les connexions appropriées établies entre la carte MAX30102 et la carte Arduino, la prochaine étape sera d'écrire un code source ou un croquis pour le faire fonctionner et commencer à recevoir des données biométriques de la personne en question. C'est aussi simple que d'écrire le code suivant dans IDE Arduino et programmez la carte :

Vous devez également installer une bibliothèque dans l'IDE Arduino pour l'utiliser. La bibliothèque a été développée par SparkFun et est disponible sur 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);
  }
}

Bien entendu, vous pouvez modifier le code selon vos besoins, ce n'est qu'un exemple...


Soyez le premier à commenter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.