Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

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

Moniteur d Oxygène Sanguin et Température Corporelle Arduino – Système Bi-Capteur

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

Moniteur d Oxygène Sanguin et Température Corporelle Arduino – Système Bi-Capteur

Processus de fabrication

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