Oxymètre de pouls open-source DIY pour COVID-19 : construction Arduino
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino Nano R3 | 1 |
| Capteur pouls/rythme cardiaque MAX30102 (Maxim Integrated) | 1 |
| Écran OLED I2C 128x64 (DFRobot Gravity) | 1 |
Outils nécessaires
- Imprimante 3D (générique)
- Fer à souder (générique)
Applications et services en ligne
- Arduino IDE
- Autodesk Fusion 360 (conception boîtier)
À propos du projet
Les défis du COVID-19
Le COVID-19, causé par le SARS-CoV-2, attaque principalement le système respiratoire. Symptômes légers : fièvre, courbatures, frissons. Mais il peut évoluer vers pneumonie. Une personne essoufflée ne sait pas toujours quand aller à l'hôpital, surtout quand les services sont saturés. Cet oxymètre de pouls open-source vise à aider à surveiller son état et à prendre les bonnes décisions.
⚠️ Avertissement important
Ce dispositif/projet n'est PAS un outil de diagnostic médical fiable ! Il fournit une indication, pas un diagnostic certifié.
L'électronique
MAX30102
Capteur optique intégrant LED rouge + IR et photodétecteur. Mesure la saturation en oxygène (SpO₂) et le rythme cardiaque par photopléthysmographie. Interface I2C, alimentation 3,3V ou 5V.
Écran OLED 128x64
Affichage I2C compact, lisible, faible consommation.
Arduino Nano
Construction pas à pas
1. Imprimer et préparer les pièces
Téléchargez les fichiers STL (section « Custom parts »), tranchez (infill 70-80%, supports moyens, PLA). Retirez les supports, poncez légèrement pour un bon ajustement.
2. Souder l'électronique
L'Arduino Nano est monté sur une plaque à pastilles 44×30 mm. Soudez fils sur VIN, GND, SDA, SCL du MAX30102, passez sous la base vers le Nano.
Connectez le connecteur OLED au Nano, remontez vers l'écran.
Insérez l'ensemble dans le boîtier, fixez avec vis 3 mm.
3. Assembler le dispositif
Fixez l'écran OLED sur la partie supérieure, vissez au châssis. Testez l'articulation du couvercle.
4. Téléverser le sketch
Installez les bibliothèques requises (MAX30105, spo2_algorithm, SSD1306Ascii), sélectionnez « Arduino Nano », téléversez.
Le sketch : initialise OLED et MAX30102 (avec rapport d'erreurs), lit 100 échantillons pour calibrer, puis boucle : lit 25 nouvelles valeurs, calcule moyenne glissante, vérifie validité, affiche SpO₂ et FC si valides.
5. Utilisation
Placez le bout du doigt sur le capteur, fermez doucement le couvercle. Branchez l'alimentation (USB). Attendez l'affichage des données.
Code
Code Oxymètre de pouls (C/C++)
/* Connexions hardware (Breakout vers Arduino) :
* - 5V = 5V (3.3V autorisé)
* - GND = GND
* - SDA = A4 (ou SDA)
* - SCL = A5 (ou SCL)
* - INT = Non connecté
* Le MAX30105 gère logique I2C 5V ou 3.3V. Alimentation 5V recommandée.
*/
#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
MAX30105 particleSensor;
SSD1306AsciiWire oled;
#define MAX_BRIGHTNESS 255
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
// Arduino Uno/Nano : pas assez de SRAM pour 50 échantillons 32 bits
// On tronque à 16 bits (MSB)
uint16_t irBuffer[50];
uint16_t redBuffer[50];
#else
uint32_t irBuffer[50];
uint32_t redBuffer[50];
#endif
int32_t spo2; int8_t validSPO2;
int32_t heartRate; int8_t validHeartRate;
void setup() {
Serial.begin(115200);
oled.begin(&Adafruit128x64, 0x3C);
oled.setFont(Arial14);
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println(F("MAX30105 introuvable. Vérifiez câblage/alimentation."));
while (1);
}
// Configuration : ledBrightness=55, sampleAverage=4, ledMode=2, sampleRate=200, pulseWidth=411, adcRange=4096
particleSensor.setup(55, 4, 2, 200, 411, 4096);
}
void loop() {
// Premiers 50 échantillons : déterminer plage signal
for (byte i = 0; i < 50; i++) {
while (!particleSensor.available()) particleSensor.check();
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample();
Serial.print(F("red=")); Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir=")); Serial.println(irBuffer[i], DEC);
}
// Premier calcul FC et SpO2
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
// Boucle continue : calcul chaque seconde
while (1) {
// Décaler les 25 derniers échantillons au début
for (byte i = 25; i < 50; i++) {
redBuffer[i - 25] = redBuffer[i];
irBuffer[i - 25] = irBuffer[i];
}
// Acquérir 25 nouveaux échantillons
for (byte i = 25; i < 50; i++) {
while (!particleSensor.available()) particleSensor.check();
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample();
Serial.print(F("red=")); Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir=")); Serial.print(irBuffer[i], DEC);
Serial.print(F(", HR=")); Serial.print(heartRate, DEC);
Serial.print(F(", HRvalid=")); Serial.print(validHeartRate, DEC);
Serial.print(F(", SPO2=")); Serial.print(spo2, DEC);
Serial.print(F(", SPO2Valid=")); Serial.println(validSPO2, DEC);
}
// Recalculer
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
printToScreen();
}
}
void printToScreen() {
oled.clear();
oled.setCursor(0, 0);
if (validSPO2 && validHeartRate) {
oled.print(F("FC: ")); oled.println(heartRate, DEC);
oled.print(F("SpO2: ")); oled.println(spo2, DEC);
} else {
oled.print(F("Non valide"));
}
}
Pièces personnalisées et boîtiers
Fichiers STL disponibles pour impression 3D (aucun réglage spécifique requis).
Schémas
Processus de fabrication
- Journal du projet FirePick Delta : Construire une MicroFactory open-source avec OpenPnP
- Dé numérique Arduino sur écran LCD 16x2 – Générateur aléatoire à bouton poussoir
- Construire un Iron Man animé avec Arduino : capteurs, sons et relais
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Construire un bras robotique 3D fonctionnel piloté par Arduino – Guide pas à pas
- Oxymètre de pouls portable pour usage d'urgence COVID-19
- Contrôleur d'humidificateur DIY avec Arduino et relais – Installation haute tension sécurisée
- Health Band : Bracelet intelligent fiable d'assistance pour personnes âgées
- Pourquoi l'open source stimule l'innovation à la périphérie — eBook essentiel