Pulso Cardiaco

Para el ejemplo se ha usado los siguiente elementos:

  • Arduino Uno
  • Sensor de pulso cardiaco
  • cables de conexión

En las figuras se muestra el tipo de  sensor usado:

El sensor dispone de tres pines: Señal (S), Vcc(+) y GND (-)

La señal obtenida es de tipo analógica, se conecta a pines analógicos del Arduino para el ejemplo el  marcados como A0. El arduino cuantifica el valor y lo envía al puerto serial para procesar los datos.

Para evitar interferencias en las lecturas, se recomienda cubrir el sensor durante el uso con material obscuro. De ésta forma el sensor recibirá solo la luz emitida por el LED (foquito).

La lectura se debe realizar en reposo para consistencia de los datos entre los pulsos.

Los datos obtenidos se envían al puerto serial para ser procesados.

El diagrama básico de conexión se muestra en el esquema:

Instrucciones Arduino

// Monitor de pulso cardiaco
//  El sensor en PIN Analógico A0

int SensorPin = 0;
int retraso = 100;
void setup ()
{
  Serial.begin (9600);
}
void loop ()
{
    double valor = analogRead (SensorPin);
    Serial.println (valor); 
    delay (retraso);
}

Grafico en Python

 Grafica "en vivo" para actualizar datos
# recibidos por puerto serial
# Plantilla para proyecto, datos de prueba aleatorios
# http://blog.espol.edu.ec/edelros/pulso-cardiaco/
# Tarea: Actualizar los datos en la función una trama para yi
#        Con los obtenidos desde el puerto Serial

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
import serial, time

# Datos Serial
puerto = 'com10'
baudios = 9600

# PARAMETROS DE LA GRAFICA
retraso = 5
ventana = 50
# rango de lectura
a = 495
b = 535

# Datos a graficar
yi = [500]*ventana

# PROCEDIMIENTO

# Inicializa comunicación con arduino
arduino = serial.Serial(puerto, baudios)
arduino.setDTR(False)  
time.sleep(0.3)  
# limpia buffer de datos anteriores
arduino.flushInput()  
arduino.setDTR()  
time.sleep(0.3)
print('\nEstado del puerto: ',arduino.isOpen())
print('Nombre del dispositivo conectado: ', arduino.name)
print('Dump de la configuración:\n ',arduino)
print('\n###############################################\n')


# GRAFICA figura
figura = plt.figure()
grafica = figura.add_subplot(111)
grafica.set_ylim(a,b)
grafica.set_title('Pulso Cardiaco')

# Linea de pulso y ventana de datos a graficar
tamano = ventana
# El gráfico usa radianes
pulso = yi[-tamano:]
lineaPulso, = grafica.plot(pulso, 'y')

# linea del pulso y puntoreferencia:
puntoPulso, = grafica.plot(len(yi)-1,yi[-1],'ro')

# Nueva Trama
def unatrama(i,yi,ventana):

    while (arduino.inWaiting()==0):
        pass #esperar hasta recibir un dato
    linea = arduino.readline() # lee puerto serial
    lectura = linea.decode().strip() # elimina /r/n
    undato = float(lectura)

    # actualiza datos xi, yi
    # xi.append(angulo) 
    yi.append(undato)# numero del dato ejemplo

    # ventana de datos a graficar
    Pulso = yi[-ventana:]
    lineaPulso.set_ydata(Pulso)
    
    # Linea y punto del Pulso
    puntoPulso.set_ydata(Pulso[-1])  

    # Presenta valores últimos valores en pantalla
    print(Pulso)

    # Si los datos son más de 1000
    # Elimina el más antiguo del historial
    if len(yi)>ventana:
        # xi.pop(0)
        yi.pop(0)
    
    return()

# Animación
ani = animation.FuncAnimation(figura,
                              unatrama,
                              fargs=(yi,ventana),
                              interval=retraso,
                              blit=True)

plt.show()