Puls Sensor Plumbob (4 / 5 steg)
Steg 4: Arduino kodning
AVBRYTAflyktiga int takt [10]. används för att hålla senaste tio IBI värden
volatile osignerade långa sampleCounter = 0; används för att bestämma puls timing
volatile osignerade långa lastBeatTime = 0; används för att hitta inter slog intervallet
flyktiga int P = 512; används för att hitta topp i pulse wave
flyktiga int T = 512; används för att hitta tråg i pulse wave
flyktiga int tröska = 512; används för att hitta instant ögonblick av hjärtrytm
flyktiga int amp = 100; används för att hålla amplituden av puls vågform
flyktiga booleska firstBeat = sant; används till utsäde rate array så vi start med rimlig BPM
flyktiga boolean secondBeat = sant; används till utsäde rate array så vi start med rimlig BPM
void interruptSetup() {
Initierar Timer2 att kasta ett avbrott varje 2mS.
TCCR2A = 0X02; INAKTIVERA PWM PÅ DIGITAL STIFT 3 OCH 11, OCH GÅ IN I CTC LÄGE
TCCR2B = 0X06; TVINGA INTE JÄMFÖRA, 256 PRESCALER
OCR2A = 0X7C; SATTS upp på räkningen till 124 för 500Hz SAMPLINGSFREKVENS
TIMSK2 = 0X02; AKTIVERA AVBRYTA PÅ MATCHEN MELLAN TIMER2 OCH OCR2A
SEI(); SE TILL ATT GLOBALA AVBROTT ÄR AKTIVERADE
}
DETTA ÄR TIMER 2 AVBROTTSTJÄNSTENS RUTIN.
Timer 2 ser till att vi tar en behandling varje 2 millisekunder
ISR(TIMER2_COMPA_vect) {/ / utlösas när Timer2 räknar till 124
CLI(); Inaktivera avbrott medan vi gör detta
Signal = analogRead(pulsePin); Läs puls Sensor
sampleCounter += 2. hålla koll på tiden i mS med denna variabel
int N = sampleCounter - lastBeatTime; övervaka tiden efter senaste beat att undvika buller
hitta den topp- och botten av pulse wave
om (Signal < tröska & & N > (IBI/5) * 3) {/ / undvika dichrotic buller som väntar 3/5 i senaste IBI
om (Signal < T) {/ / T är tråg
T = Signal; hålla reda på lägsta punkten i pulse wave
}
}
om (Signal > tröska & & Signal > P) {/ / tröska tillstånd hjälper till att undvika buller
P = Signal; P är toppen
} / / hålla koll på högsta punkten i pulse wave
NU ÄR DET DAGS ATT LETA EFTER HJÄRTRYTM
signalera rusar upp i värde varje gång det kommer en puls
om (N > 250) {/ / undvika högfrekvent brus
om ((Signal > tröska) & & (puls == false) & & (N > (IBI/5) * 3)) {
Puls = sant; ange flaggan puls när vi tror att det är en puls
digitalWrite(blinkPin,HIGH); slå på stift 13 LED
IBI = sampleCounter - lastBeatTime; mäter tiden mellan slag i mS
lastBeatTime = sampleCounter; hålla koll på tiden för nästa puls
IF(firstBeat) {/ / om det är första gången vi hittade en beat, om firstBeat == TRUE
firstBeat = false; Rensa firstBeat flagga
hemkomst. IBI värdet är opålitlig så ignorera det
}
IF(secondBeat) {/ / om detta är det andra beat, if secondBeat == TRUE
secondBeat = false; Rensa secondBeat flagga
för (int jag = 0; jag < = 9; i ++) {/ / frö kör totalt att få en realisitic BPM vid start
Rate [i] = IBI;
}
}
hålla en löpande summa av senaste 10 IBI värden
ordet runningTotal = 0; Rensa runningTotal variabeln
för (int jag = 0; jag < = 8; i ++) {/ / flytta data i matrisen kurs
Rate [i] = Betygsätt [jag + 1]; och släpp äldsta IBI värdet
runningTotal += rate [i]; Lägg upp 9 äldsta IBI värdena
}
Betygsätt [9] = IBI; lägga till den senaste IBI i arrayen kurs
runningTotal += rate [9]. lägga till den senaste IBI runningTotal
runningTotal = 10; senaste 10 IBI medelvärden
BPM = 60000/runningTotal; Hur många slag kan passa in i en minut? Det är BPM!
QS = sant; Kvantifierade Self flaggan
QS FLAGGA RENSAS INTE INUTI DENNA ISR
}
}
om (Signal < tröska & & puls == true) {/ / när värdena går, beat är över
digitalWrite(blinkPin,LOW); stänga av stift 13 LED
Puls = false; återställa flaggan puls så att vi kan göra det igen
amp = P - T; få amplitud av pulse wave
tröska = amp/2 + T; uppsättning tröska på 50% av amplituden
P = tröska; återställa dessa för nästa gång
T = tröska;
}
om (N > 2500) {/ / om 2,5 sekunder gå utan ett beat
tröska = 512; uppsättning tröska standard
P = 512; ställa in P standard
T = 512; Ange T standard
lastBeatTime = sampleCounter; ta lastBeatTime uppdaterad
firstBeat = sant; Ange att dessa ska undvika buller
secondBeat = sant; När vi får hjärtslagen tillbaka
}
SEI(); Aktivera avbryter när du är klar!
} / / end isr
ARDUINOEN
/*
>> Puls Sensor Amped 1.1 <<
Denna kod är för puls Sensor Amped av Joel Murphy och Yury Gitman
www.pulsesensor.com
>>> Puls Sensor lila tråd går till analoga stift 0 <<<
Puls Sensor provtagning och behandling sker i bakgrunden via Timer 2 avbrott. 2mS samplingsfrekvens.
PWM på stift 3 och 11 fungerar inte när du använder denna kod, eftersom vi använder Timer 2!
Följande variabler uppdateras automatiskt:
Signal: int som håller den analoga signalen datan direkt från sensorn. uppdateras varje 2mS.
IBI: int som håller tidsintervallet mellan slår. 2mS resolution.
BPM: int som håller pulsen, kommer varje beat, från tidigare 10 IBI värden i genomsnitt.
QS: boolean som görs true puls är försumbart och BPM är uppdaterad. Användaren måste återställa.
Puls: booleskt värde som är sant när ett hjärtslag är kände sedan false i tid med pin13 LED går ut.
Denna kod är utformad med utgång data till bearbetning skiss "PulseSensorAmped_Processing-xx"
Bearbetning skissen är en enkel data visualizer.
Allt arbete för att hitta hjärtslagen och bestämma hjärtrytm händer i koden nedan.
Stift 13 LED blinkar med heartbeat.
Om du vill använda stift 13 för något annat, justera avbrottshanterare
Det kommer också att försvinna en LED på pin fadePin med varje taktslag. Sätta en LED och serien motstånd från fadePin till GND.
Kolla här för detaljerade kod genomgång:
http://pulsesensor.myshopify.com/pages/Pulse-sensor-Amped-Arduino-v1dot1
Versionen 02 av Joel Murphy & Jurij Gitman hösten 2012
Den här uppdateringen ändrar HRV variabelnamnet till IBI, som står för mellan Beat intervall, för klarhet.
Bytte avbrottet till Timer2. 500Hz samplingsfrekvens, 2mS resolution IBI värde.
Fade LED stift flyttade till stift 5 (användning av Timer2 inaktiverar PWM på stift 3 och 11).
Städade ineffektivitet sedan den förra versionen.
*/
VARIABLER
int pulsePin = 0; Puls Sensor lila tråd ansluten till analoga stift 0
int blinkPin = 7. PIN blinka ledde på varje taktslag
int fadePin = 5; stift till fancy classy blekning blink på varje taktslag
int fadeRate = 0; används för att blekna LED på med PWM på fadePin
dessa variabler är flyktiga eftersom de används under avbrottstjänstens rutin!
flyktiga int BPM; används för att hålla pulsen
flyktiga int Signal; innehar inkommande rådata
flyktiga int IBI = 600; håller tiden mellan beats, mellan Beat intervallet
flyktiga booleska puls = false; sant när pulse wave är hög, falskt när det är lågt
flyktiga booleska QS = false; blir sant när Arduoino finner ett beat.
void setup() {
pinMode(blinkPin,OUTPUT); PIN-kod som kommer att blinka till ditt hjärta!
pinMode(fadePin,OUTPUT); PIN-kod som kommer att blekna till ditt hjärta!
Serial.BEGIN(115200); Vi är överens om att prata snabbt!
interruptSetup(); ställer in för att läsa puls Sensor signal varje 2mS
O-kommentera nästa rad om du driver puls Sensor vid låg spänning,
OCH TILLÄMPA DEN SPÄNNINGEN TILL A-REF STIFT
analogReference(EXTERNAL);
}
void loop() {
sendDataToProcessing ('S ', Signal); Skicka bearbetning raw puls Sensor-data
om (QS == true) {/ / kvantifierade Self flagga är sant när arduino finner ett hjärtslag
fadeRate = 255; Ange "fadeRate" variabel till 255 blekna LED med puls
sendDataToProcessing('B',BPM); Skicka puls med prefixet "B"
sendDataToProcessing('Q',IBI); Skicka tid mellan beats med prefixet "Q"
QS = false; återställa flaggan kvantifierade Self till nästa gång
}
ledFadeToBeat();
Delay(20); ta en paus
}
void ledFadeToBeat() {
fadeRate-= 10. värdet för LED-fade
fadeRate = constrain(fadeRate,0,255); hålla LED fade värde från att gå in i negativa tal!
analogWrite(fadePin,fadeRate); Fade LED
}
void sendDataToProcessing (char symbol, int data) {
Serial.Print(symbol); valutasymbolen skrivs som prefix berättar behandling vilken typ av data kommer
Serial.println(data); data som ska skickas avslutas med en radmatning
}