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

De KY-039 à la fréquence cardiaque

Composants et fournitures

Arduino UNO
× 1
Capteur de rythme cardiaque KY-039
× 1
Câbles de raccordement (générique)
× 1

À propos de ce projet

Dans le lot de 37 capteurs pour Arduino , il y a un capteur de rythme cardiaque. Le nom promet trop. Les gens ont tendance à penser qu'il fournit un numéro numérique via I2C ou quelque chose de similaire, un nombre qui correspond à la fréquence cardiaque. Ce que le capteur fournit est juste une valeur "analogique" de 0 à 1023, indiquant la quantité de lumière infrarouge reçue par le capteur de lumière, ou en fait combien quelque chose ombrage le capteur de lumière . Plus la valeur est élevée, moins il y a de lumière infrarouge.

Bref :placez votre doigt entre la led IR et le transistor lumineux du capteur. Votre rythme cardiaque dilate les vaisseaux sanguins de votre doigt, ce qui filtrera l'IR. Cela crée un signal pulsé.

Dans ce projet, je décris comment ce signal est converti en un rythme cardiaque comme 66 BPM (battements par minute).

Les étapes simples

Si vous lisez et tracez simplement les valeurs du capteur KY-039, vous obtenez quelque chose comme ceci :

Les valeurs sont des valeurs entières. Pas très précis. Au lieu de cela, calculez une moyenne d'un tas d'entre eux et tracez la moyenne. Vous obtenez ceci :

Ici, vous pouvez déjà voir le pouls du cœur. Obtenez la différence de temps entre chaque augmentation significative de l'impulsion. À partir de là, vous pouvez calculer la fréquence cardiaque en BPM.

(Le petit motif en zigzag dans l'image ci-dessus est dû à la lumière artificielle, 50 Hz, une autre chose à laquelle il faut faire face.)

Étapes expliquées

Voici un code simple pour simplement sortir tout ce que vous lisez à partir du capteur KY-039 :

// Pulse Monitor Test Scriptint sensorPin =0;void setup() { Serial.begin(9600);}void loop (){ while(1) { Serial.print(analogRead(sensorPin)); Serial.print('\n'); }}  

Ce que vous pourriez obtenir est quelque chose comme ceci :

Comme il s'agit d'une légende de la fenêtre du moniteur série lisant la sortie série de votre Arduino à 9600 bauds, l'ensemble du processus est chronométré par le Serial.print() fonction, qui définira un taux pour la lecture et le tracé des valeurs. Quoi qu'il en soit, la courbe est très irrégulière, car elle varie entre 360 ​​et 383 et n'a que des valeurs entières.

Lissage

Pour obtenir une sortie plus fluide, prenez en moyenne, disons, les 20 dernières lectures du capteur. Voici comment je fais. Je définis une constante indiquant le nombre de lectures que je veux :

#define samp_siz 20 

Ensuite, j'ai un tableau contenant ce nombre de lectures :

int reads[samp_siz] ;  

Pour chaque nouvelle lecture, je soustrais la lecture la plus ancienne d'une somme et j'ajoute la lecture la plus récente à la somme. Dans le tableau, je remplace la lecture la plus ancienne par la lecture la plus récente.

 reader =analogRead (sensorPin); // lit la somme du capteur -=reads[ptr]; // soustraire la lecture la plus ancienne de sum sum +=reader; // ajoute la lecture la plus récente à la somme reads[ptr] =reader; // enregistre la lecture la plus récente dans le tableau last =float(sum) / samp_siz; // calcule la moyenne maintenant ptr++; // mettre à jour l'index du tableau, avoir ptr %=samp_siz; // il redémarre à 0 en cas de besoin 

Avec une taille de tableau de 20 et un débit en bauds de 9600 dans le moniteur série, je pourrais obtenir un tracé comme celui-ci :

Ici, vous voyez les battements cardiaques réels sous la forme d'une courbe ascendante abrupte. Mais vous voyez aussi un petit motif en zigzag. Le plus petit zigzag vient de la lumière de ma cuisine, trois ampoules LED éclairant la pièce. Le secteur de ma maison est en 240 V, 50 Hz AC. Donc 50 fois par seconde, il y a une augmentation de l'intensité lumineuse, apparemment aussi dans la bande IR. J'aimerais atténuer ce bruit de 50 Hz. Cela devrait fonctionner si je lis les valeurs du capteur pendant une période de 20 ms et prends une moyenne de toutes les valeurs. Voyons voir...

n =0 ; début =millis(); lecteur =0.; do { lecteur +=analogRead (sensorPin); // lit et ajoute des valeurs... n++; maintenant =millis(); } while (maintenant

Avec cet extrait, je prends les lectures du capteur par tranches de 20 ms, ce qui égalisera le scintillement de 50 Hz causé par la lumière artificielle. Si vous vivez dans un pays à 60 Hz, utilisez plutôt des morceaux de 16,67 ms. Ou 16667µs.

Comme j'ai déjà lissé la courbe en sections de 20 ms, je n'ai pas vraiment besoin du tableau que j'ai utilisé plus tôt, mais comme il est là et qu'il est facilement redimensionnable, je le laisse là. Et l'utilisation d'une taille de tableau de 5 semble égaliser le dernier bruit ennuyeux. Voici ce que j'ai maintenant :

La dernière chose que je dois faire est de reconnaître n'importe quelle partie du motif répétitif. Comme la pente montante est plus régulière, je fonce. Remarquez comment les valeurs de l'axe des y sont très différentes dans tous les graphiques. Je ne peux vraiment pas me fier uniquement aux valeurs absolues. Je ne peux compter que sur la montée et la descente de la courbe. Les mathématiciens parleraient de la dérivée. Je suis satisfait si je trouve n valeurs croissantes consécutives, où n pourrait être une valeur réglable pratique. Je commence par 5. Pour cela j'ai le rise_threshold constante définie dans le code. Lorsque je trouve 5 valeurs croissantes consécutives, je sais que je suis au bas de la courbe en direction du haut. Je prends le temps. J'attends une courbe descendante, puis j'attends les 5 prochaines valeurs montantes et note l'heure. Ensuite j'imprime le BPM correspondant.

J'ai fait un test et compté comment beaucoup consécutif montée valeurs sont dans le courbe et trouvé sortie étaient entre 10 et 15. Alors si Je compter à 5, Je sera la plupart bien sûr savoir J'ai trouvé le commencer de le battement de coeur.

Comme je n'imprime qu'après chaque battement de cœur, il n'y aura pas beaucoup d'impression. Il y aura plus de temps pour lire le capteur. Je pourrais capter des bruits plus fréquents, que je ne verrai pas, car le traceur n'est pas allumé. Voyons comment cela fonctionne.

Le code final

#define samp_siz 4#define rise_threshold 5// Pulse Monitor Test Scriptint sensorPin =0;void setup() { Serial.begin(9600);}void loop (){ float reads[samp_siz], sum; long int maintenant, ptr; flotteur en dernier, lecteur, commencer ; float premier, deuxième, troisième, avant, print_value; bool montant; int rise_count; entier n; long int last_beat; for (int i =0; i  before) { rise_count++ ; if (!rising &&rise_count> rise_threshold) { // Ok, nous avons détecté une courbe montante, ce qui implique un battement de cœur. // Enregistrez le temps écoulé depuis le dernier battement, gardez une trace des deux // temps précédents (premier, deuxième, troisième) pour obtenir une moyenne pondérée. // Le drapeau montant nous empêche de détecter la même hausse // plus de une fois. montant =vrai ; premier =millis () - last_beat; last_beat =millis(); // Calculez la moyenne pondérée de la fréquence cardiaque // selon les trois derniers battements print_value =60000. / (0,4 * premier + 0,3 * deuxième + 0,3 * troisième); Serial.print(print_value); Serial.print('\n'); troisième =deuxième ; deuxième =premier ; } } else { // Ok, la courbe est descendante montante =false; augmentation_compte =0 ; } avant =dernier ; ptr++ ; ptr %=samp_siz; }}  

Cela fonctionne plutôt bien. Voici une vidéo.

Notez que la minuscule led RX clignote sur l'Arduino en synchronisation avec mon cœur. Tout simplement parce que lorsqu'il y a un battement de coeur, le taux est calculé et imprimé sur la série, qui fait clignoter la led. Lorsque le doigt bouge un peu, il y aura des erreurs de lecture.

Développement ultérieur

À l'heure actuelle, le taux imprimé est calculé sur la base des trois derniers battements. Mais il pourrait être plus approprié de le calculer sur la base, disons, d'une période de 15 s. Je pourrais enregistrer 15 valeurs de taux consécutives, calculer la moyenne, puis omettre les cinq valeurs les plus éloignées de la moyenne et calculer une nouvelle moyenne. Cela donnerait à peu près une mesure fiable et stable de la fréquence cardiaque.

Je n'ai testé le capteur que sur ma femme et sur moi. Chaque étape d'amélioration du signal que j'ai faite sur la base des lectures précédentes. Quelqu'un d'autre peut avoir un autre type de rythme cardiaque provoquant une courbe de forme différente, ce qui nécessite une autre approche pour trouver le rythme. C'est peut-être la courbe descendante qui est plus facile à reconnaître. Ou tout en haut. Et que se passe-t-il si le pouls est de 180 - 200 BPM ? Trouver la courbe ascendante peut être plus délicat.

Code

  • Version finale
Version finaleC/C++
Le programme lit le rythme cardiaque et imprime le taux dans la fenêtre série.
#define samp_siz 4#define rise_threshold 4// Pulse Monitor Test Scriptint sensorPin =0;void setup() { Serial.begin(9600);}void loop (){ float reads[samp_siz], sum; long int maintenant, ptr; flotteur en dernier, lecteur, commencer ; float premier, deuxième, troisième, avant, print_value; bool montant; int rise_count; entier n; long int last_beat; for (int i =0; i  before) { rise_count++ ; if (!rising &&rise_count> rise_threshold) { // Ok, nous avons détecté une courbe montante, ce qui implique un battement de cœur. // Enregistrez le temps écoulé depuis le dernier battement, gardez une trace des deux // temps précédents (premier, deuxième, troisième) pour obtenir une moyenne pondérée. // Le drapeau ascendant nous empêche de détecter la même augmentation plus d'une fois. montant =vrai ; premier =millis() - last_beat ; last_beat =millis(); // Calculez la moyenne pondérée de la fréquence cardiaque // selon les trois derniers battements print_value =60000. / (0,4 * premier + 0,3 * deuxième + 0,3 * troisième); Serial.print(print_value); Serial.print('\n'); troisième =deuxième ; deuxième =premier ; } } else { // Ok, la courbe est descendante montante =false; augmentation_compte =0 ; } avant =dernier ; ptr++ ; ptr %=samp_siz; }} 

Schémas


Processus de fabrication

  1. Capteur de couleur – Fonctionnement et applications
  2. Transfert de données de capteur à partir d'une plaque Pi ppDAQC à l'aide de InitialState
  3. Capteur de température et de luminosité Raspberry Pi
  4. Éclairage d'allée solaire au nœud de capteur sans fil MSP430
  5. Capteur de lumière activé par la voix et les SMS utilisant Raspberry Pi et Twilio
  6. Windows 10 IoT Core – Lecture des impulsions de fréquence cardiaque
  7. Capteur de lumière Raspberry Pi :un didacticiel LDR simple
  8. Capteur de lumière numérique
  9. Moniteur de fréquence cardiaque à distance