Matis DEMORELouise SanchezTom DEwan MASNicolas GILIBERTONicolasFerryMAPeraldimarie-agnes peraldi
Published

VitalSort

VitalSort est un projet étudiant visant à optimiser le flux de patients dans le service des urgences des hôpitaux de France.

AdvancedWork in progressOver 2 days17
VitalSort

Things used in this project

Hardware components

ProtoCentral Pulse Oximeter & Heart Rate Sensor based on MAX30100
ProtoCentral Electronics ProtoCentral Pulse Oximeter & Heart Rate Sensor based on MAX30100
×1
ESP8266 ESP-01
Espressif ESP8266 ESP-01
×1
Jumper wires (generic)
Jumper wires (generic)
×1

Software apps and online services

Arduino IDE
Arduino IDE
Microsoft Azure
Microsoft Azure

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)

Story

Read more

Custom parts and enclosures

Le bracelet

Une photo du bracelet final, avec le contrôleur Arduino et le capteur cardiaque intégrés dans le boitier imprimé en 3D, laissant apparaître l'interrupteur pour ouvrir ou fermer le circuit.

Schematics

Schéma d'architecture

Le schéma représentant l'architecture logicielle du réseau en partant du bracelet, pour aller jusqu'au frontend.
Le bracelet connecté, développé sous Arduino envoie les données de pouls et d'oxymétrie du patient à un serveur local via la méthode MQTT.

Ce serveur local, développé sous Java avec le framework SpringBoot, traduis les données brutes et les formatte pour les mettre à disposition au frontend sous forme d'une API REST utilisant HTTP pour communiquer.

Le frontend quand à lui développé en VueJS, récupère les données nécessaires grâces aux différents endpoints mis à disposition par le backend, puis les affiche au personnel médical.

Schéma d'alimentation

Le schéma représentant la boucle d'alimentation du bracelet.
Il se sert d'une pile bouton pour l'alimenter, et est doté d'un interrupteur.

Code

Montre

Arduino
Ceci est le code Arduino, qui gère le fonctionnement direct des composants inclus dans la montre.
Cette montre est celle donnée à tous les patients arrivant dans la salle d'attente des urgences.
Elle relaie les informations récupérées grâce aux différents capteurs à la partie backend, qui va ensuite traiter ces données brutes
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

MAX30105 particleSensor;

// Paramètres de l'algorithme
const byte RATE_SIZE = 4; // Augmenter cette valeur pour plus d'avg. 4 est suffisant.
byte rates[RATE_SIZE];    // Tableau des fréquences cardiaques
byte rateSpot = 0;
long lastBeat = 0;        // Temps du dernier battement

float beatsPerMinute;
int beatAvg;

// Paramètres du Wi-Fi
const char *ssid = "DESKTOP-V17F3V8";       // Remplacez par votre SSID
const char *password = "L66256z$";          // Remplacez par votre mot de passe

// Paramètres du serveur MQTT
const char *mqtt_server = "4.233.148.73";  // Adresse IP de votre PC (serveur MQTT)
const char *mqtt_topic = "urgent/monitoring/";  // Sujet sur lequel publier
const int mqtt_port = 1883;                 // Port MQTT

WiFiClient espClient;
PubSubClient client(espClient);

// Fonction de connexion Wi-Fi
void connectToWiFi() {
  Serial.print("Connexion au Wi-Fi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnecté au Wi-Fi !");
  Serial.print("IP de l'ESP8266 : ");
  Serial.println(WiFi.localIP());
}

// Fonction de gestion de la connexion MQTT
void reconnect() {
  while (!client.connected()) {
    Serial.println("Connexion au serveur MQTT...");
    if (client.connect("ESP8266Client")) {
      Serial.println("Connecté au serveur MQTT !");
    } else {
      Serial.print("Echec, code d'erreur : ");
      Serial.print(client.state());
      Serial.println(" Nouvelle tentative dans 5 secondes...");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  Serial.println("Initialisation...");

  // Connexion Wi-Fi
  connectToWiFi();

  // Initialisation du capteur MAX30105
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("Erreur : MAX30105 non détecté. Vérifiez les connexions.");
    while (1); // Boucle infinie en cas d'erreur
  }

  Serial.println("Capteur initialisé. Placez votre doigt sur le capteur avec une pression constante.");

  // Configuration du capteur
  particleSensor.setup();                      // Paramètres par défaut
  particleSensor.setPulseAmplitudeRed(0x1F);  // LED rouge à faible intensité
  particleSensor.setPulseAmplitudeGreen(0);    // Désactiver LED verte

  // Initialisation du client MQTT
  client.setServer(mqtt_server, mqtt_port);
}

void loop() {
  if (!client.connected()) {
    reconnect();  // Reconnexion si nécessaire
  }
  client.loop();  // Maintenir la connexion au serveur MQTT

  // Lecture du signal IR
  long irValue = particleSensor.getIR();

  // Vérification si un battement a été détecté
  if (checkForBeat(irValue)) {
    long delta = millis() - lastBeat;
    lastBeat = millis();
    beatsPerMinute = 60 / (delta / 1000.0); // Calcul de la fréquence cardiaque

    // Filtrage de la fréquence cardiaque
    if (beatsPerMinute < 255 && beatsPerMinute > 20) {
      rates[rateSpot++] = (byte)beatsPerMinute; // Stocker la lecture
      rateSpot %= RATE_SIZE;                    // Réinitialiser le tableau si nécessaire

      // Calcul de la fréquence cardiaque moyenne
      beatAvg = 0;
      for (byte x = 0; x < RATE_SIZE; x++) {
        beatAvg += rates[x];
      }
      beatAvg /= RATE_SIZE;
    }
  }

  // Affichage des données sur le moniteur série
  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print(", BPM=");
  Serial.print(beatsPerMinute);
  Serial.print(", BPM moyen=");
  Serial.print(beatAvg);

  if (irValue < 50000) {
    Serial.print(" - Pas de doigt détecté");
  }

  Serial.println();

  // Vérification que la fréquence cardiaque est dans une plage réaliste
  if (true) {
    // Envoi des données au serveur MQTT
    StaticJsonDocument<200>doc;
    String uuid = "patient1";
    float temperature = 36;

    doc["uuid"] = uuid;
    doc["heart_rate"] = beatsPerMinute*100;
    doc["temperature"] = temperature;
    doc["oxygen_level"] = 30;
    doc["last_updated"] = millis();

    String payload;
    serializeJson(doc, payload);

    if (client.publish(mqtt_topic, payload.c_str())) {
      Serial.println("Données envoyées au serveur MQTT.");
      Serial.println(payload);
    } else {
      Serial.println("Echec de l'envoi des données MQTT.");
    }
  } else {
    Serial.println("Fréquence cardiaque invalide, aucune donnée envoyée.");
  }

  delay(1000); // Attente avant la prochaine lecture
}

Credits

Matis DEMORE
1 project • 1 follower
Louise Sanchez
0 projects • 0 followers
Tom D
0 projects • 0 followers
Ewan MAS
0 projects • 0 followers
Nicolas GILIBERTO
0 projects • 0 followers
NicolasFerry
0 projects • 0 followers
MAPeraldi
0 projects • 1 follower
marie-agnes peraldi
0 projects • 0 followers

Comments