SpO2 et Tachycardie

Mesurer la Saturation Pulsée en Oxygène du Sang et les Battements du Coeur !

O2 cardiometervue      La covid19 en ayant engendré le besoin, il a fallut que je m'y mette ! J'ai créé cette fois un oxygènomètre pour connaître la saturation en oxygène du sang pulsé (sans prélèvement ) ; donc un aperçu du fonctionnement des échanges gazeux respiratoires au niveau des poumons, car une saturation inférieure à 85% est un cas d'urgence ! Et pendant que l'on y est, pourquoi ne pas mesurer  la fréquence cardiaque . Le commun des mortels va avancer comme argument que ça ne coûte que 30 € en pharmacie, mais en le réalisant soi-même, ça invite non seulement à en connaître le fonctionnement, mais aussi à s'intéresser à son propre corp . Ma version est un peu plus "volumineuse" que les appareils du marché, mais mon atelier et moi, n'avons pas la possibilité de faire de la LSI (Large Scale Integration) . 

      Le mode d'emploi est très simple ! après avoir basculé l'interrupteur de l'alimentation, il suffit de poser l'index sur la cellule qui va mesurer l'écart de luminosité entre l'afflux de sang pulsé (systole) et la phase de repos (diastole); Dès la détection, un petit coeur apparaît sur l'écran et on attend quelques secondes sans que ce symbole ne s'éteigne et que l'afficheur donne des mesures cohérentes, ce qui est de l'ordre de 3 à 5 secondes environ si le doigt est bien mis  ! Et il n'y a même pas de pince douloureuse qui écrase les phalanges  ... 

 

Comment ça marche ?

      Deux leds, de longueur d'onde différente, éclairent alternativement les mini vaisseaux du doigt et la lumière réfléchie rejoint une photo diode, en passant par une lentille optique optimisée. Ce capteur est suivi par un processeur de signal analogique à très faible bruit, qui va interpréter la réflexion des pulses d'oxymétrie et la fréquence des battements du coeur .

O2 cardiometerdiag 1

Un convertisseur analogique / digital, va traiter ces données pour les rendre assimilables par l'électronique et permettre les requêtes via le bus I2C  ! Ce composant c'est le MAX30100 de chez Maxim et ses petits frères ... Et puisque l'on parle de matériel on va regarder ce qu'il nous faut !

 

Le Matériel :

O2 cardiometersens

      Le composant principal est le capteur MAX30100 ! On le trouve chez les Chinois à 1,46 € ! Il est monté, avec tous les éléments nécessaires à son fonctionnement, sur un rectangle d'époxy avec un terminal au pas normalisé de 2,54 mm... Ce dernier permet l'accès au bus de communication I2C et aux pins de l'alimentation conseillée à 3,3 volts ! Les résistances de pull-up du bus sont sur ce circuit, donc si la connexion du bus est permanente (soudage) on pourra s'affranchir des deux de 4K7 qui sont mise  sur le schéma !

 

O2 cardiometerscrn

      Ce deuxième composant est un écran OLED de 0.96 ' de 128 x 64 pixels ! Ce mini écran s'alimente en 5Vdc et se pilote en I2C. La luminosité est réglable et la surface est de 26 x 19 mm. Contrairement à l'apparence il est monochrome: c'est le verre supérieur qui est colorisé ! Pour certains, ça va rappeler les films multicolores que l'on mettait sur les cathoscopes de télé pour en faire un téléviseur couleur ! Donc dans la déclaration de couleur du soft, vous ne serez pas étonnés de le voir donner en 'WHITE' .... Son prix reste à moins de 2€ dans les échopes asiatiques .

 

O2 cardiometernano      Un Arduino Nano pour gérer tout ça : il est petit, pas cher, et bon à tout faire ! En plus, on n'a pas à réinventer le fil à couper le beurre lors du développement car plein de bibliothèques existent déjà et ne demandent qu'a être réutilisées; vive l'open source ! Une base micro Atmel ATmega168 (16 Mhz), avec plein d' I/O analogiques et digitales, Mini port USB, bus I2C, TX/RX, SPI,etc ... L'entrée Vin reçoit de 7 a 12 volts et des sorties restituent deux tensions régulées de 5 et 3,3 volt . Le tout facilement configurable par une interface IDE en freeware !  Que du bonheur ...

 

 Multi dices r470        Et deux résistances de 4K7 qui doivent servir de pull-up au bus I2C ... Ces deux résistances sont facultatives car elles existent déjà sur le circuit MAX30100 ! Donc si le détecteur de pulsations reste connecté en permanence on peut oublier de les mettre ! Sur mon circuit, pour le développement, j'ai mis une traversante et une CMS ... Mais ce n'était que pour les essais .

 

O2 cardiometerbat      L'alimentation et l'autonomie sont assurées par deux piles 1/2AA de 3,8 volts montées en série; J'ai choisi ce modèle de batteries car elles s'intègrent dans la lignée du circuit imprimé sans en augmenter considérablement les dimensions; En plus, pour un appareil d'usage intermittent, elles ont une bonne tenue de la tension tout en supportant bien le vieillissement.

 

Le Schéma :

O2 cardiometersch

      Pas trop à dire sur le schéma, vu la simplicité ! c'est pratiquement réduit à de la connexion d'éléments ensemble. Les composants sont sur le même bus mais à des adresses différentes de l'I2C et le programme sait ainsi à qui il parle . Pour le circuit imprimé, il en est de même; le but étant de réduire au maximum les dimensions de l'appareil.

O2 cardiometerpcb

      Quatre vues du circuit imprimé en recto et verso plus le câblage ! Tous les typons et tracés sont dans le fichier zip au format Eagle et JPEG ... Pas de remarques, juste ne pas oublier le stap qui relie le plan de masse ... Je ne soude que les pins utilisées sur l'Arduino et les quatre coins; en cas d'obligation de remplacement, c'est appréciable lors du dessoudage . 

 

La mécanique :

      J'ai volontairement évité le système de la pince, pour la complexité de la réalisation et je l'ai remplacé par le symbole du coeur qui apparait lorsque le doigt est à la bonne position ! Le boitier est réalisé à l'imprimante 3D donc chacun, s'il s'en sent le courage peut le modifier . Il se compose de 3 parties : un fond, un repose-doigt et la partie supérieure qui s'emboite et maintient  l'ensemble . J'ai réalisé ces trois pièces avec DesignSpark Mechanical et transformé en fichier STL, puis en G-Code avec Repetier Host ... Comme d'hab, les fichiers nécessaires à l'extrusion du plastique PTEG (diamètre1,75 mm, température de buse 240°, température de plateau 50°, Densité de remplissage 75%, Vitesse 56mm/s) sont dans le ZIP plus bas ...

O2 cardiometer boxup1

      

 

Les Mots qui commandent tout ça ==> Le logiciel :

      Le développement du sketch est réalisé avec l 'IDE Arduino, en suivant une structure classique ; Je commence par l'appel des bibliothèques (library) de gestion spécifique des composants MAX30100 et écran OLED, disponibles sur le réseau,  et la déclaration des variables utilisées ....

/*****************************************************************
*B.LECLERC http://amazing-vacuum-tubes.com 
*Mesure de la saturation pulsée du sang en oxygène et de la 
*tachycardie du coeur avec circuit MAX30100 .... 
*****************************************************************/
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define ENABLE_MAX30100 1
#define OLED_RESET     4 
#define SCREEN_ADDRESS 0x3c //Adresse I2C de l'écran 

Adafruit_SSD1306 display(128, 32, &Wire, OLED_RESET);

#if ENABLE_MAX30100
#define REPORTING_PERIOD_MS     5000
PulseOximeter pox;
#endif
uint32_t tsLastReport = 0;

Puis viennent les paramètres d'initialisation dans la partie Set-Up


void setup() {
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for (;;); // Don't proceed, loop forever
  }

#if ENABLE_MAX30100  // Initialise le PulseOximeter
  if (!pox.begin()) {
    for (;;);
  }
   
  pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
  pox.setOnBeatDetectedCallback(heart_beat); // Détection d'un battement de coeur et appel de l'affichage 
#endif
}

Et la boucle de programme principale qui se répète advitam aéternam,


void loop()
{
#if ENABLE_MAX30100  // Mise à jour des données cycliquement...
  pox.update();
  int bpm = 0;
  int spo2 = 0;
  if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
    bpm = pox.getHeartRate();
    spo2 = pox.getSpO2();
    tsLastReport = millis();
     display.clearDisplay();
    display_data(bpm, spo2);
  }
#endif

}

Et la séquence d'affichage qui est appelée à chaque loop !


void display_data(int bpm, int spo2) {  //Séquence d'affichage des données 
  display.setTextSize(1); // Grosseur du texte
  display.setTextColor(WHITE); // en blanc: afficheur monochromatique
  display.setCursor(0,0);  // Position sur l'écran
  display.print("Cardio: ");
  display.print(bpm);
  display.print("  b/min");
  display.display();  // Affichage ...
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  display.print(" SpO2:   ");
  display.print(spo2);
  display.print("  %");
  display.display();
}

Si la position du doigt est bonne et que les battements sont détectés on affiche "le petit coeur "

void heart_beat() {  // Affiche un 'coeur' si le battement est détecté 
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(100,16);
  display.print (char(03));
  display.display();

}

 

Les Fichiers de Réalisation :

      Tout est là ! Le soft, le boitier et le circuit ....

O2 cardiometerO2 cardiometer (362.25 Ko)

 

Et pour conclure:

      Ca ne vaut pas cher dans le commerce, mais là on peut frimer en disant :"c'est moi qui l'ai fait ! Na na nère " ... En plus, c'est relativement simple et un bon projet de débutant pour approfondir ses connaissances ; il y a tout de même deux bus I2C qui causent entre eux, dont un qui répond aux questions ... 

O2 cardiometerres

 

Ajouter un commentaire