Pulsómetro digital
Este proyecto lo hemos desarrollado el grupo 4 de ingeniería de computadores en la asignatura de Diseño de Sistemas Empotrados.
Integrantes:
Alejandro Peña Jimenez
David San Martín Nieto
Ivan Maqueda Guede
Introducción
Como proyecto para la asignatura hemos elegido hacer un pulsómetro, conformado por 2 x 16 espacios de 8 x 5 pixeles donde escribir cada carácter en su pantalla LCD.
En él podemos ver nuestra frecuencia cardíaca por minuto, esperando unos segundos para tomar nuestras pulsaciones y poder hacerlo de una manera más precisa y eficaz.
Hemos obtenido la idea desarrollando un brainstorm donde finalmente elegimos este proyecto por su gran utilidad y su abundante uso a día de hoy en todo tipo de centros sanitarios e incluso en nuestras propias casas.
Uso
El funcionamiento del pulsómetro es muy sencillo, para facilitar la puesta en marcha tiene un interruptor en la parte trasera que enciende el sistema
Colocas el dedo en la ranura frontal de la caja en contacto con el sensor MAX30102 con lo que el sistema empieza a tomar datos durante escasos segundos, en este caso nuestra frecuencia cardíaca, una vez que tiene los datos los convierte mediante una función y los muestra por pantalla y mediante un mensaje a través de la pantalla sabremos nuestro ritmo cardíaco.
El led verde se enciende cuando el sensor detecta un dedo, si el led rojo esta encendido entonces no estará midiendo y se muestra por pantalla un mensaje.
Materiales
Material | Cantidad | Precio |
Placa arduino | 1 | Provisto por la URJC |
Led verde | 1 | Provisto por la URJC |
Led rojo | 1 | Provisto por la URJC |
Cables DuPont | 9 | Provisto por la URJC |
Adaptador para las pilas | 1 | Provisto por la URJC |
Pilas | 4 | En propiedad |
Caja soporte Arduino | 1 | 8€ (20 metros de bobina) |
HD44780 Keypad Shield 16×2 LCD1602 | 1 | 15€ |
Sensor MAX30102 | 1 | 10€ |
Resistencias 500Ω | 2 | En propiedad |
Interruptor | 1 | Provisto por la URJC |
Herramientas
Herramienta | Cantidad | Precio |
Soldador | 1 | 15,99€ |
Impresora 3D | 1 | – |
Polímetro | 1 | 10,49€ |
Pistola Pegamento | 1 | 8€ |
Montaje
Código
#include "MAX30105.h" //Libreria MAX 3010x
#include "heartRate.h" //Libreria para calcular las pulsaciones
#include <LiquidCrystal.h> //Libreria pantalla
//Pines Pantalla LCD
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
//SALIDAS LEDS digitales
int LEDROJO = 0;
int LEDVERDE = 1;
byte customChar[] = { //Mapa de bits para los corazones
B00000,
B00000,
B01010,
B10101,
B10001,
B01010,
B00100,
B00000
};
MAX30105 particleSensor; //Utilizaremos particleSensor para iniciar el sensor
const byte SIZE = 4; //Tamaño del array de medidas. Iniciado en 4
byte pulsaciones[SIZE]; //Array con medidas
byte posPulsacion = 0; //Variable de control para moverse en el array
long lastBeat = 0; //Tiempo desde el ultimo latido
float beatsPerMinute; //BPM
int beatAvg; //Media de pulsaciones
void setup() {
pinMode(LEDVERDE,OUTPUT); //Configuracion de leds como salida
pinMode(LEDROJO,OUTPUT);
digitalWrite(LEDVERDE,HIGH); //Se encienden los dos al inicio
digitalWrite(LEDROJO,HIGH);
lcd.begin(16, 2); //Inicializa la pantalla
lcd.print("Hola, este es"); //Mensaje inicial
lcd.setCursor(0, 1);
lcd.print("nuestro pulsometro");
delay(3000);
// Initialize sensor
particleSensor.begin();
particleSensor.setup(); //Iniciamos el sensor
particleSensor.setPulseAmplitudeRed(0x0A); //Apaga el sensor rojo para indicar que se ha iniciado
}
void loop() {
long irValue = particleSensor.getIR(); //Leyendo el valor de IR detectaremos si se detecta un dedo o no
if (irValue > 7000) { //Si detecta un dedo
digitalWrite(LEDVERDE,HIGH); //Encendemos el led verde y apagamos el rojo
digitalWrite(LEDROJO,LOW);
lcd.clear();
lcd.print(" ");
lcd.createChar(0, customChar);
lcd.home();
lcd.print(" ");
lcd.write(8);
lcd.print("BPM");
lcd.write(8); //En la primera linea mostramos con el mapa de bits los corazones
lcd.setCursor(0, 1);
if(beatAvg==0){ //Si la media de pulsaciones es 0 se muestra un mensaje
lcd.print(" Calculando...");
}else{
lcd.print(" ");
lcd.print(beatAvg); //Si la media es mayor que 0 mostramos el valor
}
if (checkForBeat(irValue) == true) //Si se detecta una pulsacion //checkForBeat viene de la libreria max
{
lcd.clear();
lcd.print(" ");
lcd.createChar(0, customChar);
lcd.home();
lcd.print(" ");
lcd.write(8);
lcd.print("BPM");
lcd.write(8);
lcd.setCursor(0, 1);
if(beatAvg==0){
lcd.print(" Calculando...");
}else{
lcd.print(" ");
lcd.print(beatAvg); //Mostramos la media de pulsaciones calculada
}
delay(100);
long delta = millis() - lastBeat; //Duracion media entre pulsaciones.
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0); //Funcion que calcula el BPM.
if (beatsPerMinute < 255 && beatsPerMinute > 20) //Para calcular la media utilizamos 4 valores y los guardamos en un array para hacer la media
{
pulsaciones[posPulsacion++] = (byte)beatsPerMinute; //Almacena el dato leido en el array
posPulsacion %= SIZE; //Calcular posicion
//Calcula la media de las lecturas
beatAvg = 0;
for (byte x = 0 ; x < SIZE ; x++)
beatAvg += pulsaciones[x];
beatAvg /= SIZE;
}
}
}
if (irValue < 7000) { //Si no se detecta un dedo
digitalWrite(LEDVERDE,LOW); //Apagamos la luz verde
digitalWrite(LEDROJO,HIGH); //Encendemos la luz roja
beatAvg = 0; //BPM a 0 para no guardarlo
lcd.clear();
lcd.print("Ponga el dedo");
lcd.setCursor(0, 1);
lcd.print("Por favor");
}
}
Problemas y posibles mejoras
Respecto al software no ha habido ningún problema, en la parte hardware tuvimos un error al comprar la primera pantalla ya que no funcionaba. El resto de hardware ha funcionado correctamente.
El principal problema lo hemos tenido con el diseño de la caja, las medidas donde van la pantalla y el sensor nos han dado varios problemas ya que las medidas tenían que ser muy exactas y la primera vez nos equivocamos.
En este ultimo diseño hay pequeños detalles como el tamaño del dedo y algún agujero interno de la caja que hemos tenido que añadir para posicionar bien el sensor, a excepción de estas dos modificaciones el resto del diseño si era correcto esta vez.
Detectamos como ultimo error que no podíamos estar abriendo la caja para conectar y desconectar la pila. Como solución a esto utilizamos un interruptor en la parte trasera de la caja.
Cómo mejora adicional teníamos pensado añadir un modulo bluetooth al pulsómetro para utilizar los datos en una aplicación móvil.