Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Desde KY-039 a frecuencia cardíaca

Componentes y suministros

Arduino UNO
× 1
Sensor de latido del corazón KY-039
× 1
Cables de puente (genéricos)
× 1

Acerca de este proyecto

En el conjunto de 37 sensores para Arduino , hay un sensor de latidos. El nombre promete demasiado. La gente tiende a pensar que proporciona un número digital a través de I2C o algo similar, un número que es la frecuencia cardíaca. Lo que proporciona el sensor es solo un valor "analógico" de 0 a 1023, que indica cuánta luz infrarroja recibe el sensor de luz o, en realidad, cuánto está sombreando el sensor de luz . Cuanto mayor sea el valor, menos luz infrarroja.

En resumen:coloque su dedo entre el led IR y el transistor de luz del sensor. Los latidos de su corazón dilatan los vasos sanguíneos de su dedo, que filtrarán el IR. Esto crea una señal pulsante.

En este proyecto, describo cómo esta señal se convierte en una frecuencia cardíaca como 66 BPM (latidos por minuto).

Los sencillos pasos

Si acaba de leer y trazar los valores del sensor KY-039, obtendrá algo como esto:

Los valores son valores enteros. No muy exacto. En su lugar, calcule un promedio de varios de ellos y grafique el promedio. Obtienes esto:

Aquí ya puedes ver el pulso del corazón. Obtenga la diferencia de tiempo entre cada aumento significativo del pulso. A partir de ahí, puede calcular la frecuencia cardíaca en BPM.

(El pequeño patrón en zigzag en la imagen de arriba se debe a la luz artificial, 50 Hz, otra cosa con la que uno tiene que lidiar).

Pasos explicados

Aquí hay un código simple para generar lo que lea del sensor KY-039:

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

Lo que podría obtener es algo como esto:

Dado que este es un título de la ventana del monitor en serie que lee la salida en serie de su Arduino a 9600 baudios, el Serial.print () cronometra todo el proceso. función, que establecerá una tasa para leer y trazar los valores. De todos modos, la curva es muy irregular, porque varía entre 360 ​​y 383 y solo tiene valores enteros.

Suavizado

Para obtener una salida más suave, tome un promedio de, digamos, 20 últimas lecturas del sensor. Así es como lo hago. Defino una constante diciendo cuántas lecturas quiero:

  #define samp_siz 20  

Entonces tengo una matriz que contiene esa cantidad de lecturas:

  int lee [samp_siz];  

Para cada nueva lectura, resto la lectura más antigua de una suma y agrego la lectura más nueva a la suma. En la matriz, reemplazo la lectura más antigua por la más reciente.

  lector =analogRead (sensorPin); // lee la suma del sensor - =lee [ptr]; // restar la lectura más antigua de suma suma + =lector; // agrega la lectura más reciente a la suma reads [ptr] =reader; // guarda la lectura más reciente en la matriz last =float (sum) / samp_siz; // calcula el promedio ahora ptr ++; // actualizar el índice de la matriz, tener ptr% =samp_siz; // se reinicia en 0 cuando es necesario  

Con un tamaño de matriz de 20 y una velocidad en baudios de 9600 en el monitor en serie, podría obtener un trazado como este:

Aquí puede ver los latidos reales del corazón como una curva ascendente empinada. Pero también ve un pequeño patrón en zig zag. El zigzag más pequeño proviene de la luz de mi cocina, tres bombillas LED que iluminan la habitación. La red eléctrica de mi casa es de 240 V, 50 Hz CA. Entonces, 50 veces por segundo hay un aumento de la intensidad de la luz, aparentemente también en la banda de infrarrojos. Me gustaría suavizar ese ruido de 50 Hz. Debería funcionar si leo los valores del sensor durante un período de 20 ms y tomo un promedio de todos los valores. Veamos ...

  n =0; inicio =milis (); lector =0 .; hacer {lector + =analogRead (sensorPin); // leer y agregar valores ... n ++; ahora =millis (); } while (ahora  

Con este fragmento, tomo las lecturas del sensor en trozos de 20 ms, que igualarán el parpadeo de 50 Hz causado por la luz artificial. Si vive en un país con 60 Hz, utilice fragmentos de 16,67 ms en su lugar. O 16667µs.

Como ya suavizo la curva en secciones de 20 ms, en realidad no necesito la matriz que usé antes, pero como está allí y se puede cambiar de tamaño fácilmente, la dejo allí. Y el uso de un tamaño de matriz de 5 parece igualar el último ruido molesto. Esto es lo que tengo ahora:

Lo último que debo hacer es reconocer cualquier parte del patrón repetido. Como la pendiente ascendente es más regular, lo hago. Observe cómo los valores del eje y son muy diferentes en todos los gráficos. Realmente no puedo confiar solo en valores absolutos. Solo puedo confiar en el ascenso y descenso de la curva. Los matemáticos hablarían de la derivada. Estoy satisfecho si encuentro n valores crecientes consecutivos, donde n podría ser un valor ajustable útil. Empiezo con 5. Para esto tengo el rise_threshold constante definida en el código. Cuando encuentro 5 valores ascendentes consecutivos, sé que estoy en la parte inferior de la curva hacia arriba. Tomo tiempo. Espero una curva descendente, luego espero los siguientes 5 valores ascendentes y anoto el tiempo. Luego imprimo el BPM correspondiente.

Hice una prueba y contados cómo muchos consecutiva subiendo valores allí son en el curva y encontrado fuera allí fueron entre 10 y 15. Entonces si yo contar a 5, yo lo hará la mayoría seguro saber tengo encontrado el empezar de el latido.

Como imprimo solo después de cada latido, no habrá mucha impresión. Habrá más tiempo para leer el sensor. Es posible que capte un ruido más frecuente, que no veré, porque el trazador no está encendido. Veamos cómo funciona.

El código 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 ahora, ptr; flotar último, lector, empezar; flotar primero, segundo, tercero, antes, print_value; bool subiendo; int Rise_count; int n; long int last_beat; for (int i =0; i  antes) {Rise_count ++; if (! Rising &&Rise_count> Rise_threshold) {// Ok, hemos detectado una curva ascendente, lo que implica un latido. // Registre el tiempo desde el último latido, realice un seguimiento de los dos // tiempos anteriores (primero, segundo, tercero) para obtener un promedio ponderado. // La bandera ascendente nos impide detectar el mismo aumento // más de una vez en aumento =verdadero; primero =milisegundos () - last_beat; last_beat =millis (); // Calcula el promedio ponderado de la frecuencia cardíaca // de acuerdo con los tres últimos latidos print_value =60000. / (0.4 * primero + 0.3 * segundo + 0.3 * tercero); Serial.print (print_value); Serial.print ('\ n'); tercero =segundo; segundo =primero; }} else {// Ok, la curva está cayendo subiendo =falso; recuento_aumenta =0; } antes =último; ptr ++; ptr% =samp_siz; }}  

Funciona bastante bien. Aquí hay un video.

Tenga en cuenta que el pequeño LED RX parpadea en el Arduino en sincronía con mi corazón. Simplemente porque cuando hay un latido, la frecuencia se calcula y se imprime en la serie, que hace parpadear el LED. Cuando el dedo se mueve un poco, habrá lecturas de error.

Mayor desarrollo

En este momento, la velocidad impresa se calcula en función de los últimos tres latidos. Pero podría ser más apropiado calcularlo basándose, por ejemplo, en un período de 15 s. Podría guardar 15 valores de tasa consecutivos, calcular la media, luego omitir los cinco valores más alejados de la media y calcular una nueva media. Esto proporcionaría una medida confiable y constante de la frecuencia cardíaca.

Solo probé el sensor en mi esposa y en mí. Cada paso para mejorar la señal lo he realizado en base a las lecturas anteriores. Alguien más podría tener otro tipo de latido que cause una curva de forma diferente, que necesita otro enfoque para encontrar el latido. Tal vez sea la curva descendente la que sea más fácil de reconocer. O la parte superior. ¿Y qué pasa si el pulso es de 180 a 200 BPM? Encontrar la curva ascendente podría ser más complicado.

Código

  • Versión final
Versión final C / C ++
El programa lee el latido e imprime la frecuencia en la ventana serial.
 #define samp_siz 4 # define rise_threshold 4 // Pulse Monitor Test Scriptint sensorPin =0; void setup () {Serial.begin (9600);} void loop () {flotante lee [samp_siz], suma; long int ahora, ptr; flotar último, lector, empezar; flotar primero, segundo, tercero, antes, print_value; bool subiendo; int Rise_count; int n; long int last_beat; for (int i =0; i  antes) {Rise_count ++; if (! Rising &&Rise_count> Rise_threshold) {// Ok, hemos detectado una curva ascendente, lo que implica un latido. // Registra el tiempo desde el último latido, realiza un seguimiento de los dos // tiempos anteriores (primero, segundo, tercero) para obtener un promedio ponderado. // La bandera ascendente evita que detectemos el mismo aumento más de una vez. creciente =verdadero; primero =milis () - last_beat; last_beat =millis (); // Calcula el promedio ponderado de la frecuencia cardíaca // de acuerdo con los tres últimos latidos print_value =60000. / (0.4 * primero + 0.3 * segundo + 0.3 * tercero); Serial.print (print_value); Serial.print ('\ n'); tercero =segundo; segundo =primero; }} else {// Ok, la curva está cayendo subiendo =falso; recuento_aumenta =0; } antes =último; ptr ++; ptr% =samp_siz; }} 

Esquemas


Proceso de manufactura

  1. Sensor de color - Trabajo y aplicaciones
  2. OPT3007 Sensor de luz ambiental ultradelgado
  3. Uso y aplicaciones del sensor de luz ambiental
  4. Transmisión de datos del sensor desde una placa ppDAQC Pi utilizando InitialState
  5. Sensor de temperatura y luz Raspberry Pi
  6. Luz solar de entrada al nodo de sensor inalámbrico MSP430
  7. Sensor de luz habilitado para voz y SMS con Raspberry Pi y Twilio
  8. Windows 10 IoT Core:lectura de pulsos de frecuencia cardíaca
  9. Sensor de luz Raspberry Pi:un tutorial sencillo de LDR
  10. Sensor de luz digital
  11. Monitor de frecuencia cardíaca remoto