- Capteur MAX30100
- Composants requis
- Interfaçage de l'oxymètre MAX30100 avec ESP32
- Adafruit IO avec ESP32 pour la surveillance de la fréquence cardiaque
- Explication du code
- Démonstration d'oxymètre de pouls basé sur l'IoT
L'oxymétrie de pouls est un instrument de mesure médical largement utilisé et c'est un test non invasif et indolore qui mesure le niveau de saturation en oxygène dans notre sang qui peut facilement détecter de petits changements dans l'oxygène. Dans la situation actuelle de Covid-19, il est devenu important de suivre à distance le niveau d'oxygène de plusieurs patients en même temps sans entrer en contact avec le patient.
Ainsi, dans ce projet, nous construisons un oxymètre de pouls utilisant l'oxymètre de pouls MAX30100 et ESP32 qui suivra le niveau d'oxygène dans le sang et enverra les données via Internet en se connectant à un réseau Wi-Fi. De cette façon, nous pouvons surveiller plusieurs patients à distance en maintenant une distance sociale avec les patients. Les données obtenues seront affichées sous forme de graphique qui facilite le suivi et l'analyse de l'état du patient. Auparavant, nous avons également construit d'autres moniteurs de fréquence cardiaque utilisant des capteurs de pouls. Et si vous êtes intéressé par d'autres projets liés à Covid-19, vous pouvez consulter le thermomètre pour le corps humain, le thermomètre infrarouge intelligent pour la surveillance de la fièvre et le scanner de température mural que nous avons construit précédemment.
Outre l'application Covid-19, ce projet peut également être largement utilisé dans la maladie pulmonaire obstructive chronique (MPOC), l'asthme, la pneumonie, le cancer du poumon, l'anémie, la crise cardiaque ou l'insuffisance cardiaque, ou encore dans les malformations cardiaques congénitales.
Notez que le capteur utilisé dans ce projet n'est pas médicalement évalué et que le projet n'est pas testé pour les applications à l'épreuve des pannes. Utilisez toujours un oxymètre de pouls médical pour déterminer le pouls et le niveau d'oxygène du patient et discutez-en avec un médecin. Le projet discuté ici est uniquement à des fins éducatives.
Capteur MAX30100
Le capteur MAX30100 est un module d' oxymétrie de pouls et de moniteur de fréquence cardiaque intégré. Il communique avec la ligne de données I2C et fournit les informations SpO2 et Pulse à l'unité de microcontrôleur hôte. Il utilise des photodétecteurs, des éléments optiques où la LED IR rouge et verte module les impulsions LED. Le courant de la LED est configurable de 0 à 50 mA. L'image ci-dessous montre le capteur MAX30100.
Le module de capteur ci-dessus fonctionne avec une plage de 1,8 V à 5,5 V. Les résistances pull-up pour les broches I2C sont incluses dans le module.
Composants requis
- Une connexion WiFi
- ESP32
- Capteur MAX30100
- ID utilisateur Adafruit IO et un tableau de bord personnalisé (le rendra plus loin)
- Bloc d'alimentation adéquat de 5 V avec un courant nominal d'au moins 1 A
- Câble USB Micro USB vers USBA
- Un PC avec Arduino IDE avec environnement de programmation ESP32.
Interfaçage de l'oxymètre MAX30100 avec ESP32
Le schéma de circuit complet pour MAX30100 avec ESP32 est donné ci-dessous.
Ceci est un schéma très simple. Les broches 21 et 22 du kit ESP32 devkit C sont connectées au capteur d'oxymètre de pouls MAX30100 avec les broches SDA et SCL. L'oxymètre est également alimenté par la broche 5V de la carte de développement ESP32. J'ai fait ma connexion à l'aide d'une maquette et de fils de connexion et ma configuration de test ressemble à ceci:
Adafruit IO avec ESP32 pour la surveillance de la fréquence cardiaque
Nous avons déjà construit de nombreux projets Adafruit IO pour différentes applications IoT. Adafruit IO est une excellente plateforme où un tableau de bord personnalisé peut être créé. Pour créer le tableau de bord personnalisé pour le capteur Pulse-Oximeter basé sur l'IoT, suivez les étapes ci-dessous:
Étape 1: Inscrivez-vous d'abord dans adafruit IO après avoir donné le nom, le nom de famille, l'adresse e-mail, le nom d'utilisateur et le mot de passe.
Étape 2: La fenêtre du tableau de bord vide s'ouvrira une fois le processus de connexion terminé. Dans ce segment, nous devrons créer un tableau de bord pour afficher les données de différentes manières. Ainsi, il est temps de créer le nouveau tableau de bord et de fournir le nom du tableau de bord et la description.
Étape 3: Après avoir rempli le formulaire ci-dessus, il est temps de créer le graphique et la section de contrôle pour le capteur.
Sélectionnez le bloc de commutation. Il sera nécessaire pour activer ou désactiver le capteur de l'oxymètre de pouls.
Étape 4: Notez le nom du bloc. Comme nous pouvons le voir dans l'image ci-dessus, la fonction bascule fournira deux états, ON et OFF. Dans le même processus, sélectionnez le bloc graphique.
Cette section graphique doit être sélectionnée deux fois car deux graphiques seront affichés, Heart bit et SpO2. Les deux sections sont créées. Comme nous pouvons le voir, nous avons sélectionné toutes les fonctionnalités d'entrée et de sortie.
Étape 5: La prochaine et dernière étape consiste à avoir la clé adafruit. Comme nous pouvons le voir, nous obtenons la clé adafruit et cela doit être ajouté dans le code.
L'Adafruit IO est maintenant configuré. Il est temps de préparer le matériel et de créer le micrologiciel pour ce projet.
Explication du code
Ce code utilise de nombreuses bibliothèques et toutes sont importantes. Les bibliothèques sont la bibliothèque de capteurs d'oxymètre de pouls MAX30100 , Wire.h pour I2C, WiFi.h pour la prise en charge liée au WiFi dans ESP32, Adafruit MQTT et la bibliothèque client MQTT . Le programme complet se trouve au bas de cette page.
Les bibliothèques mentionnées ci-dessus sont incluses au début du code.
#comprendre
Les deux définitions suivantes sont le SSID WLAN et le mot de passe WLAN. Cela doit être exact et il sera utilisé par l'ESP32 pour se connecter au réseau WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Ensuite, nous avons défini les définitions d'Adafruit io.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Le taux de mise à jour mettra à jour les données toutes les 5 secondes, le serveur sera io.adafruit.com avec un port serveur de 1883. Le nom d'utilisateur et le mot de passe seront le nom d'utilisateur et le mot de passe générés à partir du tableau de bord adafruit IO. Il sera différent pour tous et devra être généré comme décrit dans la section de configuration d'adafruit.
Les ports I2C sont définis par la suite comme indiqué dans le schéma.
#define I2C_SDA 21 #define I2C_SCL 22
Ensuite, trois variables sont utilisées pour stocker le dernier rapport et la valeur bpm et spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
Le MQTT fonctionne avec un modèle pub-sub (publication et abonnement). Dans ce modèle de travail, l'appareil qui soumet les données au serveur Adafruit reste en mode de publication où le serveur Adafruit IO s'abonne aux mêmes points de données. Dans un tel effet, chaque fois que l'appareil publie de nouvelles données, le serveur, comme il y est abonné, reçoit les données et fournit l'action nécessaire.
La même chose se produit lorsque le serveur publie les données et que l'appareil y souscrit. Dans notre application, l'appareil envoie les données de SPO2 et BPM au serveur, il les publie donc et il reçoit l'état ON-OFF du serveur, s'abonnant ainsi à celui-ci. Cette chose est configurée dans l'extrait de code décrit ci-dessous-
Client WiFiClient; Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Notez que les chemins MQTT pour AIO suivent le formulaire:
Dans la fonction de configuration , nous démarrons l'I2C, connectons le WiFi avec le SSID et le mot de passe prédéfinis, et démarrons le processus d'abonnement MQTT pour l'état du commutateur (le bouton de commutation créé dans le tableau de bord Adafruit IO).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {délai (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi connecté"); Serial.println ("Adresse IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Initialisation de l'oxymètre de pouls.."); // Initialisation de l'instance PulseOximeter // Les échecs sont généralement dus à un câblage I2C incorrect, à une alimentation manquante // ou à une mauvaise puce cible if (! Pox.begin ()) {Serial.println ("FAILED"); pour(;;); } else {Serial.println ("SUCCESS"); } // Le courant par défaut de la LED IR est de 50 mA et il peut être modifié // en décommentant la ligne suivante. Vérifiez MAX30100_Registers.h pour toutes les // options disponibles. variole.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Enregistrer un rappel pour la détection de battement pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Après tout cela, le max30100 est démarré avec un réglage de courant LED. Différents paramètres actuels sont également disponibles dans les fichiers d'en-tête MAX30100 pour différentes configurations. Une fonction de rappel de détection de pulsations est également lancée. Après toutes ces configurations, le capteur d'oxymètre est arrêté.
Dans la fonction de boucle , la connexion MQTT est démarrée et le modèle d'abonnement est vérifié toutes les 5000 millisecondes. Dans cette situation, si le commutateur est activé, il commence à lire le capteur de l'oxymètre et à publier les données de Heartbeat et la valeur SPO2. Si le commutateur est désactivé, il suspend toutes les tâches liées au capteur de l'oxymètre de pouls.
boucle vide () {MQTT_connect (); Abonnement Adafruit_MQTT_Subscribe *; while ((subscription = mqtt.readSubscription (5000))) {if (subscription == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Starting POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Fonction qui implémente la tâche. * / "pox_read", / * Nom textuel de la tâche. * / 1024 * 3, / * Taille de la pile en mots, non bytes. * / NULL, / * Paramètre passé dans la tâche. * / 2, / * Priorité à laquelle la tâche est créée. * / & poxReadTaskHld); / * Utilisé pour passer le handle de la tâche créée. * /} délai (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Fonction qui implémente la tâche. * / "mqttPub", / * Nom textuel de la tâche. * / 1024 * 3, / * Taille de la pile en mots, pas en octets. * / NULL, / * Paramètre passé dans la tâche. * / 2, / * Priorité à laquelle la tâche est créée. * / & mqttPubTaskHld); / * Utilisé pour passer le handle de la tâche créée. * /}} else {Serial.print (("Stoping POX…")); // Détéler la tâche de lecture POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Supprimez la tâche de publication MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Utilisé pour passer le handle de la tâche créée. * /}} else {Serial.print (("Stoping POX…")); // Détéler la tâche de lecture POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Supprimez la tâche de publication MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Utilisé pour passer le handle de la tâche créée. * /}} else {Serial.print (("Stoping POX…")); // Suppression de la tâche de lecture POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Supprimez la tâche de publication MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Démonstration d'oxymètre de pouls basé sur l'IoT
Le circuit est correctement connecté dans une maquette et le programme ci-dessous est téléchargé sur ESP32. Assurez-vous de modifier les informations d'identification Wi-Fi et Adafruit en conséquence dans votre code pour que cela fonctionne pour vous.
Après la connexion avec le serveur WiFi et Adafruit IO, cela a commencé à fonctionner comme prévu.
Comme nous pouvons le voir, le niveau SPO2 affiche 96% et le rythme cardiaque affiche 78 à 81 bits par minute. Il fournit également l'heure à laquelle les données sont capturées.
Comme nous pouvons le voir dans l'image ci-dessus, le commutateur est désactivé et les données sont à 0. La vidéo de travail complète du projet se trouve également au bas de cette page.
J'espère que vous avez apprécié l'article et appris quelque chose d'utile, si vous avez des questions, veuillez les laisser dans la section commentaires ci-dessous ou les publier sur nos forums.