Étape 4: Arduino codage
INTERRUPTtaux de volatile int [10] ; utilisé pour stocker des valeurs de dernier dix IBI
volatile unsigned long sampleCounter = 0 ; utilisé pour déterminer le minutage de l’impulsion
volatile unsigned long lastBeatTime = 0 ; utilisé pour trouver l’intervalle de temps inter
volatile int P = 512 ; utilisé pour trouver la pointe dans l’onde de pouls
volatile int T = 512 ; utilisé pour trouver des creux dans l’onde de pouls
battre le volatile int = 512 ; utilisé pour trouver instantanément moment de battement de coeur
volatile int amp = 100 ; utilisé pour maintenir l’amplitude de l’onde de pouls
volatil firstBeat boolean = true ; utilisé en tableau de taux de graines donc nous démarrage avec BPM raisonnable
volatil secondBeat boolean = true ; utilisé en tableau de taux de graines donc nous démarrage avec BPM raisonnable
void interruptSetup() {}
Initialise le Timer2 pour lancer une interruption chaque 2mS.
TCCR2A = 0 X 02 ; DISABLE PWM SUR BROCHES NUMÉRIQUES 3 ET 11 ET ALLER DANS LE MODE DE LA CCT
TCCR2B = 0 X 06 ; NE FORCEZ PAS COMPARER, PRÉDIVISEUR 256
OCR2A = 0X7C ; POSER le toit du comte de 124 pour la fréquence d’échantillonnage de 500Hz
TIMSK2 = 0 X 02 ; ENABLE INTERROMPRE LE MATCH ENTRE LE TIMER2 ET OCR2A
SEI() ; ASSUREZ-VOUS QUE GLOBAL INTERRUPTIONS SONT ACTIVÉES
}
IL S’AGIT DE LA MINUTERIE 2 INTERRUPT SERVICE ROUTINE.
Minuterie 2 permet de s’assurer que nous prenons une lecture chaque 2 millisecondes
ISR(TIMER2_COMPA_vect) {/ / déclenchée lorsque Timer2 a atteint 124
CLI() ; désactiver les interruptions pendant que nous le faisons
Signal = analogRead(pulsePin) ; lire le capteur d’impulsions
sampleCounter += 2 ; garder une trace du temps en mS avec cette variable
int N = sampleCounter - lastBeatTime ; surveiller le temps depuis le dernier battement pour éviter le bruit
trouver la crête et le creux de la vague d’impulsion
Si (Signal < battre & & N > (IBI/5) * 3) {/ / éviter les bruits de la fonction en attendant 3/5 des dernier IBI
Si (Signal < T) {/ / T est la fosse
T = Signal ; garder une trace de point le plus bas dans l’onde de pouls
}
}
Si (Signal > battre & & Signal > P) {/ / battre condition permet d’éviter les bruits
P = Signal ; P est le sommet
} / / suivi de point culminant dans l’onde de pouls
MAINTENANT IL EST TEMPS DE CHERCHER LE BATTEMENT DU CŒUR
signaler les surtensions vers le haut en valeur chaque fois qu’il y a une impulsion
Si (N > 250) {/ / éviter les bruits de haute fréquence
Si ((Signal > battre) & & (Pulse == false) & & (N > (IBI/5) * 3)) {}
Pulse = true ; l’indicateur de pouls lorsque nous pensons qu’il est une impulsion
digitalWrite(blinkPin,HIGH) ; tourner sur la broche 13 LED
IBI = sampleCounter - lastBeatTime ; mesurer le temps entre deux battements en mS
lastBeatTime = sampleCounter ; garder une trace de temps pour la prochaine impulsion
if(firstBeat) {/ / si c’est la première fois nous avons trouvé a battu, si firstBeat == TRUE
firstBeat = false ; effacer firstBeat indicateur
retour ; Valeur IBI n’est pas fiable alors jetez-le
}
if(secondBeat) {/ / si c’est le deuxième battement, si secondBeat = TRUE
secondBeat = false ; Effacez secondBeat indicateur
pour (int i = 0; j’ai < = 9; i ++) {/ / semences le fonctionnement total pour obtenir une realisitic BPM au démarrage
taux de [i] = IBI ;
}
}
Gardez un total cumulé des 10 dernières valeurs IBI
runningTotal mot = 0 ; effacer la variable runningTotal
pour (int i = 0; j’ai < = 8; i ++) {/ / déplacement des données dans le tableau des taux
taux de [i] = taux [i + 1] ; Déposez la plus ancienne valeur IBI
taux de += runningTotal [i] ; additionner les valeurs IBI plus anciennes 9
}
Note [9] = IBI ; Ajouter la dernière IBI au tableau des taux
taux de runningTotal += [9] ; Ajouter la dernière IBI à runningTotal
runningTotal / = 10 ; moyenne des 10 dernières valeurs IBI
BPM = 60000/runningTotal ; Combien de temps peuvent s’insérer dans une minute ? C’est le BPM !
QS = true ; Définissez quantifié Self indicateur
INDICATEUR DE LA QS NE S’EFFACE PAS À L’INTÉRIEUR DE CE RAPPORT DE RECHERCHE INTERNATIONALE
}
}
Si (Signal < battre & & Pulse == true) {/ / lorsque les valeurs sont en baisse, le rythme est plus
digitalWrite(blinkPin,LOW) ; désactiver les LED pin 13
Pulse = false ; réinitialiser l’indicateur de pouls, alors nous pouvons le faire à nouveau
amp = P - T ; obtenir l’amplitude de l’onde de pouls
battre = amp/2 + T ; battre le jeu à 50 % de l’amplitude
P = battre ; réinitialiser ces pour la prochaine fois
T = battre ;
}
Si (N > 2500) {/ / si 2,5 secondes passent sans un battement
battre = 512 ; battre le jeu par défaut
P = 512 ; la valeur par défaut de P
T = 512 ; la valeur par défaut de T
lastBeatTime = sampleCounter ; mettre le lastBeatTime à jour
firstBeat = true ; Réglez ces pour éviter le bruit
secondBeat = true ; Quand nous rentrerons le battement du cœur
}
SEI() ; Enable interrompt quand vous êtes fait !
} / / fin isr
ARDUINO
/*
>> Capteur amplifié 1.1 d’impulsion <<
Ce code est pour capteur de pouls Amped par Joel Murphy et Yury Gitman
www.pulsesensor.com
>>> Capteur d’impulsions fil violet va sur broche analogique 0 <<<
Acquisition d’échantillon de capteur d’impulsions et traitement se passe en arrière-plan via 2 Timer interrupt. fréquence d’échantillonnage de 2 ms.
PWM sur les broches 3 et 11 ne fonctionne pas lorsque vous utilisez ce code, parce que nous utilisons Timer 2 !
Les variables suivantes sont automatiquement mis à jour :
Signal : int qui contient les données de signal analogique directement à partir du capteur. mis à jour chaque 2mS.
IBI : int qui contient l’intervalle de temps entre les battements. résolution de 2 ms.
BPM : int qui contient la valeur de la fréquence cardiaque, dérivé chaque battement, avec une moyenne de 10 valeurs de IBI précédentes.
QS : valeur booléenne qui est faite de vrai chaque fois que l’impulsion se trouve et BPM sont mis à jour. L’utilisateur doit réinitialiser.
Pouls : valeur booléenne qui est true lorsqu’un battement de coeur est senti faux puis dans le temps avec LED pin13 sortir.
Ce code est conçu avec la sortie de données série de traitement sketch « PulseSensorAmped_Processing-xx »
L’esquisse de traitement est un visualiseur de données simples.
Tout le travail pour déterminer le rythme cardiaque et la fréquence cardiaque se produit dans le code ci-dessous.
Broche 13 LED clignote avec heartbeat.
Si vous souhaitez utiliser la broche 13 pour autre chose, ajuster le gestionnaire d’interruption
Cela disparaîtra aussi une LED sur tige fadePin à chaque battement. Mettre une résistance série et LED de fadePin à GND.
Cliquez ici pour la procédure pas à pas détaillé de code :
http://pulsesensor.myshopify.com/pages/Pulse-Sensor-Amped-Arduino-v1dot1
Code de Version 02 par Joel Murphy & Yury Gitman automne 2012
Cette mise à jour modifie le nom de variable de VRC à IBI, acronyme de inter-Beat intervalle, pour plus de clarté.
Passé l’interruption à Timer2. Fréquence d’échantillonnage de 500Hz, 2 ms résolution valeur IBI.
Se fanent LED pin s’installe à la broche 5 (utilisation du Timer2 désactive PWM sur les broches 3 et 11).
Rangé les inefficacités depuis la dernière version.
*/
VARIABLES
int pulsePin = 0 ; Impulsion capteur violet fil connecté à broche analogique 0
int blinkPin = 7 ; broche à clignoter conduit à chaque battement
int fadePin = 5 ; broche pour fantaisie chic décoloration blink à chaque battement
int fadeRate = 0 ; utilisé pour se faner LED sur avec PWM sur fadePin
ces variables sont instables car ils sont utilisés au cours de la routine d’interruption du service !
volatile int puls/min ; utilisée pour stocker la valeur du pouls
volatile int Signal ; contient les données brutes entrantes
volatile int IBI = 600 ; détient le temps entre deux battements, l’intervalle inter-Beat
volatil Pulse booléen = false ; true lorsque l’onde de pouls est élevé, false lorsqu’elle est faible
volatils QS booléens = false ; prend la valeur true lorsque Arduoino trouve un battement.
void setup() {}
pinMode(blinkPin,OUTPUT) ; goupille qui se mettra à clignoter à votre rythme cardiaque !
pinMode(fadePin,OUTPUT) ; goupille qui se dissipera à votre rythme cardiaque !
Serial.Begin(115200) ; Nous sommes d’accord parler vite !
interruptSetup() ; met en place à lu signal capteur d’impulsions chaque 2mS
UN commentaire la ligne suivante si vous êtes mise sous tension du capteur d’impulsions à basse tension,
ET DEMANDER QUE LA TENSION SUR LA BROCHE A-REF
analogReference(EXTERNAL) ;
}
void loop() {}
sendDataToProcessing (les de ', de Signal) ; Envoyer les données brutes du capteur d’impulsions de traitement
Si (QS == true) {/ / drapeau Self quantifié est vrai quand arduino trouve un battement de coeur
fadeRate = 255 ; La valeur « fadeRate » Variable 255 se faner LED avec impulsion
sendDataToProcessing('B',BPM) ; Envoyer la fréquence cardiaque avec un préfixe « B »
sendDataToProcessing('Q',IBI) ; Envoyer le temps entre deux battements avec le préfixe « Q »
QS = false ; réinitialiser l’indicateur auto quantifiés pour la prochaine fois
}
ledFadeToBeat() ;
Delay(20) ; Faites une pause
}
void ledFadeToBeat() {}
fadeRate-= 10 ; valeur de fondu de LED
fadeRate = constrain(fadeRate,0,255) ; valeur fondu LED empêcher d’entrer dans les nombres négatifs !
analogWrite(fadePin,fadeRate) ; fondu de LED
}
void sendDataToProcessing (symbole de char, int data) {}
Serial.Print(Symbol) ; préfixe de symbole indique quel type de données provient de la transformation
Serial.println(Data) ; les données à envoyer qui a abouti à un retour chariot
}