Stap 4: Arduino codering
ONDERBREKENvluchtige int tarief [10]; gebruikt om te houden IBI van laatste tien waarden
volatile unsigned long sampleCounter = 0; gebruikt om te bepalen van de timing van de pols
volatile unsigned long lastBeatTime = 0; gebruikt voor het vinden van het inter-beat-interval
vluchtige int P = 512; gebruikt voor het vinden van hoogtepunt in de pols golf
vluchtige int T = 512; gebruikt om te zoeken via pols golf
vluchtige int propageren = 512; gebruikt voor het vinden van instant moment van hartslag
vluchtige int amp = 100; gebruikt om te houden van de amplitude van pulse golfvorm
vluchtige Booleaanse firstBeat = true; zaad tarief matrix zo gewend we opstarten met redelijke BPM
vluchtige Boole secondBeat = waar; zaad tarief matrix zo gewend we opstarten met redelijke BPM
ongeldig interruptSetup() {}
Timer2 te gooien een interrupt elke 2mS initialiseert.
TCCR2A = 0X02; UITSCHAKELEN PWM OP DIGITALE PENNEN 3 EN 11, EN GA NAAR CTC MODUS
TCCR2B = 0X06; FORCEER NIET VERGELIJKEN, 256 PRESCALER
OCR2A = 0X7C; DE TOP van de graaf voor 500Hz SAMPLINGFREQUENTIE ingesteld op 124
TIMSK2 = 0X02; INSCHAKELEN ONDERBREKEN OP DE MATCH TUSSEN TIMER2 EN OCR2A
Sei(); CONTROLEER OF GLOBAL INTERRUPTS ZIJN INGESCHAKELD
}
DIT IS DE TIMER 2 INTERRUPT SERVICE ROUTINE.
Timer 2 zorgt ervoor dat wij een lezing elke 2 miliseconden
ISR(TIMER2_COMPA_vect) {/ / geactiveerd wanneer Timer2 naar 124 telt
cli(); interrupts uitschakelen terwijl we dit doen
Signaal = analogRead(pulsePin); Lees de Pulse-Sensor
sampleCounter += 2; bijhouden van de tijd in mS met deze variabele
int N = sampleCounter - lastBeatTime; bewaken van de tijd sinds de laatste beat om te voorkomen dat lawaai
vinden van de piek en dal van de pols golf
Als (signaal < propageren & & N > (IBI/5) * 3) {/ / dichrotic ruis te vermijden door te wachten 3/5 van laatste IBI
Als (signaal < T) {/ / T is de trog
T = signaal; bijhouden van laagste punt in de pols golf
}
}
Als (signaal > propageren & & signaal > P) {/ / propageren voorwaarde helpt voorkomen dat lawaai
P = signaal; P is de piek
} / / bijhouden van hoogtepunt in de pols golf
NU IS HET TIJD OM TE ZOEKEN DE HARTSLAG
Spanningspulsen signaal omhoog in waarde, telkens als er een puls
Als (N > 250) {/ / hoge frequentie ruis te voorkomen
Als ((signaal > propageren) & & (Pulse == false) & & (N > (IBI/5) * 3)) {}
Pulse = true; set de Pulse-vlag als we er denken is een puls
digitalWrite(blinkPin,HIGH); pin 13 LED inschakelen
IBI = sampleCounter - lastBeatTime; meten van de tijd tussen de beats in mS
lastBeatTime = sampleCounter; bijhouden van de tijd voor volgende pulse
if(firstBeat) {/ / als het is de eerste keer vonden we een beat, als firstBeat == TRUE
firstBeat = false; firstBeat markering wissen
terugkeer; IBI waarde is onbetrouwbaar dus gooi het
}
if(secondBeat) {/ / als dit de tweede beat, if is secondBeat == TRUE
secondBeat = false; secondBeat markering wissen
for (int i = 0; ik < = 9; i ++) {/ / zaad van het lopende totaal te krijgen een realisitic BPM bij het opstarten
tarief [i] = IBI;
}
}
Houd een lopend totaal van de laatste 10 IBI-waarden
woord runningTotal = 0; Schakel de runningTotal variabele
voor (int i = 0; ik < = 8; i ++) {/ / verplaatsen van gegevens in de array tarief
tarief [i] = overdrachtsnelheid [i + 1]; en neerzetten van de oudste IBI-waarde
runningTotal += tarief [i]; de 9 oudste IBI waarden optellen
}
Stem op [9] = IBI; de nieuwste IBI toevoegen aan de matrix tarief
runningTotal += tarief [9]; de nieuwste IBI aan runningTotal toevoegen
runningTotal / = 10; de laatste 10 IBI gemiddelden
BPM = 60000/runningTotal; Hoeveel beats kunnen passen in een minuut? dat is de BPM!
QS = true; Stel zelf gekwantificeerd vlag
QS VLAG WORDT NIET GEWIST BINNEN DEZE ISR
}
}
Als (signaal < propageren & & Pulse == true) {/ / wanneer de waarden worden naar beneden, de beat is voorbij
digitalWrite(blinkPin,LOW); uitschakelen van de pin 13 LED
Pulse = false; reset van de Pulse-vlag, zodat we het weer doen kunnen
amp = P - T; krijgen van de amplitude van de Golf van de pols
propageren = amp/2 + T; set propageren op 50% van de amplitude
P = propageren; deze voor de volgende keer opnieuw instellen
T = propageren;
}
Als (N > 2500) {/ / als 2,5 seconden gaan zonder een beat
propageren = 512; set propageren standaard
P = 512; P standaardwaarde instellen
T = 512; T standaardwaarde instellen
lastBeatTime = sampleCounter; de lastBeatTime op de hoogte brengen
firstBeat = true; Dit om te voorkomen dat lawaai instellen
secondBeat = true; Wanneer we de hartslag terug te krijgen
}
Sei(); inschakelen onderbreekt wanneer youre gedaan!
} / / einde van isr
ARDUINO
/*
>> Sensor Amped 1.1 pulse <<
Deze code is voor Pulse Sensor Amped door Joel Murphy en Yury Gitman
www.pulsesensor.com
>>> Pulse Sensor paarse draad naar analoge Pin 0 gaat <<<
Pulse Sensor monster acquisitie en verwerking gebeurt op de achtergrond via Timer 2 interrupt. samplefrequentie van 2mS.
PWM op pin 3 en 11 zal niet werken wanneer using zulks wetboek, omdat we zijn met behulp van Timer 2!
De volgende variabelen worden automatisch bijgewerkt:
Signaal: int die in het bezit van het analoge signaal gegevens rechtstreeks uit de sensor. bijgewerkt elke 2mS.
IBI: int die in het bezit van het tijdsinterval tussen beats. resolutie van de 2mS.
BPM: int die in het bezit van de hartslag, ontleend elke beat, gemiddeld vorige 10 IBI-waarden.
QS: boolean die true wanneer de Pulse is gevonden is en BPM is bijgewerkt. Gebruiker moet opnieuw instellen.
Pulse: Boolean-waarde die geldt als een hartslag is voelde dan vals in de tijd met pin13 LED uitgaan.
Deze code is ontworpen met seriële uitvoergegevens naar Processing Schets "PulseSensorAmped_Processing-xx"
De Processing schets is een eenvoudige data-visualisatie.
Al het werk te vinden van de hartslag en het bepalen van de hartslag gebeurt in de onderstaande code.
Pin 13 LED zal knipperen met hartslag.
Als u pin 13 voor iets anders gebruiken wilt, past u de interrupt handler
Het zal ook een LED op pin fadePin met elke beat vervagen. Zet een LED en een serie weerstand van fadePin naar GND.
Bekijk hier voor gedetailleerde code walkthrough:
http://pulsesensor.myshopify.com/pages/Pulse-sensor-Amped-Arduino-v1dot1
Code versie 02 door Joel Murphy & Yury Gitman najaar 2012
Deze update wijzigt de naam van de HRV-variabele aan IBI, wat voor inter Beat Interval, voor de duidelijkheid staat.
De interrupt overgeschakeld naar Timer2. 500Hz samplefrequentie, 2mS resolutie IBI waarde.
Fade LED pin verhuisde naar pin 5 (gebruik van Timer2 schakelt PWM op pin 3 & 11).
Opgeruimd van inefficiënties sinds de laatste versie.
*/
VARIABELEN
int pulsePin = 0; Hartslag Sensor paarse draad aangesloten op analoge pin 0
int blinkPin = 7; PIN te knipperen leidde bij elke hartslag
int fadePin = 5; PIN te verbeelden stijlvolle fading knipperen bij elke hartslag
int fadeRate = 0; gebruikt voor LED fade op met PWM op fadePin
deze variabelen zijn volatiel, omdat ze worden gebruikt tijdens de interrupt service routine!
vluchtige int BPM; gebruikt om te houden van de polsslag
vluchtige int signaal; houdt de binnenkomende onbewerkte gegevens
vluchtige int IBI = 600; houdt de tijd tussen de beats, het Interval tussen Beat
vluchtige Booleaanse Pulse = false; waar wanneer pulse wave hoog, false is als het lage
vluchtige Booleaanse QS = false; waar wordt als Arduoino een beat vindt.
VOID Setup {}
pinMode(blinkPin,OUTPUT); PIN die naar uw hartslag zal knipperen!
pinMode(fadePin,OUTPUT); PIN dat tot je hartslag vervagen zal!
Serial.begin(115200); We willen snel praten!
interruptSetup(); stelt te lezen Pulse Sensor signaal elke 2mS
UN-COMMENT de volgende regel als u zijn het VOEDEN van de Pulse-Sensor op laagspanning,
EN DIE SPANNING VAN TOEPASSING OP DE PIN A-REF
analogReference(EXTERNAL);
}
void loop {}
sendDataToProcessing (de ', signaal); Stuur verwerking van de ruwe gegevens van de Pulse Sensor
Als (QS == true) {/ / gekwantificeerd zelf vlag geldt wanneer arduino een hartslag vindt
fadeRate = 255; 'FadeRate' variabele ingesteld op 255 te vervagen LED met pulse
sendDataToProcessing('B',BPM); Stuur hartslag met een 'B'-prefix
sendDataToProcessing('Q',IBI); tijd tussen beats met een voorvoegsel 'Q' verzenden
QS = false; Reset de vlag gekwantificeerd zelf voor de volgende keer
}
ledFadeToBeat();
vertraging(20); Neem een pauze
}
ongeldig ledFadeToBeat() {}
fadeRate-= 10; LED vervagen waarde instellen
fadeRate = constrain(fadeRate,0,255); LED vervagen waarde in negatieve getallen gaan houden!
analogWrite(fadePin,fadeRate); vervagen van LED
}
VOID sendDataToProcessing (char symbool, int data) {}
Serial.Print(Symbol); symbool voorvoegsel vertelt verwerken wat voor soort gegevens komt
Serial.println(Data); de gegevens moeten worden verzonden die wordt afgesloten met een regeleinde
}