Paso 4: Codificación de Arduino
INTERRUMPIRtasa de volátiles int [10]; utilizado para sostener el último IBI diez valores
volatile unsigned sampleCounter largo = 0; para determinar el tiempo de pulso
volatile unsigned lastBeatTime largo = 0; utilizado para encontrar el intervalo beat inter
volátil int P = 512; utilizado para encontrar el pico en la onda del pulso
volátil int T = 512; solía encontrar a través de la onda del pulso
trille el volátil int = 512; utilizado para encontrar el momento instantáneo de latidos cardíacos
amplificador int volátiles = 100; utiliza para mantener la amplitud de la onda de pulso
volátil firstBeat booleano = true; utilizan a matriz de tasa de semilla así inicio con BPM razonable
volátil secondBeat booleano = true; utilizan a matriz de tasa de semilla así inicio con BPM razonable
void interruptSetup() {}
Inicializa el Timer2 para lanzar una interrupción cada 2mS.
TCCR2A = 0 X 02; DESACTIVAR EL PWM EN DIGITAL PINES 3 Y 11 Y ENTRAR EN MODO DE CTC
TCCR2B = 0 X 06; NO FUERCE LA COMPARE, PRESCALER DE 256
OCR2A = 0X7C; Ponga la parte superior de la cuenta a 124 para 500Hz frecuencia de muestreo
TIMSK2 = 0 X 02; PERMITEN INTERRUMPIR EL PARTIDO ENTRE EL TIMER2 Y OCR2A
SEI(); ASEGÚRESE DE QUE SE HABILITAN LAS INTERRUPCIONES GLOBALES
}
ESTA ES LA RUTINA DE SERVICIO DE INTERRUPCIÓN DEL TEMPORIZADOR 2.
Temporizador 2 se cerciora de que tomar una lectura cada 2 milisegundos
ISR(TIMER2_COMPA_vect) {/ / cuando Timer2 cuenta a 124
CLI(); deshabilitar interrupciones mientras hacemos esto
Señal = analogRead(pulsePin); leer el Sensor del pulso
sampleCounter += 2; seguimiento del tiempo en mS con esta variable
int N = sampleCounter - lastBeatTime; controlar el tiempo desde el último golpe para evitar ruidos
encontrar el pico y a través de la onda de pulso
Si (señal < trille & & N > (IBI/5) * 3) {/ evitar dichrotic ruido en espera 3/5 del último IBI
Si (señal < T) {/ / T es a través del
T = señal; seguimiento de punto más bajo de la onda del pulso
}
}
Si (señal > trille & & señal > P) {/ / trillar condición ayuda a evitar el ruido
P = señal; P es el pico
} / / seguimiento de punto más alto de la onda del pulso
AHORA ES EL MOMENTO PARA BUSCAR LOS LATIDOS DEL CORAZÓN
señal picos para arriba en valor cada vez que hay un pulso
Si (N > 250) {/ / evitar ruido de alta frecuencia
Si ((señal > trillar) & & (pulso == false) & & (N > (IBI/5) * 3)) {}
Pulso = true; la bandera de pulso cuando pensamos que es un pulso
digitalWrite(blinkPin,HIGH); Encienda el LED del pin 13
IBI = sampleCounter - lastBeatTime; medir el tiempo entre latidos en mS
lastBeatTime = sampleCounter; seguimiento de tiempo para el próximo pulso
if(firstBeat) {/ / si es la primera vez que encontramos un beat, if firstBeat == TRUE
firstBeat = false; claro firstBeat bandera
retorno; Valor IBI no es confiable para descartarlo
}
if(secondBeat) {/ / si este es el segundo golpe, if secondBeat == TRUE
secondBeat = false; claro secondBeat bandera
para (int i = 0; i < = 9; i ++) {/ / el funcionamiento total para obtener un gratuito BPM en el inicio de la semilla
índice [i] = IBI;
}
}
Mantenga un total de los últimos 10 valores IBI
palabra runningTotal = 0; despejar la variable runningTotal
para (int i = 0; i < = 8; i ++) {/ / cambio de datos en la matriz de la tarifa
índice [i] = velocidad [i + 1]; y el valor más antiguo de IBI
runningTotal += velocidad [i]; se suman los 9 valores más antiguo de IBI
}
[9] la tarifa = IBI; Añadir el IBI más reciente a la matriz de la tarifa
runningTotal += velocidad [9]; Añadir el último IBI a runningTotal
runningTotal / = 10; promedio de los últimos 10 valores IBI
BPM = 60000/runningTotal; ¿Cuántas pulsaciones caben en un minuto? es BPM!
QS = true; establecido ser cuantificado
BANDERA DE QS NO SE BORRA DENTRO DE ESTE ISR
}
}
Si (señal < trille & & pulso == true) {/ / cuando los valores se van hacia abajo, el ritmo es más
digitalWrite(blinkPin,LOW); Apagar pin 13 LED
Pulso = false; restablecer la bandera del pulso por lo que podemos hacerlo otra vez
amp = P - T; obtener la amplitud de la onda de pulso
trillar = amp/2 + T; sistema de trilla al 50% de la amplitud
P = trillar; restablecer estas para la próxima vez
T = trillar;
}
Si (N > 2500) {/ / si 2,5 segundos pasan sin un ritmo
trillar = 512; sistema de trilla por defecto
P = 512; P por defecto
T = 512; T por defecto
lastBeatTime = sampleCounter; llevar la lastBeatTime hasta la fecha
firstBeat = true; ajústelas para evitar ruidos
secondBeat = true; cuando volvamos el latido del corazón
}
SEI(); Enable interrumpe cuando estás hecho!
} / / fin de isr
ARDUINO
/*
>> Pulso Sensor Amped 1.1 <<
Este código es para el Sensor de pulso amplificada por Joel Murphy y Yury Gitman
www.pulsesensor.com
>>> Sensor de pulso cable morado va al Pin analógico 0 <<<
Adquisición de muestra de Sensor de pulso y procesamiento sucede en el fondo a través de la interrupción del Timer 2. frecuencia de muestreo de 2ms.
PWM en los pines 3 y 11 no funcionará cuando se utiliza este código, porque estamos utilizando Timer 2.
Se actualizan automáticamente las siguientes variables:
Señal: int que contiene los datos de la señal analógica directamente desde el sensor. Actualizado cada 2mS.
IBI: int que contiene el intervalo de tiempo entre latidos. resolución de 2ms.
BPM: int que contiene el valor de la frecuencia cardíaca, deriva cada latido, con un promedio de valores anteriores de IBI 10.
QS: valor booleano que es true cuando se encuentra pulso y BPM se actualizan. Usuario debe reiniciar.
Pulso: valor booleano que es true cuando un latido del corazón es detectada luego falsa en tiempo con LED pin13 salir.
Este código está diseñado con salida serial de datos procesamiento de dibujo "PulseSensorAmped_Processing-xx"
El bosquejo de procesamiento es un visualizador de datos simples.
Todo el trabajo para encontrar el latido del corazón y determinar el ritmo cardíaco ocurre en el código siguiente.
PIN 13 LED parpadeará con latidos del corazón.
Si desea utilizar el pin 13 para otra cosa, ajustar el controlador de interrupción
También se desvanecerá un LED en pin fadePin con cada latido. Poner una resistencia de LED y series de fadePin a GND.
Comprobar código detallado tutorial:
http://pulsesensor.myshopify.com/pages/Pulse-sensor-Amped-Arduino-v1dot1
Código versión 02 por Joel Murphy & Yuri Gitman otoño 2012
Esta actualización cambia el nombre de la variable de HRV a IBI, que está parado para el intervalo entre latidos, para mayor claridad.
Cambió la interrupción al Timer2. Frecuencia de muestreo de 500Hz, 2 ms resolución valor IBI.
Se descolora LED pin se trasladó al pin 5 (uso del Timer2 desactiva PWM en pines 3 y 11).
Arreglado por ineficiencias desde la última versión.
*/
VARIABLES
int pulsePin = 0; Pulso púrpura Sensor cable conectado al pin analógico 0
int blinkPin = 7; PIN a parpadear led en cada latido
fadePin int = 5; pasador de lujo blink de decoloración con clase en cada latido
int fadeRate = 0; solía desaparecer LED en con PWM en fadePin
estas variables son volátiles porque se utilizan durante la rutina de servicio de interrupción.
int volátil BPM; utiliza para mantener el pulso
volátil int señal; contiene los datos crudos entrantes
int volátil IBI = 600; retiene el tiempo entre contracciones, el intervalo entre latidos
volátil pulso boolean = false; verdadero cuando el pulso es alto, false cuando es baja
volátiles QS boolean = false; llega a ser verdad cuando Arduoino encuentra un ritmo.
void setup() {}
pinMode(blinkPin,OUTPUT); PIN que empezará a parpadear a los latidos del corazón!
pinMode(fadePin,OUTPUT); PIN que se decoloran a los latidos del corazón!
Serial.Begin(115200); Estamos de acuerdo en hablar rápido!
interruptSetup(); poder para leer la señal del Sensor de pulso cada 2 ms
ONU-comentario la línea siguiente si está encendido el Sensor del pulso en bajo voltaje,
Y QUE LA TENSIÓN SE APLICA AL PERNO A-REF
analogReference(EXTERNAL);
}
void loop() {}
sendDataToProcessing (de ', señal); enviar procesamiento de los datos en bruto del Sensor pulso
Si (QS == true) {/ / bandera ser cuantificada es verdadera cuando arduino encuentra un latido
fadeRate = 255; Conjunto 'fadeRate' Variable de hasta 255 descolorarse LED con pulso
sendDataToProcessing('B',BPM); enviar de la frecuencia cardíaca con un prefijo 'B'
sendDataToProcessing('Q',IBI); enviar tiempo entre latidos con un prefijo 'Q'
QS = false; restablecer la bandera de ser cuantificado para la próxima vez
}
ledFadeToBeat();
Delay(20); tomar un descanso
}
void ledFadeToBeat() {}
fadeRate-= 10; Ajuste el fade de LED
fadeRate = constrain(fadeRate,0,255); evitar LED fade valor de a números negativos!
analogWrite(fadePin,fadeRate); se descolora LED
}
void sendDataToProcessing (símbolo de char, int datos) {}
Serial.Print(Symbol); Prefijo símbolo dice procesamiento viene qué tipo de datos
Serial.println(Data); los datos para enviar hasta culminar en un retorno de carro
}