Project showcase
Baumanometer with Python and Arduino UNO (ESP/ENG)

Baumanometer with Python and Arduino UNO (ESP/ENG) © GPL3+

A digital baumanometer built using an Arduino Uno board, where the data is analyzed with a slope method in Python.

  • 499 views
  • 1 comment
  • 3 respects

Components and supplies

Necessary tools and machines

inflatable armband

About this project

This project is a baunamometer made with an Arduino plate, a pressure sensor and Python, where the Arduino was used to receive the data thrown by the pressure sensor and by means of Python analyze the data to shed both the diastolic pressure and systolic.

--------------------------------------------------------------------------------------

Se construyo un baumanometro digital con el uso de una placa arduino UNO, un sensor MPX2050DP y un amplificador operacional.Donde los datos se analizaron con un método de pendientes para encontrar los picos máximos de pulsos en un intervalo de tiempo.

The Background:

The measurement of blood pressure is an essential element in medicine, whether for clinical studies of certain diseases, for the control of hypertension, or for the evaluation of the state of patients within the intensive care units and operating rooms.

There are two fundamental ways to perform the measurement of blood pressure: The first is through intermittent methods, which provide specific pressures such as systolic (PS), diastolic (PD) and average (PM), calculating in a period of time that covers more than one heartbeat. The second is through continuous methods, those that provide punctual pressures beat by beat, or the shape of the continuous wave of blood pressure, or both.

Blood pressure can be measured in an invasive (direct) and non-invasive (indirect) way, with potentially more accurate invasive methods, but with the complexity and inconvenience of its application, non-invasive methods are the most widespread. Non-invasive measuring devices are safer and easier to use than invasive ones and can be used in situations where invasive measurement is not absolutely necessary.

--------------------------------------------------------------------------------------

La medición de la presión arterial es un elemento imprescindible en la medicina, ya sea para estudios clínicos de determinadas enfermedades, para el control de la hipertensión, o para la evaluación del estado de pacientes dentro de las unidades de cuidados intensivos y salones de operaciones.

Existen dos formas fundamentales de realizar de realizar la medición de la presión arterial: La primera es mediante los Métodos intermitentes, los que brindan presiones puntuales como la sistólica(PS), diastólica(PD) y media(PM), calculándolas en un periodo de tiempo que cubre más de un latido del corazón.La segunda es mediante los Métodos continuos, los que brindan presiones puntuales latido a latido, o la forma de la onda continua de la presión arterial, o ambos.

La presión arterial puede medirse de forma invasiva (directa) y no invasiva (indirecta), siendo los métodos invasivos potencialmente más exactos, pero con la complejidad e inconveniencia en su aplicación hacen que los métodos no invasivos sean por el contrario los más extendidos. Los equipos de medición no invasiva son más seguros y fáciles de usar que los invasivos y pueden ser utilizados en situaciones en las que la medición invasiva no es absolutamente necesaria

The Project:

To measure the pressure using a pressure sensor, this sensor is a potential difference that is proportional to the pressure it measures, the potential difference that is too small for the Arduino to detect it, due to this it has to use a operational amplifier, to amplify the voltage delivered by the sensor, once this took place, the output voltage was connected to the terminal A0. To work, the sensor needs a power of less than 5 volts, this was obtained from the 5 volt port of the Arduino.

The pressure sensor has two inputs, one of which is inserted into a hose that the sale of the bracelet that is placed on the biceps, the other sensor input is exposed to atmospheric pressure, when the bracelet is spoken, the sensor sends the voltage that is amplified. This voltage will subsequently become a unit of pressure, mm of Hg to be exact.

After this, the output voltage is tested, amplified, changed, the cuff pressure is increased, a simple code is written, recorded, the Arduino and the tool are recognized. Test to see if the sensor had enough resolution so that the pulses of blood are seen in the Serial Plotter of the Arduino, is in the form of peaks.

After doing all the necessary tests, now we proceeded to elaborate the code that could detect the observed peaks, which correspond to the pulse. The first pressure peak is observed when the blood pressure is large enough to beat the pressure exerted by the cuff, this first peak corresponds to the so-called systolic pressure, so the code must detect this first peak and convert it to mm of mercury, the posterior peaks correspond to pulses of blood, the diastolic pressure is supposed to correspond to the last pulse peak, according to the manufacturers of digital baumanometers this is not taken so when a sensor is used, the diastolic pressure is taken when there is a peak at which its height is 60% of the first peak, this is taken as the diastolic pressure.

To detect those peaks, a method is used that detects the change of sign on the slopes, the data that arrives at the Arduino is sent to python, once they reach python they become pressure units (Hg mm), this It is done with a formula that was obtained by calibrating the sensor with a mercury manometer, the voltage that the sensor sent at different pressures was measured, it was done several times and from there a statistic of the voltage value was obtained at each pressure. The specifications of the sensor say that its variation of the voltage with respect to the pressure is of a linear form, so taking this into account and the data of the calibration, an adjustment was made to a straight line, the line that was obtained was of the voltage in function of the pressure, clearing the pressure has the formula to convert the voltage to pressure.

With the data in mm of Hg, we proceeded to analyze them. The data is added to a list, these data can be plotted, the graph can be observed as there are peaks, when there is a peak the sign of the slope changes, first it is positive and then it becomes negative, the program basically detects this, when the peaks are detected there is a drawback, the program detects the changes of sign, but also between peak and peak the slope changes from negative to positive, so that the next part of the code is dedicated to detecting if there is a maximum or a minimum, we are interested in the maximums, so that we keep them in a list and from there we obtain the values ​​of the diastolic pressure and the systolic pressure.

-----------------------------------------------------------------------------------

Para medir la presión se uso un sensor de presión, este sensor te da una diferencia de potencial que es proporcional a la presión que mide, la diferencia de potencial que entrega es muy pequeña como para que el Arduino la detecte, debido a esto se tuvo que usar un amplificador operacional, para amplificar el voltaje entregado por el sensor, una vez que se tuvo esto, se conecto el voltaje de salida a la terminal A0. Para funcionar el sensor necesita una alimentación de al menos 5 volts, esta se obtuvo del puerto de 5 volts del Arduino.

El sensor de presión tiene dos entradas, una de ellas se inserta en una manguera que sale del brazalete que se coloca en el bícep, la otra entrada del sensor queda expuesta a presión atmosférica, cuando se infla el brazalete, el sensor manda el voltaje que se amplifica. Este voltaje posteriormente se convertirá a una unidad de presión, mm de Hg para ser exactos.

Después de esto se prueba que el voltaje de salida del amplificador efectivamente cambie cuando la presión del brazalete varía, para esto se escribió un simple código que graficara los datos recogidos por el Arduino en la herramienta Serial Plotter, luego de verificarlo se procedió a realizar una prueba para ver si el sensor tenía la suficiente resolución como para que los pulsos de sangre se pudieran observar en el Serial Plotter del Arduino, se encontró que la forma en que se veía el pulso era en forma de picos.

Después de hacer todas las pruebas necesarias, ahora sí se procedió a elaborar el código que pudiera detectar los picos observados, que corresponden al pulso. El primer pico de presión se observa cuando la presión arterial es lo suficientemente grande como para ganarle a la presión ejercida por el brazalete, este primer pico corresponde a la llamada presión sistólica, de modo que el código debe detectar este primer pico y convertirlo a mm de mercurio, los picos posteriores corresponden a pulsos de sangre, la presión diastólica se supone debe corresponder al último pico de pulso, según los fabricantes de baumanómetros digitales esto no se toma así cuando se usa un sensor, la presión diastólica se toma cuando hay un pico en el cual su altura sea del 60% del primer pico, esta se toma como la presión diastólica.

Para detectar esos picos se usa un método que consiste en detectar el cambio de signo en la pendientes, los datos que llegan al Arduino son enviados a python, una vez que llegan a python se convierten en unidades de presión (mm de Hg), esto se hace con una formula que se obtuvo calibrando el sensor con un manómetro de mercurio, se midió el voltaje que mandaba el sensor a diferentes presiones, se hizo varias veces y de ahí se obtuvo una estadística del valor del voltaje a cada presión. Las especificaciones del sensor dicen que su variación del voltaje respecto a la presión es de una forma lineal, así que teniendo esto en cuenta y los datos de la calibración, se hizo un ajuste a una recta, la recta que se obtuvo era del voltaje en función de la presión, despejando la presión se tiene la formula para convertir el voltaje a presión.

Con los datos en mm de Hg se procedió a analizarlos. Los datos se agregan a una lista, a estos datos pueden ser graficados, en la gráfica se puede observar como hay picos, cuando hay un pico el signo de la pendiente cambia, primero es positiva y luego se vuelve negativa, el programa básicamente detecta esto, cuando se detectan los picos hay un inconveniente, el programa detecta los cambios de signo, pero también entre pico y pico la pendiente cambia de signo de negativo a positivo, de modo que la siguiente parte del código se dedica a detectar si hay un máximo o un mínimo, nos interesan los máximos, de modo que estos los guardamos en una lista y de ahí se obtienen los valores de la presión diastólica y de la presión sistólica.

Code

Python CodePython
python code that analyzes the slopes
import serial
import time
from pylab import *

#Se inicia comunicacin con Arduino 
ser = serial.Serial('COM3', baudrate=9600, timeout=1 )  ## Donde COM= puerto del arduino,  
                                                        #9600 baudios de Serial.begin,  timeout = timepo que recoge datos

time.sleep(3) #Se tiene un tiempo de espera para obtener el primer dato, ya que sin el , el primer dato obtiene basura 
Puntos =160 #Se Define el numero de datos que se quieren obtener en funcion del tiempo de medicin
ListaDatos= [0]*Puntos #Se crea una lista de la dimension de puntos.


def Valores(): # Se declara una funcion que arroje una lista con los datos que recibe de arduino
    ser.write(b'g') # Se manda al arduino la letra g para que lea datos cuando nosotros lo indiquemos 
    ArduinoDatos= ser.readline().decode().split('\r\n') #Se crea la variable donde se guardan los datos  donde se docodifica en codigo ASCII
    
    return ArduinoDatos[0] 

while 1:  #Se incializa un ciclo que siempre se cumple para estar en sintonia con el loop de arduino 
    
    Input= input('Empezar a tomar datos?') #Se declara una variable que pregunte al usuario si ya quiere tomar datos 
    
    if Input == 'y': #Si el usuario pone la letra y = si , entonces comienza  el conteo y analisis de datos 
        pendientes=[] #Se declara una lista vacia donde se guarden las pendientes
        maximos=[] #Se declara una lista vacia donde se guarden los maximos
        diastolica=[] #Se declara una lista vacia donde se guarden las presiones diastolicas,osea las presiones mas bajas
        sistolica=[] #Se declara una lista vacia donde se guarden las presiones sistolicas,osea las presiones mas altas
        for i in range(0,Puntos): #Se inicializa un ciclo donde se cambian los valores de voltaje a presion
            Dato=Valores()
            
            Dato=int(Dato) #Se cambia los valores tipo str a int
            ListaDatos[i]=(Dato-562.5555556)/3.08 +15 # Se hace la conversion y se guarda en una lista
        
        for i in range(1,Puntos): #Se inicializa un ciclo donde se guarden las pendientes de los datos
            m=(ListaDatos[i]-ListaDatos[i-1])/2 #Se hac la pendiente para cada valor
            pendientes.append(m) 
        for i in range(1,len(pendientes)):#Se crea un ciclo donde se analizan las pendientes
            if(pendientes[i]==0): #si la pendiente entre dos puntos es cero no hace nada
                continue     
            else: #si la pendiente es negativa y es mayor que la pendiente anterior se guardan esos valores de la lista de datos como maximos
                if(pendientes[i-1]/pendientes[i] < 0 and pendientes[i-1] > pendientes[i]):
                    maximos.append(ListaDatos[i])
        for i in range(len(maximos)):  # En estos dos for se guardan los  valores que pasen estas cotas y se guardan en dos listas , en la sistolia y diastolica
            if(maximos[i] < 130 ):
                sistolica.append(maximos[i])
        for i in range(len(maximos)):
            if(maximos[i] > 70  ):
                diastolica.append(maximos[i])
                
        
        
        plt.rcParams['figure.figsize'] = (7,7)  # En estas cuatro lineas unicamente imprimimos la grafica de la lista de datos
        t=arange(0,len(ListaDatos),1)
        plot(t,ListaDatos,'r')
        ylabe('voltaje (presion)',fontsize=14)
        xlabel('tiempo (100ms)',fontsize=14)
        grid(True)
        show() 
        
        #yprint(dataList)
        #print(maximos)
        print("presin diastolica %f " %diastolica[-1]) #se imprime el ultimo valor de la lista de diastolica
        print("presin sistolica %f"%sistolica[0]) #se imprime el primer valor de la lista de sistolica 
IDE codeArduino
int datos ; //Se declara una variable entera que se llama datos
char Input; //Se declara una variable entera que se llama input
void setup() {
  // put your setup code here, to run once:

Serial.begin(9600); //Se inicializa el monitor serial.

}

void loop() {
  // put your main code here, to run repeatedly:
if(Serial.available()>0){ // Si la comunicacion serial es un valor mayor que cero entonces lera lo que hay en el monitor serial guardandolo en la variable input , si lo que le es 
                          // la letra g entonces lera la entrada analoga A0 y guardara esos valores en la variable datos e imprimir esos datos en el monitor serial.

  Input=Serial.read();

      if(Input == 'g'){
datos=analogRead(A0);
Serial.println(datos);

      }
      
}

delay(100);

}

//Este codigo unicamente nos da comunicagion con el monitor serial y que nos imprima cada vez que queramos los valores obtenidos en la entrada analoga A0

Schematics

Protoboard
Potoboard scheme
Diagr chido gu1mw2jbb1
Diagram
Diagram of the circuit
Esquema chido so8ha3yy2b

Comments

Similar projects you might like

Arduino UNO Library for a Sampling Scope & Counter

Project showcase by Veldekiaan

  • 4,299 views
  • 6 comments
  • 25 respects

Multifunctional Watch With Arduino Uno

Project showcase by shaqibmusa94

  • 3,330 views
  • 2 comments
  • 8 respects

Arduino UNO Fan Controller Education Kit

Project showcase by ArdLab_Gent

  • 2,891 views
  • 1 comment
  • 15 respects

Solar Charged Battery Powered Arduino Uno

Project in progress by Igor Fonseca Albuquerque

  • 73,543 views
  • 48 comments
  • 152 respects

Electromagnetic Field Detector - Arduino Uno

Project showcase by justin1445

  • 20,984 views
  • 9 comments
  • 23 respects

Sending Data from PC to Another Using Arduino UNO

Project tutorial by Mohamed Maher

  • 3,460 views
  • 2 comments
  • 10 respects
Add projectSign up / Login