ESP32 MAX30102 : Oxymètre de pouls et fréquence cardiaque (Arduino)

ESP32 MAX30102 : Oxymètre de pouls et fréquence cardiaque (Arduino)

Ce tutoriel est un guide de démarrage pour interfacer l’oxymètre de pouls et le capteur de fréquence cardiaque MAX30102 avec l’ESP32 programmé avec l’IDE Arduino. Ce capteur peut mesurer la fréquence cardiaque, la saturation en oxygène du sang (SpO2) et la température corporelle. Il communique en utilisant le protocole de communication I2C.

Nous expliquerons comment câbler le capteur et fournirons des exemples de code pour obtenir la fréquence cardiaque, la saturation en oxygène et la température corporelle.

ESP32 avec MAX30102 : oxymètre de pouls et capteur de fréquence cardiaque

Table des matières

Dans ce guide, nous aborderons les sujets suivants :

Présentation de l’oxymètre de pouls et du capteur de fréquence cardiaque MAX30102

Ce module comprend le MAX30102 IC, qui est un capteur optique capable de mesurer la saturation en oxygène du sang (SpO2) et la fréquence cardiaque de manière non invasive. Il comprend également un capteur de température utilisé pour la compensation et l’étalonnage de la température.

Capteur de fréquence cardiaque MAX30102, oxymètre de pouls, pièce SpO2

Le MAX30102 possède une LED rouge, une LED infrarouge et un photodétecteur. Les LED émettent de la lumière dans la peau et le photodétecteur mesure la lumière réfléchie. La quantité de lumière réfléchie change avec le flux sanguin et les battements du cœur. En traitant ces changements, nous pouvons calculer la fréquence cardiaque et la SpO2.

Comment fonctionne le MAX30102 ?

Voici comment fonctionne le capteur pour obtenir des mesures de SpO2 et de fréquence cardiaque.

Capteur MAX30102 comment ça marche HR et SpO2

1) Émission de lumière : les LED rouges et infrarouges émettent de la lumière dans les tissus corporels. Chaque LED fonctionne à une longueur d’onde différente.

2) Détection de la lumière réfléchie : la lumière émise pénètre dans les tissus corporels et une partie est réfléchie. La quantité de lumière réfléchie dépend du volume sanguin et du niveau d’oxygénation. Le photodétecteur du capteur mesure la lumière réfléchie.

3) Modifications de l’intensité lumineuse : en mesurant les variations de l’intensité lumineuse réfléchie aux deux longueurs d’onde, rouge et infrarouge, le capteur peut différencier l’hémoglobine oxygénée et désoxygénée. Ces mesures peuvent ensuite être utilisées pour calculer la fréquence cardiaque et la SpO2.

  • Hémoglobine oxygénée : absorbe davantage de lumière infrarouge
  • Hémoglobine désoxygénée : absorbe davantage de lumière rouge

Sur la base du rapport des intensités de lumière réfléchie aux longueurs d’onde rouge et infrarouge, le capteur peut calculer la SpO2. Les modifications du volume sanguin à chaque battement cardiaque nous permettent de mesurer la fréquence cardiaque (BPM).

Où acheter ?

Vous pouvez consulter notre page Maker Advisor Tools pour comparer le prix du module MAX30102 dans différents magasins.

Câblage du capteur MAX30102 à l’ESP32

Le capteur MAX30102 communique à l’aide du protocole de communication I2C. Nous utiliserons les broches I2C par défaut de l’ESP32 pour câbler le capteur.

Cartes ESP32 SDA – GPIO 21 SCL-GPIO 22
Cartes ESP32S3 SDA-GPIO 8 SCL-GPIO 9

Le module capteur peut être alimenté via la broche VIN en utilisant 5V ou 3V3.

Câblez le capteur à l’ESP32 comme indiqué dans le schéma suivant (ajustez en fonction de votre modèle de carte ESP32 spécifique).

ESP32 avec oxymètre MAX30102 et capteur de fréquence cardiaque - schéma de câblage

En savoir plus sur le brochage de l’ESP32 :

Préparation de l’IDE Arduino

Nous allons programmer la carte ESP32 à l’aide de l’IDE Arduino. Assurez-vous donc que le module complémentaire ESP32 est installé. Suivez le tutoriel suivant :

Si vous préférez utiliser VSCode + PlatformIO, suivez plutôt le tutoriel suivant :

Installation de la bibliothèque SparkFun MAX3010x

Il existe plusieurs bibliothèques que vous pouvez utiliser pour interfacer le module de capteur MAX30102 avec l’ESP32. Nous utiliserons la bibliothèque SparkFun MAX3010X qui fonctionne bien pour ce capteur et est facile à utiliser.

Ouvrez le gestionnaire de bibliothèque Arduino IDE, recherchez SparkFun MAX3010x et installez la bibliothèque par SparkFun.

Installer la bibliothèque de capteurs de fréquence cardiaque Sparkfun Arduino IDE

1) ESP32 avec MAX30102 : Obtenez la fréquence cardiaque – Code

Le code suivant montre comment obtenir la fréquence cardiaque du capteur MAX30102 avec l’ESP32. Il obtient la fréquence cardiaque et affiche les résultats sur le moniteur série.

/*
  Rui Santos & Sara Santos - Raspberryme.com
  Complete project details at https://Raspberryme.com/esp32-max30102-oximeter-heart-rate-sensor/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include 
#include "MAX30105.h"
#include "heartRate.h"

MAX30105 sensor;

// Settings
const byte RATE_SIZE = 5;   // How many beats we average
byte rates[RATE_SIZE];      // Store last few valid BPM values
byte rateSpot = 0;
byte validBeats = 0;
long lastBeat = 0;
float currentBPM = 0;
int averageBPM = 0;

unsigned long lastPrint = 0;

// Only accept realistic heart rates (adjust for your case)
const float MIN_BPM = 45;
const float MAX_BPM = 180;

void setup() {
  Serial.begin(115200);
  Serial.println("MAX30102 Heart Rate Sensor");
  Serial.println();
  Serial.println("Place your finger on the sensor...");
  Serial.println();

  // Initialize the sensor
  if (!sensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("Error initializing the sensor...");
    while (1);
  }

  sensor.setup();                    // Use default settings
  sensor.setPulseAmplitudeRed(0);    // Turn off red LED
}

void loop() {
  long irValue = sensor.getIR();      // Read infrared value

  // Check if a heartbeat was detected
  if (checkForBeat(irValue)) {
    long timeBetweenBeats = millis() - lastBeat;
    lastBeat = millis();

    currentBPM = 60.0 / (timeBetweenBeats / 1000.0);

    // Only keep realistic values
    if (currentBPM >= MIN_BPM && currentBPM <= MAX_BPM) {
      rates[rateSpot] = (byte)currentBPM;
      rateSpot++;
      if (rateSpot >= RATE_SIZE){
        rateSpot = 0;
      }
      // Count valid beats (until buffer is full)
      if (validBeats < RATE_SIZE) {
        validBeats++;
      }
      
      // Only calculate average when buffer is full
      if (validBeats >= RATE_SIZE) {
        // Calculate the average
        averageBPM = 0;
        for (byte i = 0; i < RATE_SIZE; i++) {
          averageBPM += rates[i];
        }
        averageBPM /= RATE_SIZE;
      }
    }
  }

  // Print once every second
  if (millis() - lastPrint >= 1000) {
    lastPrint = millis();

    if (irValue < 50000) {
      // No finger on the sensor
      Serial.println("Waiting for finger...");
    }
    else if (averageBPM == 0) {
      // Finger is present but not enough valid beats yet
      Serial.println("Measuring... keep your finger still");
    }
    else {
      // We have a valid average
      Serial.print("Heart Rate: ");
      Serial.print(averageBPM);
      Serial.println(" BPM");
    }
  }
}

Afficher le code brut

Comment le MAX30102 obtient-il la fréquence cardiaque ?

Le capteur est livré avec deux LED : une LED infrarouge et une LED rouge.

Capteur de fréquence cardiaque MAX30102, oxymètre de pouls, composant SpO2

Ces LED émettent de la lumière qui traverse le bout de votre doigt. Le sang qui coule absorbe la lumière. Lorsque le cœur bat, davantage de sang est poussé dans les vaisseaux de votre doigt et davantage de lumière est absorbée.

Pour détecter la fréquence cardiaque, nous prenons en compte la quantité de lumière infrarouge réfléchie. Le capteur dispose d’un photodétecteur pour mesurer que :

  • Battement cardiaque : plus de sang signifie que plus de lumière infrarouge est absorbée, donc moins de lumière atteint le photodétecteur.
  • Entre les battements cardiaques : moins de sang signifie moins de lumière infrarouge absorbée, donc plus de lumière atteint le photodétecteur

Les changements d’intensité lumineuse créent une forme d’onde. En mesurant le temps entre ses pics, vous pouvez calculer la fréquence cardiaque.

En tenant compte de cela, il est désormais facile de comprendre le fonctionnement du code.

Comment fonctionne le code ?

Jetons un coup d’œil rapide au fonctionnement du code.

Bibliothèques

Tout d’abord, incluez les bibliothèques requises :

#include 
#include "MAX30105.h"
#include "heartRate.h"

Objet capteur

Créez un objet MAX30105 appelé capteur.

MAX30105 sensor;

Variables globales

Nous avons besoin de quelques variables globales pour stocker plusieurs lectures de fréquence cardiaque dans un tableau et calculer le BPM moyen.

const byte RATE_SIZE = 5;  
byte rates[RATE_SIZE]; 
byte rateSpot = 0;
byte validBeats = 0;
long lastBeat = 0;
float currentBPM = 0;
int averageBPM = 0;

unsigned long lastPrint = 0;

Le RATE_SIZE définit le nombre de lectures que nous rassemblerons pour calculer le BPM moyen. Vous pouvez augmenter cette valeur pour des résultats plus stables. La variable rate crée un tableau avec 5 valeurs (RATE_SIZE).

Le rateSpot sera utilisé pour indiquer la position actuelle dans le tableau des taux. Le validBeat compte combien de battements valides ont été collectés jusqu’à présent. Il augmente jusqu’à atteindre RATE_SIZE (5).

Le lastBeat stocke l’heure du dernier battement valide ; le currentBPM stocke la valeur actuelle du BPM ; et le BPM moyen stocke la moyenne de toutes les valeurs stockées dans le tableau des taux.

Pour nous assurer que nous ne prenons en compte que les lectures valides, nous excluons les valeurs de rythme cardiaque trop faibles ou trop élevées, qui peuvent être causées par un mauvais placement du doigt sur le capteur. Vous pouvez ajuster ces valeurs pour votre scénario ou ne pas les inclure du tout.

const float MIN_BPM = 45;
const float MAX_BPM = 180;

installation()

Dans setup(), nous initialisons le moniteur série à un débit en bauds de 115 200 et initialisons le capteur.

void setup() {
  Serial.begin(115200);
  Serial.println("MAX30102 Heart Rate Sensor");
  Serial.println();
  Serial.println("Place your finger on the sensor...");
  Serial.println();

  // Initialize the sensor
  if (!sensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("Error initializing the sensor...");
    while (1);
  }

Pour mesurer la fréquence cardiaque, l’algorithme utilise uniquement la lumière LED infrarouge. Nous désactivons donc le rouge et laissons tous les autres paramètres par défaut.

sensor.setup(); 
sensor.setPulseAmplitudeRed(0);

boucle()

Dans la boucle(), on commence par obtenir une valeur infrarouge (la lumière infrarouge qui a été réfléchie et lue par le photodétecteur).

long irValue = sensor.getIR(); 

Ensuite, la fonction checkForBeat() détecte si un battement de coeur vient de se produire, en fonction du signal infrarouge. Si nous avons un battement de cœur, nous calculons le temps écoulé depuis le dernier battement et, en fonction du temps écoulé entre les battements, nous pouvons estimer le battement de cœur (BPM – battements par minute).

// Check if a heartbeat was detected
if (checkForBeat(irValue)) {
  long timeBetweenBeats = millis() - lastBeat;
  lastBeat = millis();

  currentBPM = 60.0 / (timeBetweenBeats / 1000.0);

On va un peu plus loin, et on ne sauvegarde une valeur de BPM que si elle se situe dans la plage que nous avons définie précédemment. Si tel est le cas, nous l’ajoutons à un endroit de notre tableau de tarifs.

// Only keep realistic values
if (currentBPM >= MIN_BPM && currentBPM <= MAX_BPM) {
  rates[rateSpot] = (byte)currentBPM;
  rateSpot++;
  if (rateSpot >= RATE_SIZE){
    rateSpot = 0;
  }

Une fois le tableau des taux plein, nous calculons la fréquence cardiaque moyenne en fonction des 5 dernières lectures (RATE_SIZE)

// Count valid beats (until buffer is full)
if (validBeats < RATE_SIZE) {
  validBeats++;
}
      
// Only calculate average when buffer is full
if (validBeats >= RATE_SIZE) {
  // Calculate the average
  averageBPM = 0;
  for (byte i = 0; i < RATE_SIZE; i++) {
    averageBPM += rates[i];
  }
  averageBPM /= RATE_SIZE;
}

Toujours dans la boucle(), nous pouvons avoir l’un des scénarios suivants.

Si l’irValue est inférieure à 50 000, cela signifie qu’il n’y a pas de doigt sur le capteur. Nous imprimons un message sur le moniteur série.

if (irValue < 50000) {
  // No finger on the sensor
  Serial.println("Waiting for finger...");
}

Si le BPM moyen actuel est de 0, cela signifie que nous n’avons pas suffisamment de lectures dans le tableau. L’utilisateur doit garder le doigt sur le capteur pour obtenir des lectures valides.

else if (averageBPM == 0) {
  // Finger is present but not enough valid beats yet
  Serial.println("Measuring... keep your finger still");
}

Si aucun des scénarios précédents ne se produit, cela signifie que nous disposons d’une valeur de fréquence cardiaque valide et que nous imprimons les résultats dans le moniteur série.

else {
  // We have a valid average
  Serial.print("Heart Rate: ");
  Serial.print(averageBPM);
  Serial.println(" BPM");
}

Démonstration

Téléchargez le code sur votre carte ESP32. Après le téléchargement, ouvrez le moniteur série à un débit en bauds de 115 200.

Placez votre doigt sur le capteur. Pour des résultats meilleurs et plus précis, le doigt doit rester immobile avec une pression constante. Vous pouvez fixer le capteur à votre doigt à l’aide d’un élastique.

Démonstration de capteur de fréquence cardiaque d'oxymètre de pouls ESP32 MAX30102 Arduino IDE

Les valeurs BPM seront imprimées dans le moniteur série.

ESP32 Obtenez la fréquence cardiaque BPM avec l'IDE Arduino MAX30102

2) ESP32 avec MAX30102 : Obtenez la saturation en oxygène (SpO2) – Code

Le code suivant montre comment obtenir la saturation en oxygène du sang du capteur MAX30102 avec l’ESP32. Les résultats sont imprimés dans le moniteur série.

/*
  Rui Santos & Sara Santos - Raspberryme.com
  Complete project details at https://Raspberryme.com/esp32-max30102-oximeter-heart-rate-sensor/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include 
#include "MAX30105.h"
#include "spo2_algorithm.h"

MAX30105 sensor;

// Buffers needed by the algorithm
#define BUFFER_SIZE 100
uint32_t irBuffer[BUFFER_SIZE];
uint32_t redBuffer[BUFFER_SIZE];

int32_t spo2;          // Oxygen saturation value
int8_t  validSPO2;     // 1 = valid reading, 0 = not valid yet
int32_t heartRate;     // Not used, but required by the function
int8_t  validHeartRate;

void setup() {
  Serial.begin(115200);
  Serial.println("MAX30102 Oxygen Saturation");
  Serial.println();
  Serial.println("Place your finger on the sensor...");
  Serial.println();

  // Initialize the sensor
  if (!sensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("Error initializing the sensor...");
    while (1);
  }

  byte ledBrightness = 60;  // 0=Off to 255=50mA
  byte sampleAverage = 4;   // 1, 2, 4, 8, 16, 32
  byte ledMode = 2;         // 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
  byte sampleRate = 100;    // 50, 100, 200, 400, 800, 1000, 1600, 3200
  int pulseWidth = 411;     // 69, 118, 215, 411
  int adcRange = 4096;      // 2048, 4096, 8192, 16384

  // Configure sensor with these settings
  sensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);
}

void loop() {
  // Collect 100 samples (takes a few seconds)
  for (byte i = 0; i < BUFFER_SIZE; i++) {
    while (sensor.available() == false) {
      sensor.check();
    }

    redBuffer[i] = sensor.getRed();
    irBuffer[i]  = sensor.getIR();
    sensor.nextSample();
  }

  // Calculate SpO2
  maxim_heart_rate_and_oxygen_saturation(irBuffer, BUFFER_SIZE, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);

  // Display oxygen saturation
  if (validSPO2) {
    Serial.print("Oxygen Saturation: ");
    Serial.print(spo2);
    Serial.println(" %");
  } else {
    Serial.println("Measuring... keep your finger still");
  }

  Serial.println();
}

Afficher le code brut

Comment le MAX30102 obtient-il la SpO2 ?

Comme nous l’avons vu précédemment, le MAX30102 est livré avec une LED rouge et une LED infrarouge.

Ces LED émettent une lumière qui traverse le bout de vos doigts. Une partie de la lumière est absorbée et une autre est réfléchie. La lumière réfléchie est mesurée par le photodétecteur présent sur le module.

A partir des variations de l’intensité lumineuse réfléchie (rouge et infrarouge), on peut calculer la SpO2.

  • Hémoglobine oxygénée : absorbe davantage de lumière infrarouge
  • Hémoglobine désoxygénée : absorbe davantage de lumière rouge

Sur la base du rapport des intensités de lumière réfléchie aux longueurs d’onde rouge et infrarouge, le capteur peut calculer la SpO2.

Comment fonctionne le code ?

Jetons un coup d’œil rapide au fonctionnement du code.

Bibliothèques

Tout d’abord, incluez les bibliothèques requises :

#include 
#include "MAX30105.h"
#include "heartRate.h"

Objet capteur

Créez un objet MAX30105 appelé capteur.

MAX30105 sensor;

Variables globales

Nous créons quelques variables globales qui sont utilisées dans tout le code. Nous avons besoin d’un tampon de 100 lectures infrarouges et rouges pour que l’algorithme calcule la SpO2. Les variables liées à la fréquence cardiaque sont également nécessaires à l’algorithme de la bibliothèque pour calculer la SpO2.

// Buffers needed by the algorithm
#define BUFFER_SIZE 100
uint32_t irBuffer[BUFFER_SIZE];
uint32_t redBuffer[BUFFER_SIZE];

int32_t spo2;             // Oxygen saturation value
int8_t  validSPO2;     // 1 = valid reading, 0 = not valid yet
int32_t heartRate;     // Not used, but required by the function
int8_t  validHeartRate;

installation()

Dans le setup(), initialisez le moniteur série et le capteur.

void setup() {
  Serial.begin(115200);
  Serial.println("MAX30102 Oxygen Saturation");
  Serial.println();
  Serial.println("Place your finger on the sensor...");
  Serial.println();

  // Initialize the sensor
  if (!sensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("Error initializing the sensor...");
    while (1);
  }

Nous configurons le capteur avec les paramètres recommandés pour les mesures SpO2.

byte ledBrightness = 60;
byte sampleAverage = 4;
byte ledMode = 2;
byte sampleRate = 100;
int pulseWidth = 411;
int adcRange = 4096;

sensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);

Le tableau suivant montre ce qu’est chaque paramètre et quelles valeurs ils peuvent avoir.

Paramètre Valeur Signification Possibilités
LEDLuminosité 60 Luminosité des LED 0 à 255
échantillonMoyenne 4 nombre d’échantillons moyennés par le capteur 1, 2, 4, 8, 16, 32
Mode LED 2 quelles LED sont actives 1 – uniquement LED rouge
2 – LED rouge et infrarouge
3 – LED rouges, infrarouges et vertes (pour les autres capteurs MAX3010x)
taux d’échantillonnage 100 taux d’échantillonnage (échantillons par seconde) 50, 100, 200, 400, 800, 1 000, 16 200, 3 200
largeur d’impulsion 411 Largeur d’impulsion LED (en ms) 69, 118, 215, 411
plageadc 4096 Plage ADC (sensibilité) 2048, 4096, 8192, 16384

boucle()

Dans la boucle(), nous obtenons 100 échantillons de lumière infrarouge et rouge réfléchie et les enregistrons dans les variables redBuffer et irBuffer.

// Collect 100 samples (takes a few seconds)
for (byte i = 0; i < BUFFER_SIZE; i++) {
  while (sensor.available() == false) {
    sensor.check();
  }

  redBuffer[i] = sensor.getRed();
  irBuffer[i]  = sensor.getIR();
  sensor.nextSample();
}

Enfin, nous appelons la fonction maxim_heart_rate_and_oxygen_saturation() avec les paramètres suivants pour obtenir la valeur de SpO2.

maxim_heart_rate_and_oxygen_saturation(irBuffer, BUFFER_SIZE, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);

La valeur de saturation en oxygène est enregistrée dans la variable spo2 et validSPO2 nous indique si nous avons une lecture valide. Nous imprimons les résultats sur le Serial Monitor.

// Display oxygen saturation
if (validSPO2) {
  Serial.print("Oxygen Saturation: ");
  Serial.print(spo2);
  Serial.println(" %");
} else {
  Serial.println("Measuring... keep your finger still");
}

Serial.println();

Démonstration

Téléchargez le code sur votre carte ESP32. Après le téléchargement, ouvrez le moniteur série à un débit en bauds de 115 200.

Placez votre doigt sur le capteur. Attendez quelques secondes jusqu’à ce que vous ayez des lectures SpO2 valides.

ESP32 Obtenez la SpO2 avec l'IDE Arduino MAX30102

3) ESP32 avec MAX30102 : Obtenir la température – Code

Le capteur MAX30102 est également livré avec un capteur de température nécessaire à l’étalonnage des valeurs BPM et SpO2. Nous pouvons également utiliser ce capteur pour obtenir la valeur de la température corporelle (dans ce cas, la température du bout des doigts).

Le code suivant montre comment obtenir la température corporelle du capteur MAX30102 avec l’ESP32.

/*
  Rui Santos & Sara Santos - Raspberryme.com
  Complete project details at https://Raspberryme.com/esp32-max30102-oximeter-heart-rate-sensor/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include 
#include "MAX30105.h"

MAX30105 sensor;

void setup() {
  Serial.begin(115200);
  Serial.println("MAX30102 Temperature Sensor");
  Serial.println();

  // Initialize the sensor
  if (!sensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("Error initializing the sensor...");
    while (1);
  }
  
  // Turn off the LEDs so they don't heat the sensor
  sensor.setup(0);            // 0 = LEDs off
  sensor.enableDIETEMPRDY();  // Enable temperature ready signal
}

void loop() {
  // Read temperature in Celsius
  float tempC = sensor.readTemperature();

  // Convert to Fahrenheit
  float tempF = tempC * 1.8 + 32.0;

  // Print the temperature readings
  Serial.print("Temperature: ");
  Serial.print(tempC, 2);
  Serial.print(" °C   |   ");
  Serial.print(tempF, 2);
  Serial.println(" °F");

  delay(1000);
}

Afficher le code brut

Comment fonctionne le code ?

Jetons un coup d’œil rapide au fonctionnement du code.

Bibliothèques

Commencez par inclure les bibliothèques requises.

#include 
#include "MAX30105.h"

Objet capteur

Créez un objet MAX30105 appelé capteur.

MAX30105 sensor;

installation()

Dans setup(), initialisez le moniteur série à un débit en bauds de 115 200.

Serial.begin(115200);
Serial.println("MAX30102 Temperature Sensor");
Serial.println();

Initialisez le capteur.

// Initialize the sensor
if (!sensor.begin(Wire, I2C_SPEED_FAST)) {
  Serial.println("Error initializing the sensor...");
  while (1);
}

Éteignez les LED du capteur afin qu’elles n’interfèrent pas avec les lectures de température et activez le signal pour lire la température.

// Turn off the LEDs so they don't heat the sensor
sensor.setup(0); 
sensor.enableDIETEMPRDY();

boucle()

Enfin, dans la boucle(), nous lisons en continu la température toutes les secondes.

Obtenir la température en Celsius est aussi simple que d’appeler la fonction readTemperature() sur l’objet capteur.

float tempC = sensor.readTemperature();

Nous pouvons ensuite convertir la température en Fahrenheit comme suit.

// Convert to Fahrenheit
float tempF = tempC * 1.8 + 32.0;

Imprimez les résultats dans le moniteur série.

// Print the temperature readings
Serial.print("Temperature: ");
Serial.print(tempC, 2);
Serial.print(" °C   |   ");
Serial.print(tempF, 2);
Serial.println(" °F");

Démonstration

Téléchargez le code sur votre tableau. Ensuite, ouvrez le moniteur série à un débit en bauds de 115 200.

Fixez le capteur à votre doigt à l’aide d’un élastique.

Il commencera à afficher les relevés de température toutes les secondes. Attendez quelques secondes que les résultats se stabilisent.

ESP32 Obtenez la température avec l'IDE Arduino MAX30102

Conclusion

Dans ce didacticiel, vous avez appris à interfacer le module capteur MAX30102 avec l’ESP32 pour obtenir la fréquence cardiaque, la concentration en oxygène dans le sang et la température corporelle (bout du doigt). Ce capteur peut être utilisé dans une grande variété de projets portables/santé.

Vous pouvez aller plus loin dans ce projet et ajouter un module d’affichage pour afficher les résultats, ou créer un serveur Web pour afficher les données. Vous trouverez peut-être utile de consulter les guides suivants pour choisir un module d’affichage ou créer un serveur Web :

Vous pouvez également créer un périphérique BLE avec ces caractéristiques et une application Web ou mobile pour afficher les résultats.

Nous créerons d’autres projets en utilisant ce capteur, alors restez à l’écoute.

Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

  • Hailege 2pcs MAX30102 Module de capteur de fréquence cardiaque Testeur de fréquence de battement de cœur Détection de pouls Test de concentration d’oxygène dans le sang pour Arduino
  • DUTTY Max30102 module de capteur de fréquence cardiaque et de pouls de poignet d'oxygène du sang compatible uno R3 stm32 2 PCS