Le MAX30102 rassemble dans un boîtier de quelques millimètres ce qui composait autrefois un oxymètre de pouls entier : deux LED — une rouge et une infrarouge — un photodétecteur, un convertisseur analogique-numérique 18 bits et le circuit qui pilote le courant des LED. Deux fils suffisent pour l’interroger : c’est un capteur I2C.
Le module mesure deux choses en même temps, et c’est ce qui le rend intéressant : le rythme cardiaque et la saturation en oxygène du sang (SpO2). Il suffit de poser un doigt sur la fenêtre optique. La même mesure sert aussi de détecteur de présence : dès qu’une surface réfléchit la lumière infrarouge, la valeur lue bondit — un objet approché, une main au-dessus du capteur, un couvercle refermé.
Comment il mesure le pouls
Le principe est celui de la réflectance. Le capteur envoie de la lumière dans le doigt et regarde ce qui revient. Le sang oxygéné et le sang désoxygéné n’absorbent pas la même quantité de lumière rouge et d’infrarouge : c’est ce rapport qui donne la SpO2. Et comme à chaque battement une poussée de sang traverse le doigt, la quantité de lumière réfléchie oscille au rythme du cœur — d’où le pouls.
La mesure exploite donc deux signaux superposés. Une composante continue, forte, due à la peau, aux os et au sang immobile, et une composante alternative, minuscule (souvent moins de 2 % du total), due au sang qui pulse. Toute la difficulté du calcul tient dans cette petite oscillation : c’est pourquoi le capteur est fait de deux longueurs d’onde différentes, mesurées au même instant, sur 18 bits de résolution.
Caractéristiques techniques
| Circuit | MAX30102 (Analog Devices) — boîtier optique 14 broches de 5,6 × 3,3 mm |
|---|---|
| LED intégrées | Rouge (environ 660 nm) et infrarouge (environ 880 nm), dans le même boîtier que le photodétecteur |
| Convertisseur | 18 bits, soit des valeurs de 0 à 262 143 |
| Fréquence d’échantillonnage | Programmable de 50 à 3200 échantillons par seconde |
| Courant des LED | Programmable jusqu’à 50 mA, par pas fins — réglable depuis le programme |
| Interface | I2C, jusqu’à 400 kHz, adresse fixe 0x57 |
| Alimentation du circuit | 1,8 V pour le cœur, 3,1 à 5 V pour les LED |
| Alimentation de la carte | 3,3 V recommandés, 5 V acceptés sur les cartes à régulateur |
| Capteur de température | Interne, environ ±1 °C — il mesure la puce, pas la pièce |
| Fonction de proximité | Détection de réflexion par infrarouge, utilisable seule et à très faible consommation |
| Pas des broches | 2,54 mm — compatible plaque d’essai |
| Dimensions de la carte | Environ 14 × 14 mm, trous de fixation aux angles |
Brochage
Les broches utiles sont sérigraphiées sur la carte et se retrouvent sur toutes les platines du marché. Quatre d’entre elles suffisent :
| VIN | Alimentation. Le 3,3 V est le choix sûr : il met le module au niveau des cartes 3,3 V (ESP32, Raspberry Pi) et reste dans la plage admise par les platines à régulateur. |
|---|---|
| GND | La masse, à relier au GND de la carte de commande. Sans masse commune, le bus I2C ne répond pas. |
| SCL | L’horloge du bus I2C. Sur un Arduino Uno : la broche A5 ; sur un ESP32 : GPIO 22. |
| SDA | Les données du bus I2C. Sur un Arduino Uno : la broche A4 ; sur un ESP32 : GPIO 21. |
| INT | Sortie d’interruption, active à l’état bas, pour que le capteur réveille le microcontrôleur au lieu d’être interrogé en boucle. Facultative : la laisser libre convient très bien pour un premier montage. |
Deux remarques pratiques. Selon les lots, la carte arrive avec quatre, cinq ou huit broches : les platines à huit broches doublent simplement la rangée et reprennent les mêmes signaux, seules les quatre broches indispensables comptent. Et comme pour tout module livré sans barrette soudée, il faut souder les picots soi-même — un contact simplement enfilé dans les trous est la première cause de « capteur introuvable ».
Adresse I2C : 0x57
Contrairement au MPU-6050 ou à la plupart des horloges, cette adresse est fixe : 0x57. Il n’y a pas de broche pour en changer, et deux MAX30102 ne peuvent donc pas cohabiter sur le même bus. En revanche rien n’empêche de partager le bus avec d’autres cartes, chacune avec son adresse : un afficheur LCD 16×02 I2C ou n’importe quel autre module se branche sur les mêmes deux fils. C’est aussi un bon test de câblage : un scanner I2C qui voit 0x57 a tout bon, et un scan vide accuse le câblage ou l’alimentation, presque jamais le capteur.
Applications typiques
- Montre ou bracelet connecté : le capteur a été conçu pour les objets portés — boîtier minuscule, consommation réduite, alimentation 1,8 V.
- Oxymètre de pouls : saturation en oxygène et fréquence cardiaque sur le même écran.
- Suivi sportif et effort : pouls pendant un exercice, avec une cadence d’échantillonnage élevée pour ne rien manquer.
- Détection de présence ou de contact : une main qui approche, un objet posé, un sommeil surveillé — sans caméra et sans contact.
- Projets de recherche et d’enseignement : c’est le capteur optique le plus documenté du domaine, avec une bibliothèque Arduino largement diffusée.
Mini-projet : le pouls affiché dans le moniteur série
Le montage tient en quatre fils. Le programme lit les deux canaux du capteur, repère les battements dans le signal infrarouge, calcule l’intervalle entre deux battements et en déduit le pouls en battements par minute. Il tient sur un Uno sans difficulté, parce qu’il n’embarque pas l’algorithme complet de calcul de la SpO2 — celui-ci demande bien plus de mémoire.
Ce qu’il faut
| Le capteur | Le module MAX30102 de cette page, barrettes soudées |
|---|---|
| Le microcontrôleur | Uno R3 + câble USB |
| Le support | Plaque d’essai 830 points |
| Les liaisons | 10 × fil femelle-femelle — l’extrémité femelle se clipse sur les picots soudés |
Le câblage
Module VIN | → Arduino 3.3V |
|---|---|
Module GND | → Arduino GND |
Module SDA | → Arduino A4 |
Module SCL | → Arduino A5 |
Module INT | → non connectée |
Le programme
Il faut d’abord installer la bibliothèque SparkFun MAX3010x Pulse and Proximity Sensor Library depuis le gestionnaire de bibliothèques de l’IDE Arduino. Le programme s’y appuie pour toute la communication avec le capteur :
/*
* Pouls avec le capteur MAX30102 -- Arduino Uno
* Bus I2C du Uno : SDA sur A4, SCL sur A5 -- alimentation du module : 3,3 V
* Bibliotheque requise : SparkFun MAX3010x Pulse and Proximity Sensor Library
*
* Composants, brochage et fiche complete : www.marocproduits.com
*/
#include "Wire.h"
#include "MAX30105.h"
MAX30105 capteur;
const long SEUIL_DOIGT = 20000; // en dessous : aucun doigt pose sur la fenetre
const long SEUIL_BATTEMENT = 50000; // au dessus : une poussee de sang est detectee
unsigned long dernierBattement = 0;
bool battementEnCours = false;
// Renvoie vrai si a est superieur ou egal a b, sans operator de comparaison
bool auMoins(long a, long b) {
return (a - b) == abs(a - b);
}
void setup() {
Serial.begin(9600);
if (capteur.begin(Wire, I2C_SPEED_FAST) == false) {
Serial.println("Capteur introuvable : verifier le cablage et la masse.");
while (1) { }
}
byte luminosite = 60; // courant des LED : 0 a 255, 60 correspond a environ 12 mA
byte moyennes = 4; // 1, 2, 4, 8, 16 ou 32 echantillons moyennes
byte mode = 2; // 2 = LED rouge + infrarouge
int cadence = 100; // echantillons par seconde : 50, 100, 200, 400...
int impulsion = 411; // duree d une impulsion, en microsecondes
int plage = 4096; // 2048, 4096, 8192 ou 16384
capteur.setup(luminosite, moyennes, mode, cadence, impulsion, plage);
Serial.println("Posez le doigt sur la fenetre du capteur, sans appuyer.");
}
void loop() {
if (capteur.available() == false) {
capteur.check(); // aucune mesure prete : on interroge le capteur
return;
}
long rouge = capteur.getRed();
long infrarouge = capteur.getIR();
capteur.nextSample(); // la mesure est consommee, on passe a la suivante
if (auMoins(infrarouge, SEUIL_DOIGT) == false) {
battementEnCours = false;
Serial.println("Aucun doigt detecte.");
delay(300);
return;
}
if (auMoins(infrarouge, SEUIL_BATTEMENT)) {
if (battementEnCours == false) {
unsigned long maintenant = millis();
unsigned long intervalle = maintenant - dernierBattement;
// intervalle de plus de 300 ms : au plus 200 battements par minute
if (dernierBattement != 0 && auMoins(intervalle, 300)) {
Serial.print("Battement -- IR = ");
Serial.print(infrarouge);
Serial.print(" rouge = ");
Serial.print(rouge);
Serial.print(" pouls = ");
Serial.print(60000UL / intervalle);
Serial.println(" battements par minute");
}
dernierBattement = maintenant; // battement suivant
battementEnCours = true; // on attend que le signal redescende
}
} else {
battementEnCours = false;
}
}
Comment ça marche
- La bibliothèque configure le circuit : courant des LED, moyenne sur quatre échantillons, LED rouge et infrarouge ensemble, cadence de 100 mesures par seconde. Ce sont les réglages d’usage courant — les modifier se fait par les six paramètres de
setup(). - Le doigt est détecté par un seuil sur le canal infrarouge. Sans doigt, le capteur ne voit que le peu de lumière qui revient du vide : quelques milliers de comptes. Avec un doigt, la valeur monte très haut — c’est le saut le plus visible du module.
- Le rythme est pris sur les fronts montants : on note un battement quand le signal franchit le seuil haut, et on ne le note pas deux fois de suite tant que le signal n’est pas redescendu. C’est ce que fait la variable
battementEnCours. - Deux battements consécutifs donnent l’intervalle en millisecondes, et un battement par minute correspond à 60 000 ms divisé par cet intervalle. Le contrôle de 300 ms élimine les rebonds du signal, qui produiraient des pouls à 300 battements par minute.
- Le programme n’écrit volontairement aucun opérateur de comparaison « inférieur à » dans le bloc de code : la petite fonction
auMoins()le remplace. Le texte collé dans une page ou un forum reste ainsi intact, sans balise interprétée par erreur.
Le réglage des seuils : l’étape à ne pas sauter
Les deux seuils du programme sont des points de départ, pas des constantes universelles. La marche à suivre est simple : ouvrez le moniteur série, laissez le capteur libre et notez la valeur affichée ; posez le doigt et notez la nouvelle valeur ; placez ensuite vos seuils entre les deux, plus près du bas. Un doigt fin et peu opaque réfléchit moins qu’un doigt épais, et l’écart change du simple au double d’une personne à l’autre.
Si les valeurs lues s’approchent de 262 143 — le maximum de l’échelle — le capteur sature : diminuez la luminosité des LED. À l’inverse, des valeurs qui restent très basses malgré le doigt appellent un courant plus élevé. C’est le seul réglage vraiment nécessaire, et il prend deux minutes.
Ce que le module ne fait pas
Autant l’écrire pour éviter les malentendus. Ce n’est pas un dispositif médical : c’est un capteur, et la valeur qu’il délivre dépend du contact, de la lumière ambiante, du mouvement et de la pression du doigt. Un doigt qui appuie fort chasse le sang et fausse tout. La SpO2 demande en plus un algorithme et un contact stable pendant plusieurs secondes : la mesure brute seule ne suffit pas.
Le module ne mesure ni la pression artérielle, ni un électrocardiogramme, ni la forme de l’onde cardiaque. Le capteur de température intégré mesure la température de la puce — utile pour compenser une dérive, sans aucun rapport avec la température du corps. Et l’infrarouge employé est celui de la mesure optique : ce n’est pas un détecteur de mouvement comme un PIR, qui lit, lui, le rayonnement lointain d’un corps chaud.
Questions fréquentes
Le capteur n’est pas détecté, que vérifier ?
Dans l’ordre : les picots sont-ils réellement soudés et non simplement enfilés ? La masse du module rejoint-elle bien le GND de l’Arduino ? SDA est-il sur A4 et SCL sur A5, et non l’inverse — c’est l’erreur la plus fréquente ? Et le module reçoit-il bien du 3,3 V ? Un scanner I2C qui affiche 0x57 confirme que tout le reste du programme est en cause, et non le montage.
Puis-je l’alimenter en 5 V ?
Sur les platines qui portent un régulateur, oui. Le circuit lui-même est alimenté en 1,8 V et les LED en 3,1 à 5 V : c’est la carte qui adapte. Le 3,3 V reste le choix le plus simple et le plus sûr, en particulier si le même bus I2C est partagé avec un ESP32, un Raspberry Pi ou un module en 3,3 V.
Quelle différence avec un MAX30100 ou un MAX30101 ?
Le MAX30100 est la première génération : deux LED également, mais un convertisseur de moindre résolution et une bibliothèque moins souple. Le MAX30101 ajoute une LED verte et se destine à la photométrie, sans le canal rouge attendu pour la SpO2. Le MAX30102 est la référence intermédiaire la mieux outillée en bibliothèques Arduino. Les programmes écrits pour l’un se transposent aux deux autres avec quelques retouches.
Puis-je afficher le résultat sur un écran ou l’envoyer sans fil ?
Oui. Un afficheur LCD 16×02 I2C partage exactement le même bus et affiche le pouls sans occuper de broches supplémentaires — deux adresses différentes sur les mêmes deux fils. Pour une version sans fil, un ESP32 WROOM fait tourner le même programme et publie la mesure en WiFi ou en Bluetooth ; le brochage I2C y passe simplement sur GPIO 21 et GPIO 22.
Peut-on mesurer le pouls à travers un objet ?
Non, la mesure est optique par réflexion : un boîtier opaque la bloque. En revanche, un plastique ou un verre transparent fonctionne, et c’est ainsi que le capteur s’intègre dans une montre ou derrière une vitre de boîtier. Cet usage impose de bien choisir l’ouverture et de prévoir la lumière parasite : c’est le principal travail mécanique de ces montages.
À combiner avec
Le socle du montage est la carte Uno R3, sa plaque d’essai et quelques fils femelle-femelle — le mini-projet de cette page les décrit, et le KIT Starter réunit la carte, la plaque, les fils et les résistances pour partir de zéro. Pour une version portée au poignet ou dans une poche, comptez sur une pile 18650 rechargeable, qui alimente sans problème un montage à si faible consommation. Côté projets plus complets, ce capteur se marie naturellement avec un afficheur pour rendre la mesure lisible, et avec un microcontrôleur sans fil pour l’envoyer vers un téléphone : c’est la combinaison utilisée par presque tous les bracelets de suivi d’activité.









