2020-Galilee-ING2-ECG_Heart_Monitor_IoT

Ce projet relate la conception et implémentation d’un prototype Système de surveillance des anomalies cardiaques, il est composé d'un capteur de pulsations KY039HS qui est déjà conçu pour capturer le signal cardiaque avec une grande qualité. Une carte de développement de microcontrôleurs NODEMCU ESP32 qui effectue la conversion numérique analogique et du module WIFI intégré à la carte pour transmettre les informations au cloud (Blynk Server).

Slides & Videos

Members

NameContribution
Edward PAEZAll

State of the Art

Business Aspect

1.- MONITEUR ECG MOBILE ALIVECOR KARDIA

La solution Kardia Mobile (précédemment appelée « AliveCor Heart Monitor ») permet d’enregistrer, de stocker et de transférer des données d’électrocardiogramme (ECG) monocanal. Elle est également en mesure d’afficher le rythme cardiaque et de détecter les rythmes sinusaux normaux, ainsi que les cas de fibrillation auriculaire (sous la supervision d’un médecin). L’appareil Kardia Mobile est destiné aux professionnels de la santé, aux patients souffrant de problèmes cardiaques (ou potentiellement affectés par ceux-ci) et aux individus soucieux de leur santé. Ce produit n’a pas été testé et ne doit pas être utilisé dans un cadre pédiatrique.

KardiaMobile et les algorithmes Alivecor qui permettent la détection de la Fibrillation Atriale (FA) sont approuvés par la FDA et marqués CE.

  • De plus, les algorithmes de détection automatique de la FA ont une sensitivité de 98% et une spécificité de 97%.

Non seulement vous pouvez effectuer l’ECG où que vous soyez, mais vous pouvez également le partager avec votre médecin et surveiller votre tension artérielle.

Il existe un pack premium qui vous offre un stockage illimité des ECG en nuage, des rapports mensuels imprimés et la possibilité de suivre les médicaments (avec des rappels).

Quel que soit l’emballage, la rapidité est l’une des meilleures caractéristiques de ce moniteur ECG. Une fois que l’application est lancée et que vos doigts sont sur l’appareil, un ECG précis ne prend que 30 secondes.

Figure 1: L’Alivecor Kardia Mobile

2.- ECG PORTABLE EMAY

Le moniteur ECG portable Emay est l’un des plus précis et l’un des meilleurs moniteurs ECG portables, vous permettant une lecture rapide et fiable en quelques secondes. Le fait qu’il s’agisse d’un logiciel convivial avec prise en charge de EMAY fait de cet appareil ECG le meilleur choix. Les patients souffrant de problèmes cardiaques devraient choisir cet appareil pour leur faciliter la vie.

Le moniteur ECG portable EMAY est un moniteur de fréquence cardiaque qui est l’un des meilleurs moniteurs ECG de bureau et à domicile. En 30 secondes, vous obtenez des résultats et des calculs précis, ce qui vous permet de gagner du temps lorsque vous avez besoin de résultats rapides et précis.

Il est assez simple et donc très portable. L’avantage supplémentaire est qu’aucun câble n’est nécessaire pour faire fonctionner l’appareil et qu’il n’est pas nécessaire d’en transporter une grande partie, ce qui augmente la portabilité.

 

Figure 2: Le moniteur ECG portable Emay

3.- TENSIOMÈTRE COMPLET OMRON + ECG

Les caractéristiques uniques du tensiomètre complet Omron + moniteur ECG/ECG en font le meilleur moniteur ECG portable pour les médecins. Le fonctionnement sans fil et la visualisation directe à l’écran permettent un balayage rapide des maladies cardiaques. L’analyse ECG fournit des informations sur la fréquence cardiaque, le rythme et la forme d’onde de l’ECG.

 

 

Figure 3: Tensiomètre complet Omron + ECG

4.- VIATOM ECG/EKG HEART HEALTH TRACKER

C’est également l’un des meilleurs moniteurs ECG portables, il peut être utilisé pour détecter une arythmie précoce, mesurer l’oxygène et la pression sanguine.

Viatom Checkme Lite est un petit moniteur de signes vitaux avec un écran tactile haute définition qui vous permet de contrôler la santé dans la paume de la main à tout moment et en tout lieu avec une précision médicale.

Il peut être utilisé pour l’ECG, la fréquence cardiaque, la durée du QRS, le segment ST, l’intervalle QT / QTc, la pression artérielle systolique (supérieure), la saturation en oxygène du sang et la perfusion.

Figure 4: ViATOM ECG/EKG Heart Health Tracker

 

5.- MONITEUR ECG/EKG PORTABLE FACELAKE FL20

Le Facelake FL20 est conçu spécifiquement pour un usage personnel. Cet ECG à domicile permet de surveiller l’activité cardiaque à la maison, au travail ou pendant le voyage pour vérifier les problèmes cardiaques. C’est l’un des meilleurs moniteurs ECG portables qui est utilisé pour l’enregistrement et l’évaluation immédiats des électrocardiogrammes.

Cet appareil est le compagnon idéal pour tous ceux qui ont besoin de surveiller ou de détecter des maladies cardiaques lorsque des maladies chroniques se sont développées, en particulier les maladies coronariennes, les douleurs thoraciques, les palpitations, la myocardite, le diabète, l’hypertension, l’obésité, la dyspnée, des antécédents familiaux de maladies cardiaques ou les personnes qui s’inquiètent de leur santé cardiaque.

Les cardiogrammes stockés peuvent servir de référence pour l’examen ECG clinique. Reconnaissez votre cœur ; connaissez votre santé.

 

Figure 5: Le Facelake FL20

6.- HEAL FORCE

Ce moniteur ECG est certifié par la FDA et l’UE. La marque Heal Force est une alternative rentable au moniteur ECG HCG 801 d’Omron.

Il existe plusieurs variantes de ce moniteur ECG portable. Nous avons répertorié les détails pour les 180B et 80A. Le 180B utilise un câble USB pour l’extraction des données et effectue un enregistrement ECG de 30 secondes.

Le PC-80A est équipé de Bluetooth pour échanger des données sans fil et effectuer un enregistrement continu de 30 secondes (comme le 180B) et de 10 heures (par câble). Lorsqu’ils sont utilisés à domicile, ces moniteurs ECG peuvent vous fournir, ainsi qu’à votre médecin, des informations pertinentes sur les dernières conditions cardiaques. Le 180B (PC-80A) est utilisé dans un centre de santé ou un autre centre médical et peut mesurer les données en temps réel pour fournir l’état actuel du patient et surveiller les événements transitoires et enregistrer les événements cardiaques.

Figure 6: Moniteur HEAL FORCE

7.- Move ECG

La première montre analogique capable de détecter les arythmies.

Move ECG a été mise au point avec l’aide d’une équipe de cardiologues. Elle a été validée cliniquement après des tests rigoureux, et a reçu le marquage médical CE.

Move ECG intègre deux des ingrédients essentiels du succès : un suivi en temps réel qui fait une différence clinique, et une application mobile facile à utiliser qui transforme ces données en avis exploitables.

Lorsque vous placez votre main opposée sur l’électrode qui entoure le cadran de la montre, vous créez un circuit avec les deux électrodes situées à l’arrière du boîtier. Move ECG peut alors lire et enregistrer l’activité électrique de votre cœur.

Enregistrement ECG

Dos du boîtier et anneau frontal en acier inoxydable.

Pour prendre votre ECG, pressez le bouton latéral, puis tenez l’anneau en acier inoxydable sur le dessus du boîtier pendant 30 secondes. Le sous-cadran décompte le temps restant et la montre émet une légère vibration à la fin de l’enregistrement.

Pour obtenir une analyse complète, la fréquence cardiaque doit être en 50 et 100 battements par minute lors de la mesure.

 

Figure 7: Move ECG

Capteurs

ECG (3 électrodes) | Altimètre | Accéléromètre

 

8.- FITBIT SENSE MONTRE INTELLIGENTE

Fitbit Sense est la montre connectée intelligente pour la santé qui vous aide à être en harmonie avec votre corps via des outils pour la santé cardiaque, la gestion du stress, la SpO2, la température cutanée et plus encore.

Le suivi de la fréquence cardiaque était onéreux, gênant et inconfortable. En inventant PurePulse, nous l’avons rendu accessible à tous. Inspirés par un capteur de la taille d’un dé à coudre utilisé dans les hôpitaux, nous avons mené des recherches approfondies pour que le suivi de la fréquence cardiaque au poignet fonctionne dans tous les types d’environnements.

Figure 8: FITBIT SENSE MONTRE INTELLIGENTE

 

Capteurs et composants

  • Capteur de fréquence cardiaque optique multi-points
  • Capteurs électriques polyvalents compatibles avec l’app ECG et l’app AED
  • Capteurs rouges et infrarouges pour le suivi de la saturation en oxygène (SpO2)
  • Gyroscope
  • Altimètre
  • Accéléromètre 3 axes
  • Capteur de température cutanée
  • Détecteur de lumière ambiante
Technical Aspect

1.- Electrodes de surveillance ECG 3M™ Red Dot™ 2239

Description
•Les électrodes de surveillance ECG 3M™ Red DotTM 2239 sont conçues pour réaliser des
électrocardiogrammes de qualité.
•Elles garantissent une adhésion parfaite sur la peau pour favoriser la conductivité et la qualité du
signal ECG.
•Indications : les soins intensifs, en réanimation, en cardiologie, en gérontologie…
Caractéristiques techniques
•Matériaux : – Support : 3MTM MicroporeTM (non tissé, poreux, 100 % fibre de rayonne) ;
– Adhésif : polyacrylate, hypoallergénique (adhésion progressive pour peaux fragiles) ;
– Gel : mousse imbibée de gel solide conducteur ;
– Connexion : inox.
•Contact : Ag/AgCl (moins de 3% de Cl).
•Type de connexion : par pression.
•Type de dispositif : dispositif médical de Classe I (non stérile sans fonction de mesurage).
•Dimensions : diamètre de 6 cm.
•Poids : 2.3 g par électrode avec liner.
•Conditionnements au choix : – un sachet de 50 électrodes en vrac (réf. 101VAA) ;
– 10 sachets de 50 électrodes (réf. 101VAB) ;
– 20 sachets de 50 électrodes (réf. 101VAC).
•Conditions de conservations et de stockage : 2 ans sous sachet fermé à température ambiante dans des
conditions normales de conservation.
Une fois le sachet ouvert, toutes les propriétés des électrodes
sont gardées pendant 30 jours.
•Conformité et Marquage : Conforme au standard A.A.M.I. EC12 (Association pour l’Amélioration de
l’Instrumentation Médicale).
Marquage CE (93/42 Annexe VII).
Date de péremption et numéro de lot inscrits sur chaque sachet.
•Lieu de fabrication : fabriqué au Canada.

 

 

2.- Electrodes ECG à pression Ambu® BlueSensor M, réf. 102RIA

Description
•Electrodes ECG de la marque Ambu pour réaliser des électrocardiogrammes de courte et
moyenne durée en cardiologie.
•L’électrode Ambu® BlueSensor M est prégélifiées à base de gel liquide.
•De petite dimension, elle se caractérise par un gel liquide hautement conducteur et une
adhésivité maximale destinée à assurer un contact maximal avec la peau.
•Le contact maximal avec la peau permet un signal de qualité optimale.
•Le support imperméable fait barrière à l’écoulement de tout fluide, il est souple et assure le
confort du patient.
•L’électrode est équipé d’un connecteur excentré pour un signal stable et continu en cas de
traction du câble.
•Le connecteur excentré évite l’appui sur le patient, maintient le gel sous le capteur même en
cas de traction du câble et facilite le signal.
•Les électrodes sont fabriquées en matériaux biocompatibles.
•Connecteur à pression à utiliser avec les adaptateurs raccords pressions ECG (réf. 8291)
pour les connecter aux fiches bananes du câble patient.
Caractéristiques techniques
•Matériaux : – Capteur : Argent/Chlorure d’Argent (Ag/AgCl) ;
– Eponge : en mousse de Polyuréthane ;
– Support : en polymère (imperméable, empêche l’écoulement de tout fluide) ;
– Adhésif externe : Acrylate ;
– Elément supérieur : film Polychlorure de Vinyle (PVC) ;
– Pontet : en Polypropylène (PP) ;
– Connecteur : en laiton nickelé étamé ;
– Plaquette : Polyester/Film Polyéthylène (PET/PE).
•Matériaux emballage : – Feuillet interne du sachet : Polyéthylène (PE) ;
– Feuillet intermédiaire du sachet : Aluminium (Al) ;
– Feuillet externe du sachet : Polyester (PET).
•Coloris : bleu.
•Dimensions : – Dimensions de l’électrode : Lo 40,8 x la 34 mm ;
– Surface totale : Ø 34 mm ;
– Surface adhésive : 754 mm2 ;
– Epaisseur sans connecteur/câble : 1 mm ;
– Surface du capteur : 10 mm2 ;
– Surface du gel/zone de mesure : 154 mm2.
•Données électriques : – Impédance CA – typique : 700 Ω ;
– Tension continue de polarisation – typique : 0,4 mV ;
– Tension résiduelle de défibrillation – typique : 11,1 mV ;
– Vitesse de changement du potentiel de polarisation : 0,2 mV/s ;
– Recueil instabilité et bruit interne : inférieur à 15 μV ;
– Recueil tolérance courant (après 8 h) : inférieur à 5 mV.
•Type : électrodes à usage unique.
•Conditionnement : en lot de 1000, conditionnées par sachets de 50 électrodes (20 sachets).
•Durée de conservation : – En sachet ouvert : 1 mois ;
– En sachet scellé : 15 mois à compter de la date de fabrication.

 

3.- Electrodes sèches à fil test effort adulte

Electrodes sèches spécifiques au test d’effort.
  • Electrodes sèches à fil spécialement conçues pour les examens de test d’effort adulte.
  • Etudiées pour répondre aux exigences de la surveillance et du diagnostic cardiaque.
  • Idéales pour les tests effectués en visite médicale.
  • A usage unique.
  • Avec une durée optimale d’utilisation de 72H.
  • Ces électrodes sèches sont en support micro-poreux, sans latex ni gel.

4.- What is EDA? And how does it work?

L’activité électrodermique (EDA ; parfois appelée réponse galvanique de la peau, ou GSR) fait référence à la variation de la conductance électrique de la peau en réponse à la sécrétion de sueur (souvent en quantités infimes).

Ces données sont recueillies en appliquant un voltage faible, indétectable et constant à la peau, puis en mesurant la variation de la conductance de la peau [1, 2]. Cela peut être fait avec des appareils EDA qui mesurent le signal électrique enregistré par les électrodes appliquées sur la peau.

Si l’AED est également liée à la régulation de nos températures internes [1, 3], les recherches ont également montré à plusieurs reprises la forte association de ce signal avec l’éveil émotionnel [4, 5, 6]. Les signaux produits par le système nerveux sympathique entraînent une modification de la réponse de conductance de la peau (SCR), ce qui est souvent examiné par les chercheurs.

Project Description

Problem Definition
Les maladies cardio-vasculaires sont la première cause de mortalité dans le monde
Il meurt chaque année plus de personnes en raison de maladies cardio-vasculaires que de toute autre cause.
On estime à 17,7 millions le nombre de décès imputables aux maladies cardio-vasculaires, soit 31% de la mortalité mondiale totale. Parmi ces décès, on estime que 7,4 millions sont dus à une cardiopathie coronarienne et 6,7 millions à un AVC (chiffres 2015 l'OMS).
On sait que les moniteurs électrocardiographiques classiques sont grands et coûteux et qu'ils sont reliés au patient par des câbles, ce qui limite la mobilité du patient et rend les procédures médicales difficiles.
L'objectif de ce projet est la conception et le développement d'un petit prototype d'ECG sans fil qui peut être affiché sur certains appareils physiques ou numériques qui permettent la mobilité et l'isolement du patient. La technologie embarquée est entrée dans presque tous les aspects de la vie quotidienne, et le domaine de la santé ne fait pas exception à la règle pour que l'exigence d'hôpitaux entièrement équipés et de centres de diagnostic augmente de jour en jour alors que les gens sont de moins en moins conscients de leurs problèmes de santé. Un signal ECG peut retracer diverses conditions physiologiques et anormales du cœur. Ce système de surveillance cardiaque aide également à informer la personne si elle a des maladies cardiaques ou non. Cela se fait en vérifiant le niveau de battement du cœur.
Challenges & Motivation
Le cœur est le principal organe du système circulatoire et est responsable du pompage du sang dans tout le corps. Pour ce faire, il se contracte et se détend de manière rythmique en formant un cycle cardiaque qui est représenté par des ondes appelées P, Q, R, S et T qui déterminent l'amplitude, la direction et la durée des impulsions cardiaques générées, ces impulsions arrivent de manière diffuse à la surface du corps, ce qui permet qu'au moyen d'électrodes placées sur la peau, les potentiels électriques puissent être enregistrés. La trace de ces enregistrements est appelée électrocardiogramme ou mieux connu sous le nom d'ECG qui est une représentation du temps en fonction de l'amplitude que l'on trouve généralement sur une échelle de ± 2mV.
Real and Complete Usecases

Dans ce système, la carte de développement de microcontrôleurs NODEMCU ESP32 est utilisé pour scanner le signal ECG et rechercher un modèle dans la plage commune. Si le modèle est dans la plage normale, il donne le rapport d’être normal s’il est constaté qu’il n’est pas dans la plage normale, alors la personne est souffrant d’une sorte de maladie cardiaque. Le résultat suivant est envoyé sous forme de message d’alerte.

Technical Description

Il est composé d’un capteur de pulsations KY039HS qui est déjà conçu pour capturer le signal cardiaque avec une grande qualité. Une carte de développement de microcontrôleurs NODEMCU ESP32 qui effectue la conversion numérique analogique et du module WIFI intégré à la carte pour transmettre les informations au cloud (Blynk Server) vers l’application Android Blynk.  

Module ESP-WROOM-32

La carte de développement équipe le module ESP-WROOM-32 contenant le microprocesseur Tensilica Xtensa® Dual-Core 32-bit LX6. Ce processeur est similaire à l’ESP8266 mais possède deux cœurs d’unité centrale (pouvant être contrôlés individuellement), fonctionne à une fréquence d’horloge réglable de 80 à 240 MHz et effectue jusqu’à 600 DMIPS (Dhrystone Million Instructions Per Second).

ESP-WROOM-32 Chip

  • Xtensa® Dual-Core 32-bit LX6
  • Upto 240MHz Clock Freq.
  • 520kB internal SRAM
  • 4MB external flash
  • 802.11b/g/n Wi-Fi transceiver
  • Bluetooth 4.2/BLE

Il y a aussi 448 Ko de ROM, 520 Ko de SRAM et 4 Mo de mémoire Flash (pour le programme et le stockage des données), juste assez pour faire face aux grandes chaînes qui composent les pages web, aux données JSON/XML et à tout ce que nous jetons sur les appareils IoT de nos jours.

L’ESP32 intègre un émetteur-récepteur Wi-Fi 802.11b/g/n HT40, de sorte qu’il peut non seulement se connecter à un réseau WiFi et interagir avec l’Internet, mais il peut également mettre en place son propre réseau, ce qui permet à d’autres appareils de s’y connecter directement. L’ESP32 prend également en charge le WiFi direct, qui est une bonne option pour la connexion poste à poste sans avoir besoin d’un point d’accès. Le WiFi Direct est plus facile à configurer et les vitesses de transfert de données sont bien meilleures que celles du Bluetooth.

La puce a également des capacités Bluetooth bi-mode, ce qui signifie qu’elle prend en charge à la fois Bluetooth 4.0 (BLE/Bluetooth Smart) et Bluetooth Classic (BT), ce qui la rend encore plus polyvalente.

Power Requirement

Comme la plage de tension de fonctionnement de l’ESP32 est de 2,2 V à 3,6 V, la carte est équipée d’un régulateur de tension LDO pour maintenir la tension à 3,3 V. Elle peut fournir de manière fiable jusqu’à 600mA, ce qui devrait être plus que suffisant lorsque l’ESP32 tire jusqu’à 250mA pendant les transmissions RF. La sortie du régulateur est également répartie sur l’un des côtés de la carte et étiquetée comme 3V3. Cette broche peut être utilisée pour alimenter des composants externes.

L’alimentation de la carte de développement ESP32 est fournie par le connecteur USB MicroB embarqué. Alternativement, si vous disposez d’une source de tension régulée de 5V, la broche VIN peut être utilisée pour alimenter directement l’ESP32 et ses périphériques.

De plus, le courant de veille de la puce ESP32 est inférieur à 5 µA, ce qui la rend adaptée aux applications électroniques alimentées par batterie et portables.

Peripherals and I/O

Although the ESP32 has total 48 GPIO pins, only 25 of them are broken out to the pin headers on both sides of the development board. These pins can be assigned to all sorts of peripheral duties, including:

  • 15 ADC channels – 15 channels of 12-bit SAR ADC’s. The ADC range can be set, in firmware, to either 0-1V, 0-1.4V, 0-2V, or 0-4V
  • 2 UART interfaces – 2 UART interfaces. One is used to load code serially. They feature flow control, and support IrDA too!
  • 25 PWM outputs – 25 channels of PWM pins for dimming LEDs or controlling motors.
  • 2 DAC channels – 8-bit DACs to produce true analog voltages.
  • SPI, I2C & I2S interface – There are 3 SPI and 1 I2C interfaces to hook up all sorts of sensors and peripherals, plus two I2S interfaces if you want to add sound to your project.
  • 9 Touch Pads – 9 GPIOs feature capacitive touch sensing.

Multiplexed I/Os

  • 15 ADC channels
  • 2 UART interfaces
  • 25 PWM outputs
  • 2 DAC channels
  • SPI, I2C & I2S interface
  • 9 Touch Pads

Switches & Indicators

  • EN – Reset the ESP32 chip
  • Boot – Download new programs
  • Red LED – Power Indicator
  • Blue LED – User Programmable

 

DS18B20 Ccapteur de température protocole One wire

Plage de mesure.

Ce capteur possède une plage de température allant de -55°C à 125°C avec une tolérance comprise entre -0.5°C/+0.5°si celle ci se situe entre -10°C et 80°C.

Résolution.

La température peut être codée dans une variable allant de 9 à 12 bits, ce qui offre une résolution de 0.0625°C sur 12 bits. Le prix à payer est un temps d’acquisition plus long, de 93.75ms sur 9 bits, celui ci passe à 750ms sur 12 bits.

Capteur de température numérique.

L’avantage d’être un capteur numérique est que l’on peut le brancher sur n’importe quelle borne d’un Système embarqué.

La technologie one wire 

Le one wire (1 wire) permet de pouvoir brancher plusieurs capteurs sur la même broche de l’arduino. En fait chaque capteur possède une adresse unique codée sur 64 bits qui associé à une librairie chargée dans l’arduino, permet de dissocier chacun des DS18X20. Autrement dit, la où il vous fallait une carte arduino UNO complète pour brancher 16 capteurs, avec le DS18B20, vous pourrez tout mettre sur 1 seule entrée Tout Ou Rien (car c’est un capteur numérique, et non pas analogique).

 

KY-039 Capteur de pulsations cardiaques

Si on met un doigt sur la diode émettrice et le phototransistor, le signal de sortie délivre une image des pulsations du sang dans votre doigt.

Un phototransistor fonctionne comme ceci: il agit comme un transistor normal sauf que le courant de la base est remplacé par de la lumière reçue. Lorsque le phototransistor reçoit de la lumière, il change d’état et peut commuter une intensité relativement importante (en fonction de ses caractéristiques). 

 

Si vous placez une résistance en série avec le phototransistor, vous pourrez observer le comportement suivant: la tension aux bornes du phototransistor sera proche de 0 V lorsqu’il sera exposé à une lumière extérieure, tandis que cette tension sera proche de la tension d’alimentation dans l’obscurité.

Ce module permet de mesurer vos pulsations en plaçant un doigt entre la diode et le phototransistor. 

Explication: si vous placez votre doigt devant une lampe de poche, il deviendra plus ou moins translucide. Selon l’endroit éclairé, on peut vaguement discerner le pompage du sang.

Ce pompage du sang dans la veine présente une densité différente et donc des différences de luminosité dans le flux sanguin. Ce sont ces différences de luminosité que le module peut détecter et ainsi compter les pulsations.

Hardware

Materials
ImageNamePart NumberPriceCountLink
Module NodeMCU ESP323598912,00 €1🛒
Capteur de pulsations KY039HS362645,90 €1🛒
Afficheur OLED 0,96 '' I2C OLED01366887,90 €1🛒
Sonde étanche DS18B20 VMA3243660912,90 €1🛒
Cordon 75 cm RS617 Cordon 75 cm RS617483201,95 €1🛒
Plaque de montage rapide123055,90 €1🛒
Lot de 10 câbles à 2 broches340604,53 €1🛒
Schematic

Software

Arduino Code

/*
   Projet
   ECG_Heart_Monitor_IoT
   Auteur : PAEZ Edward
   Ecole : Sup Galilée
   www.sup-galilee.univ-paris13.fr
   Instrumentation ING2 @2021
*/

#if CONFIG_FREERTOS_UNICORE
#define ARDUINO_RUNNING_CORE 0
#else
#define ARDUINO_RUNNING_CORE 1
#endif

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define BLYNK_PRINT Serial

// ---------- Initialisation des variables ---------------------

int BPM_G, Ir_G;
float temp_G;

// Variables propres au Server Blynk

char auth[] = "bKi6bWBeta-YApVQ0IjBkfyFyOqDUg5s"; // Token in the Blynk App
char ssid[] = "ZTE_238FA1"; // WiFi credentials.
char pass[] = "97901829"; // Set password to "" for open networks.


// Variables propres au DS18B20
const int DS18B20_PIN = 5;
const int DS18B20_ID = 0x28;
// Déclaration de l'objet ds
OneWire ds(DS18B20_PIN); // on pin DS18B20_PIN (a 4.7K resistor is necessary)

// Variables propres au Sensor Pulse
const int ledPin = 2;
const int PulseSensor = 34;
const int delayMsec = 60; // 100msec per sample

int cont = 0;
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
int Signal = 0;
int Threshold = 2800;           //

// Variables propres au OLED 128x64
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// 'Sticker heart-128-128', 128x64px
static const uint8_t  PROGMEM Heart_PAEZ[] = {
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff,
  0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff,
  0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
  0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff,
  0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff,
  0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff,
  0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff,
  0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff,
  0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
  0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
  0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
  0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
  0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
  0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
  0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
  0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
  0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
  0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
  0xff, 0x80, 0x00, 0x00, 0x07, 0x00, 0x38, 0x1c, 0x70, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff,
  0xff, 0xc0, 0x00, 0x00, 0x1f, 0x00, 0x78, 0x1e, 0x78, 0x77, 0x80, 0x00, 0x00, 0x00, 0x03, 0xff,
  0xff, 0xe0, 0x00, 0x00, 0x77, 0x80, 0x70, 0x1e, 0xfc, 0xe1, 0xc0, 0x00, 0x00, 0x00, 0x07, 0xff,
  0xff, 0xf0, 0x00, 0x00, 0xe3, 0x87, 0x70, 0x0e, 0xff, 0x80, 0xf0, 0x1f, 0xc0, 0x00, 0x0f, 0xff,
  0xff, 0xfc, 0x00, 0x03, 0x83, 0x9f, 0xf0, 0x0e, 0xef, 0x00, 0x39, 0xc0, 0x78, 0x00, 0x3f, 0xff,
  0xff, 0xfe, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x0e, 0xe0, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff,
  0xff, 0xff, 0x80, 0x00, 0x01, 0xe3, 0xe0, 0x0e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff,
  0xff, 0xff, 0xc0, 0x00, 0x01, 0xc3, 0xe0, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff,
  0xff, 0xff, 0xf0, 0x00, 0x00, 0x03, 0xe0, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff,
  0xff, 0xff, 0xfc, 0x00, 0x00, 0x01, 0xc0, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff,
  0xff, 0xff, 0xfe, 0x00, 0x00, 0x01, 0x80, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xec, 0xf8, 0x1e, 0x18, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0x81, 0x78, 0x8d, 0x18, 0x3c, 0x3f, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0x8a, 0xf0, 0x38, 0x31, 0x70, 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xc1, 0xf1, 0xe6, 0x20, 0x20, 0x3f, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};

// define 3 tasks
void TaskOLED(void *pvParameters);
void TaskgetTemperatureDS18b20(void *pvParameters);
void TaskgetBPM(void *pvParameters);

// the setup function runs once when you press reset or power the board
void setup()
{
  // initialize serial communication at 115200 bits per second:
  Serial.begin(115200);
  Serial.println("Initialisation du programme");
  Blynk.begin(auth, ssid, pass);
  pinMode (ledPin, OUTPUT);
  digitalWrite(ledPin, 0);;
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  vTaskDelay(2000); // Pause for aprox 2 seconds

  // Clear the buffer.
  display.clearDisplay();

  // Draw bitmap on the screen
  display.drawBitmap(0, 0, Heart_PAEZ, 128, 64, 1);
  display.display();
  vTaskDelay(2000); // Pause for aprox 2 seconds
  display.clearDisplay();

  // Now set up 3 tasks to run independently.
  xTaskCreatePinnedToCore(
    TaskOLED, "TaskOLED", 1000 // Stack size
    ,
    NULL, 1 // Priority
    ,
    NULL, ARDUINO_RUNNING_CORE);

  xTaskCreatePinnedToCore(
    TaskgetTemperatureDS18b20, "TaskgetTemperatureDS18b20" // A name just for humans
    ,
    65536 // This stack size can be checked & adjusted by reading the Stack Highwater
    ,
    NULL, 2 // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
    ,
    NULL, ARDUINO_RUNNING_CORE);

  xTaskCreatePinnedToCore(
    TaskgetBPM, "TaskgetBPM", 65536 // Stack size
    ,
    NULL, 3 // Priority
    ,
    NULL, ARDUINO_RUNNING_CORE);

  // Now the task scheduler, which takes over control of scheduling individual tasks, is automatically started.
}

void loop()
{
  // Empty. Things are done in Tasks.
}

/*--------------------------------------------------*/
/*---------------------- Tasks ---------------------*/
/*--------------------------------------------------*/
// Pour afficher la température du capteur et les BPM dans l’OLED
/*--------------------------------------------------*/
void TaskOLED(void *pvParameters)  // This is a task.
{
  (void) pvParameters;

  for (;;)
  {
    display.clearDisplay();       // Pour effacer l’écran
    display.setTextSize(1);       // The fontsize
    display.setTextColor(WHITE);  // Draw white text
    display.setCursor(0, 0);      // Start at top-left corner
    display.print("Temp:");       //the text
    display.print(temp_G);        // Pour afficher la valeur
    display.print(" 'C");         //the text
    display.setCursor(0, 50);     // Start at top-left corner
    display.print("BPM:");        //the text
    display.print(BPM_G);         // Pour afficher la valeur
    display.display();            //call to display

    vTaskDelay(1000);  // one tick delay aprox (1s) in between reads for stability
  }
}

/*--------------------------------------------------*/
// Pour lire la température du capteur
/*--------------------------------------------------*/
void TaskgetTemperatureDS18b20(void *pvParameters) // This is a task.
{
  (void)pvParameters;

  for (;;) // A Task shall never return or exit.
  {
    byte i;
    byte data[12];
    byte addr[8];
    float temp = 0.0;

    //Il n'y a qu'un seul capteur, donc on charge l'unique adresse.
    ds.search(addr);
    ds.reset_search();
    vTaskDelay(1);

    // Cette fonction sert à surveiller si la transmission s'est bien passée
    if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
    }

    // On vérifie que l'élément trouvé est bien un DS18B20
    if (addr[0] != DS18B20_ID) {
      Serial.println("L'équipement trouvé n'est pas un DS18B20");
    }

    // Demander au capteur de mémoriser la température et lui laisser 850ms pour le faire (voir datasheet)
    ds.reset();
    ds.select(addr);
    ds.write(0x44, 1);
    vTaskDelay(850);
    // Demander au capteur de nous envoyer la température mémorisé
    ds.reset();
    ds.select(addr);
    ds.write(0xBE);
    // Le MOT reçu du capteur fait 9 octets, on les charge donc un par un dans le tableau data[]
    for ( i = 0; i < 9; i++) {
      data[i] = ds.read();
      //Serial.print(data[i], HEX);
      //Serial.print(" ");
    }
    // Puis on converti la température *0.0625 car la température est stockée sur 12 bits)
    temp = ( (data[1] << 8) + data[0] ) * 0.0625;

    // on affiche la T°
    Serial.print("Temperature: ");
    Serial.println(temp);
    temp_G = temp;
    Blynk.run(); // Pour lancer le serveur
    Blynk.virtualWrite(V5, temp); //Pour écrier la variable temp dans la variable V5 du serveur
    vTaskDelay(1000);
  }
}
/*--------------------------------------------------*/
// Pour lire le BPM du capteur - le rythme cardiaque
/*--------------------------------------------------*/
void TaskgetBPM(void *pvParameters) // This is a task.
{
  (void)pvParameters;

  for (;;)
  {
    Signal = analogRead(PulseSensor);  //
    Serial.println(Signal);
    Blynk.run();
    Blynk.virtualWrite(V0, Signal);  //Pour écrier la variable Signal dans la variable V0 du serveur

    if (Signal > Threshold) { // Si la valeur Signal est plus grand que 2800 on a un pulse
      currentMillis = millis();
      digitalWrite(ledPin, HIGH);
      cont++;
      Serial.println(cont);
      vTaskDelay(250);
    }
    if (Signal <= Threshold)
    {
      digitalWrite(ledPin, LOW);
    }

    if (currentMillis - previousMillis >= 30000) {
      // save the last time
      BPM_G = cont * 2;
      Serial.print("Heartrate: ");
      Serial.println(BPM_G);
      Blynk.run();
      Blynk.virtualWrite(V1, BPM_G);
      cont = 0;
      currentMillis = millis();
      previousMillis = currentMillis;
    }
  }
}

External Services

We make Internet of Things simple for your company

Hey,

I’ve made 2020-Galilee-ING2 app. You are welcome to try it out!

To start using it:
1. Download Blynk App: http://j.mp/blynk_Android or http://j.mp/blynk_iOS
2. Touch the QR-code icon and point the camera to the code below
3. Enjoy my app!