Code produit: | KY-039 |
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. Ce phénomène est illustré par la capture d'écran sur un
oscilloscope:
L'écran montre la variation de la tension au niveau du phototransistor (ainsi que les variations de luminosité dues à la circulation du sang) sur l'axe des ordonnées. Les pics ci-dessus représentent les impulsions du cœur. Si on compte les battements, on obtient environ 71 battements/minute.
Pour obtenir de bons résultats, nous recommandons d'effectuer la mesure
sur en plaçant le capteur sur l'extrémité du petit doigt.
Pour un meilleur résultat, il est préférable de fixer le capteur à l'aire de sparadrap ou ruban adhésif.
L'enregistrement du rythme cardiaque est meilleur lorsque le capteur est placé au-dessus d'un vaisseau sanguin majeur.
Il est parfois utile de tester différents emplacements pour le capteur afin d'obtenir un enregistrement de meilleure qualité.
Ce
capteur est destiné à une utilisation didactique, le résultat dépend de
la personne et de la position du doigt sur le capteur. Il est possible
de ne pas obtenir de bons résultats dans certaines conditions.
Branchement des câbles :
Gris --> GND
Blanc --> +V
Noir --> Signal
L'exemple de code suivant est de Dan Truong qui l'a publié sous ce [|lien] sous licence [|MIT OpenSource]. La version ci-dessous est traduite en français, l'originale est à télécharger ci-dessous.
Ce code détecte une impulsion. Il n'enregistrera pas le rythme cardiaque, mais il va rechercher les pics qui seront assimilés à des pulsations et feront allumer la led. Le nombre de pulsations peut être plus ou moins calculé.
Si le doigt est replacé entre la LED et le phototransistor, un délai est nécessaire jusqu'à ce que le programme se recalibre pour la nouvelle mesure et délivre la valeur correcte.
//////////////////////////////////////////////////////////////////////// /// Copyright (c)2015 Dan Truong /// Permission is granted to use this software under the MIT /// licence, with my name and copyright kept in source code /// /// KY039 Arduino Heartrate Monitor V1.0 (April 02, 2015) //////////////////////////////////////////////////////////////////////// /// /// Commentaires en français de GO TRONIC /// //////////////////////////////////////////////////////////////////////// /// @param[in] IRSensorPin broche analogique à laquelle est raccordé le capteur /// @param[in] delay (msec) Le délai entre les appels de la fonction de balayage. /// Les meilleurs résultats sont obtenus si vous appelez la fonction 5 fois/pulsation /// Pas plus lent que 150 ms pour environ 70 pulsations/min. /// Un délai de 60 ms ou plus rapide pour aller lusqu'à 200 pulsations/min. /// /// /// @Résumé /// Sortie Vraie si une pulsation est détectée /// Ce code détecte seulement les impulsions, il ne donne /// pas la forme d'onde des impulsions cardiaques. /// /// //////////////////////////////////////////////////////////////////////// int rawValue; bool heartbeatDetected( int IRSensorPin, int delay) { static int maxValue = 0; static bool isPeak = false ; bool result = false ; rawValue = analogRead(IRSensorPin); // La tension au phototransistor est lue et stockée dans la variable rawValue rawValue *= (1000/delay); // Si la valeur de la dernière mesure dévie trop // (par exemple parce que le doigt a été enlevé ou a bougé) // maxValue se réinitialise if (rawValue * 4L < maxValue) { maxValue = rawValue * 0.8; } // Detect new peak if (rawValue > maxValue - (1000/delay)) { // Détection de l'impulsion. Si la nouvelle rawValue est plus grande // que la dernière valeur maximale, elle sera prise en compte en enregistrée if (rawValue > maxValue) { maxValue = rawValue; } // Attribution des pulsations if (isPeak == false ) { result = true ; } isPeak = true ; } else if (rawValue < maxValue - (3000/delay)) { isPeak = false ; // La valeur maximale est légèrement diminuée à chaque passage. // Cela peut prendre plusieurs secondes pour détecter de nouveau // le signal lorsque le doigt a bougé ou que le capteur est devant // une partie osseuse du doigt. On peut aussi vérifier le délai // depuis la dernière pulsation et s'il excède 1 seconde, on // rénitialise maxValue maxValue-=(1000/delay); } return result; } //////////////////////////////////////////////////////////////////////// // Arduino main code //////////////////////////////////////////////////////////////////////// int ledPin=13; int analogPin=0; void setup() { // La LED Arduino intégrée (Digital 13) est utilisée pour la sortie pinMode(ledPin,OUTPUT); // Initialisation de la sortie série Serial.begin(9600); Serial.println( "Exemple de code de détection de pulsations." ); } const int delayMsec = 60; // 100msec per sample // Le programme principal a deux sorties: // - Si un battement de coeur est détecté, le voyant clignote // - L'impulsion est calculée et envoyée vers la sortie série. void loop() { static int beatMsec = 0; int heartRateBPM = 0; Serial.println(rawValue); if (heartbeatDetected(analogPin, delayMsec)) { heartRateBPM = 60000 / beatMsec; // Sortie LED par impulsion digitalWrite(ledPin,1); // Envoi des données série Serial.print(rawValue); Serial.print( ", " ); Serial.println(heartRateBPM); beatMsec = 0; } else { digitalWrite(ledPin,0); } delay(delayMsec); beatMsec += delayMsec; } |
Affectation des broches Arduino:
Sensor Signal | = | [Pin 0] |
Sensor +V | = | [5V] |
Sensor - | = | [Pin GND] |