Moniteur d'Oxygène Sanguin et Température Corporelle Arduino – Système Bi-Capteur
Composants et Fournitures
| Arduino UNO | ×1 |
| Écran LCD I2C 20×4 | ×1 |
| Capteur Fréquence Cardiaque Max30102 (mesure SpO2) | ×1 |
| 2 LED (verte/rouge pour indication seuil) | ×1 |
| 2 Résistances 220 Ω | ×1 |
| Module Capteur Température Infrarouge Sans Contact GY-906-BCC (MLX90614) | ×1 |
| Plaque d'Essai 830 Points | ×1 |
À Propos du Projet
Ce projet mesure simultanément le taux d'oxygène dans le sang (SpO2) et la température corporelle. Toute valeur inférieure aux seuils définis allume une LED rouge d'alerte.
Important : Pour le capteur SpO2, posez naturellement le doigt dessus sans appuyer fort, sinon la mesure sera faussée.
Lien GitHub (schéma et code) : https://github.com/DKARDU/bloodoxygen

Code Arduino (Blood_Oximeter.ino)
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <EEPROM.h>
#include "MAX30105.h" // Bibliothèque SparkFun MAX3010x
MAX30105 particleSensor;
LiquidCrystal_I2C lcd(0x27, 20, 4);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
double avered = 0, aveir = 0;
double sumirrms = 0, sumredrms = 0;
int i = 0, Num = 100;
int Temperature, temp;
float ESpO2, ESpO2_ROM;
double FSpO2 = 0.7; // Filtre passe-bas pour SpO2 estimé
double frate = 0.95; // Filtre pour composante DC IR/Rouge
#define TIMETOBOOT 3000
#define SCALE 88.0
#define SAMPLING 5
#define FINGER_ON 30000
#define USEFIFO
#define Greenled 8
#define Redled 9
void setup() {
Serial.begin(115200);
lcd.init(); lcd.backlight();
lcd.setCursor(3,1); lcd.print("Running......"); delay(3000); lcd.clear();
ESpO2 = readEEPROM();
Temperature = EEPROM.read(6);
pinMode(Greenled, OUTPUT); pinMode(Redled, OUTPUT);
digitalWrite(Greenled, LOW); digitalWrite(Redled, LOW);
// Initialisation MAX30102
while (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30102 non trouvé. Vérifiez câblage/alimentation/soudure jumper MH-ET LIVE.");
}
byte ledBrightness = 0x7F;
byte sampleAverage = 4;
byte ledMode = 2;
int sampleRate = 200;
int pulseWidth = 411;
int adcRange = 16384;
particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);
particleSensor.enableDIETEMPRDY();
mlx.begin();
}
void loop() {
uint32_t ir, red, green;
double fred, fir, SpO2 = 0;
#ifdef USEFIFO
particleSensor.check();
while (particleSensor.available()) {
#ifdef MAX30105
red = particleSensor.getFIFORed();
ir = particleSensor.getFIFOIR();
#else
red = particleSensor.getFIFOIR(); // Inversion sur carte MH-ET LIVE
ir = particleSensor.getFIFORed();
#endif
i++;
fred = (double)red; fir = (double)ir;
avered = avered * frate + (double)red * (1.0 - frate);
aveir = aveir * frate + (double)ir * (1.0 - frate);
sumredrms += (fred - avered) * (fred - avered);
sumirrms += (fir - aveir) * (fir - aveir);
if ((i % SAMPLING) == 0) {
if (millis() > TIMETOBOOT) {
// Affichage graphique Serial Plotter
float ir_forGraph = (2.0 * fir - aveir) / aveir * SCALE;
float red_forGraph = (2.0 * fred - avered) / avered * SCALE;
// ... (tronquage pour autoscaling)
float temperature = particleSensor.readTemperatureF();
if (ir < FINGER_ON) { // Doigt non détecté
temp = Temperature;
EEPROM.write(6, temp);
ESpO2_ROM = ESpO2;
writeEEPROM(&ESpO2_ROM);
lcd.setCursor(0,2); lcd.print("Last test: "); lcd.setCursor(11,2); lcd.print(ESpO2_ROM); lcd.print(" %");
lcd.setCursor(0,3); lcd.print("Last temp: "); lcd.setCursor(11,3); lcd.print(temp); lcd.print(" *C");
break;
}
if (ir > FINGER_ON) { // Doigt détecté
Temperature = mlx.readObjectTempC();
lcd.setCursor(0,0); lcd.print("Oxygen % = "); lcd.setCursor(11,0); lcd.print(ESpO2); lcd.print(" %");
lcd.setCursor(0,1); lcd.print("Temperature: "); lcd.print(Temperature); lcd.print(" *C");
// Seuils alerte : SpO2 < 90% OU Temp > 37°C → LED rouge
if ((ESpO2 >= 90) && (Temperature < 38)) {
digitalWrite(Redled, LOW); digitalWrite(Greenled, HIGH);
}
if ((ESpO2 < 90) || (Temperature > 37)) {
digitalWrite(Greenled, LOW); digitalWrite(Redled, HIGH);
}
}
}
}
if ((i % Num) == 0) {
double R = (sqrt(sumredrms) / avered) / (sqrt(sumirrms) / aveir);
SpO2 = -23.3 * (R - 0.4) + 100; // Formule Microchip AN1525B
ESpO2 = FSpO2 * ESpO2 + (1.0 - FSpO2) * SpO2; // Filtrage passe-bas
sumredrms = 0.0; sumirrms = 0.0; i = 0;
break;
}
particleSensor.nextSample();
}
#endif
}
void writeEEPROM(float *data) { ... }
float readEEPROM() { ... }
Schéma de Câblage

Processus de fabrication
- Raspberry Pi et HDC2010 : guide complet de configuration du capteur I2C température et humidité
- Construire un enregistreur de température Raspberry Pi avec capteur I2C à 5 $
- Construire un capteur de température distant avec Raspberry Pi et Python – Guide étape par étape
- Construire un système de surveillance température et lumière multi-capteurs avec Raspberry Pi et DS18B20
- Construire un moniteur de température domestique avec Raspberry Pi, MCP9808, InfluxDB et Grafana
- Vérifier et calibrer votre capteur d'humidité pour des mesures précises
- Construire un robot Arduino piloté par Raspberry Pi – Guide pas à pas
- Le Guide Complet de la Production de Fibre de Verre
- Créer une animation de coupe progressive dans SolidWorks – Tutoriel Étape par Étape