Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino
Composants et Fournitures
| Composant | Quantité | Remarques |
|---|---|---|
| Arduino UNO | 1 | Contrôleur |
| Écran OLED 128x32 (Adafruit) | 1 | Affichage BPM + animation |
| Buzzer | 1 | Bip synchrone battements |
| MAX30102 (Maxim Integrated) – Oxymètre Pouls Haute Sensibilité | 1 | Capteur fréquence cardiaque + SpO₂ |
À Propos du Projet
Introduction
Tutoriel : interface MAX30102 (oxymétrie pouls + fréquence cardiaque) avec Arduino UNO, puis projet mesure BPM avec écran OLED et buzzer.
- BPM (battements/minute) : 65‑75 au repos (athlètes plus bas).
- SpO₂ (saturation O₂) : > 95 % normal.
Module MAX30102 existe en plusieurs versions (ex: WAVGAT) – fonctionne tant que le CI est un MAX30102 authentique.
Composants Utilisés




Tests & Code
Codes basés sur exemples bibliothèque SparkFun_MAX3010x. Projet OLED+Buzzer = version modifiée exemple « HeartRate » : invite à placer doigt sur capteur.

Garder doigt immobile jusqu'à bip buzzer synchronisé ou animation OLED synchronisée → lecture BPM moyenne (moyenne 4 valeurs) plus précise.

Créer Bitmaps pour OLED
Deux bitmaps cœur (petit / grand) alternés à chaque battement détecté + bip buzzer.

Procédure (LCD Assistant)
- Image noir/blanc (fond blanc) taille ≤ écran (128x32). Mes bitmaps : 32x32 et 24x21 px.
- Télécharger LCD Assistant.
- Ouvrir image → paramètres : Orientation horizontal, 8 bits, Little Endian, etc. (voir captures).
- Enregistrer sortie → tableau bytes C.






Utilisation dans Code
display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);
// display.drawBitmap(x, y, bitmap_name, width, height, color);
logo2_bmp (petit cœur) affiché quand doigt détecté. logo3_bmp (grand cœur) affiché quand battement détecté.
Code Complet (MAX_BPM_OLED_Buzzer.ino)
/* MAX30102 + OLED 128x32 I2C + Buzzer + Arduino UNO
* Affiche BPM moyen, animation cœur, bip buzzer à chaque pouls
* Basé sur exemple HeartRate bibliothèque SparkFun MAX3010x
* Réf: www.surtrtech.com / chaîne YouTube SurtrTech
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float beatsPerMinute;
int beatAvg;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Bitmap petit cœur (24x21)
static const unsigned char PROGMEM logo2_bmp[] = {
0x03, 0xC0, 0xF0, 0x06, 0x71, 0x8C, 0x0C, 0x1B, 0x06, 0x18, 0x0E, 0x02,
0x10, 0x0C, 0x03, 0x10, 0x04, 0x01, 0x10, 0x04, 0x01, 0x10, 0x40, 0x01,
0x10, 0x40, 0x01, 0x10, 0xC0, 0x03, 0x08, 0x88, 0x02, 0x08, 0xB8, 0x04,
0xFF, 0x37, 0x08, 0x01, 0x30, 0x18, 0x01, 0x90, 0x30, 0x00, 0xC0, 0x60,
0x00, 0x60, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x0E, 0x00,
0x00, 0x04, 0x00
};
// Bitmap grand cœur (32x32)
static const unsigned char PROGMEM logo3_bmp[] = {
0x01, 0xF0, 0x0F, 0x80, 0x06, 0x1C, 0x38, 0x60, 0x18, 0x06, 0x60, 0x18,
0x10, 0x01, 0x80, 0x08, 0x20, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x02,
0x40, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x08, 0x03, 0x80, 0x00, 0x08, 0x01,
0x80, 0x00, 0x18, 0x01, 0x80, 0x00, 0x1C, 0x01, 0x80, 0x00, 0x14, 0x00,
0x80, 0x00, 0x14, 0x00, 0x80, 0x00, 0x14, 0x00, 0x40, 0x10, 0x12, 0x00,
0x40, 0x10, 0x12, 0x00, 0x7E, 0x1F, 0x23, 0xFE, 0x03, 0x31, 0xA0, 0x04,
0x01, 0xA0, 0xA0, 0x0C, 0x00, 0xA0, 0xA0, 0x08, 0x00, 0x60, 0xE0, 0x10,
0x00, 0x20, 0x60, 0x20, 0x06, 0x00, 0x40, 0x60, 0x03, 0x00, 0x40, 0xC0,
0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00,
0x00, 0x30, 0x0C, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x06, 0x60, 0x00,
0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00
};
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(3000);
particleSensor.begin(Wire, I2C_SPEED_FAST);
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A); // LED rouge faible = capteur actif
}
void loop() {
long irValue = particleSensor.getIR();
if (irValue > 7000) { // Doigt détecté
display.clearDisplay();
display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(50, 0); display.println("BPM");
display.setCursor(50, 18); display.println(beatAvg);
display.display();
if (checkForBeat(irValue)) { // Battement détecté
display.clearDisplay();
display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(50, 0); display.println("BPM");
display.setCursor(50, 18); display.println(beatAvg);
display.display();
tone(3, 1000); delay(100); noTone(3); // Bip 100 ms
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20) {
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
beatAvg = 0;
for (byte x = 0; x < RATE_SIZE; x++) beatAvg += rates[x];
beatAvg /= RATE_SIZE;
}
}
} else { // Pas de doigt
beatAvg = 0;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(30, 5); display.println("Please Place");
display.setCursor(30, 15); display.println("your finger");
display.display();
noTone(3);
}
}
Bibliothèques Requises
Schéma de Câblage
Les deux modules (MAX30102, OLED) en I²C (bus commun). Buzzer 2 broches : (-) → GND, (+) → résistance → D3.
Processus de fabrication
- Système de contrôle d'accès intégré QR, RFID et vérification de température
- Connecter plusieurs capteurs DS18B20 1-Wire à un Raspberry Pi pour une surveillance température précise
- Construire un système aéroponique automatisé avec Raspberry Pi et capteur d'humidité
- Système de surveillance cardiaque à distance avec alertes AWS IoT
- Construire un robot avec Raspberry Pi et Python : Guide complet
- Intégration d'un capteur thermocouple avec l'Arduino Portenta H7 via le MAX6675
- Construire un jeu gyroscopique temps réel avec Arduino Nano et capteur MPU-6050
- Moniteur de Fréquence Cardiaque IoT en Temps Réel avec Arduino et MAX30100
- Optimiser l'espace d'atelier avec Visual Components, Matterport & Automatisation ProFeeder X