Skip to main content

Práctica 3.1 Medimos nuestras pulsaciones

TIEMPO ESTIMADO: 60 minutos

Como ya sabes, una librería (también te la puedes encontrar denominada como biblioteca) de Arduino es una colección de código y ejemplos sobre un tema o dispositivo específico. Por ejemplo, para controlar el sensor que vamos a utilizar en esta práctica, un pulsómetro, vamos a emplear la biblioteca/librería PulseSensor Playground. En ella, vamos a encontrar una colección de código y proyectos creados exclusivamente para facilitar el uso de este sensor junto con Arduino.


La librería Pulse Sensor Playground

Lo primero que haremos será instalar esta librería. Para ello, iremos a Programa > Incluir Librería > Administrar Bibliotecas... :

image-1665231393395.14.58.png

Una vez ahí, haremos click y nos aparecerá una ventana emergente en la que podremos buscar la librería, que en este caso se llama PulseSensor Playground, cuando aparezca, pondremos el ratón sobre ella y nos aparecerá el botón Instalar. La instalaremos:

image-1665231801613.15.50.png

Cerraremos la ventana emergente y veremos que si vamos a Archivo > Ejemplos nos aparecerán los ejemplos de la librería PulseSensor Playground:

image-1665232108397.27.14 copia.png

Una vez la hayamos instalado, abriremos el ejemplo GettingStartedProject. Y pasaré a explicarte lo que hace cada línea de código.

¡Pulsación detectada ♥!

Lo primero que voy a hacer es poner aquí el código, aunque imagino que ya lo tienes abierto en tu IDE de Arduino:


/*  PulseSensor Starter Project and Signal Tester
 *  The Best Way to Get Started  With, or See the Raw Signal of, your PulseSensor.com™ & Arduino.
 *
 *  Here is a link to the tutorial
 *  https://pulsesensor.com/pages/code-and-guide
 *
 *  WATCH ME (Tutorial Video):
 *  https://www.youtube.com/watch?v=RbB8NSRa5X4
 *
 *
-------------------------------------------------------------
1) This shows a live human Heartbeat Pulse.
2) Live visualization in Arduino's Cool "Serial Plotter".
3) Blink an LED on each Heartbeat.
4) This is the direct Pulse Sensor's Signal.
5) A great first-step in troubleshooting your circuit and connections.
6) "Human-readable" code that is newbie friendly."

*/


//  Variables
int PulseSensorPurplePin = 0;        // Pulse Sensor PURPLE WIRE connected to ANALOG PIN 0
int LED13 = 13;   //  The on-board Arduion LED


int Signal;                // holds the incoming raw data. Signal value can range from 0-1024
int Threshold = 550;            // Determine which Signal to "count as a beat", and which to ingore.


// The SetUp Function:
void setup() {
  pinMode(LED13,OUTPUT);         // pin that will blink to your heartbeat!
   Serial.begin(9600);         // Set's up Serial Communication at certain speed.

}

// The Main Loop Function
void loop() {

  Signal = analogRead(PulseSensorPurplePin);  // Read the PulseSensor's value.
                                              // Assign this value to the "Signal" variable.

   Serial.println(Signal);                    // Send the Signal value to Serial Plotter.


   if(Signal > Threshold){                          // If the signal is above "550", then "turn-on" Arduino's on-Board LED.
     digitalWrite(LED13,HIGH);
   } else {
     digitalWrite(LED13,LOW);                //  Else, the sigal must be below "550", so "turn-off" this LED.
   }


delay(10);


}

Ahora, vamos a ir desmenuzando qué es lo que hace el código:

Todo el primer bloque, recogido entre los símbolos /* */ es un comentario. No volveremos a explicar su función porque ya lo vimos en este apartado.

Pasaremos directamente a los párrafos que contienen las variables:


//  Variables
int PulseSensorPurplePin = 0;        // Pulse Sensor PURPLE WIRE connected to ANALOG PIN 0
int LED13 = 13;   //  The on-board Arduion LED


int Signal;                // holds the incoming raw data. Signal value can range from 0-1024
int Threshold = 550;            // Determine which Signal to "count as a beat", and which to ingore.

Para hacer funcionar nuestro proyecto, necesitaremos crear 4 variables de números enteros (int).
La primera de ellas PulseSensorPurplePin tiene el valor 0, ya que va conectado el pin analógico A0. Aparece el color purple, porque en el sensor para el que en origen se creó este ejemplo, el cable que se conecta a A0 era morado.
La variable LED13 tiene el valor 13, ya que es el pin al que va conectado el pin que va integrado en la placa de nuestro UNO.
Signal almacenará el valor que nuestro sensor produce cuando está intentando detectar una pulsación. Como se trata de un sensor analógico, la señal se corresponderá a valores discretos, dentro del rango 0 hasta 1024.
Por último, Threshold será el umbral a partir del cual podremos afirmar que se ha producido un latido, una pulsación, en este caso será 550. Ya habíamos dicho que el umbral de nuestra señal iba de 0 a 1024, por lo que utilizar 550 es una buena referencia.

A continuación, vamos a pasar a ver la función setup():

// The SetUp Function:
void setup() {
  pinMode(LED13,OUTPUT);         // pin that will blink to your heartbeat!
   Serial.begin(9600);         // Set's up Serial Communication at certain speed.

}

Es bastante breve y en ella lo único que necesitamos incluir es el modo del pin que vamos a utilizar gracias a la función pinmode(). En ella indicaremos el pin y si va a ser de entrada (INPUT) o de salida (OUTPUT). Como en este caso es un LED, le diremos que es de salida. También le diremos a nuestro UNO a que velocidad tiene que enviar la información a través del puerto serial, que en este caso será 9600 baudios. 

Recuerda que todo lo incluido en la función setup() solamente se ejecutará una vez.

La última parte de nuestro sketch se corresponde con la función loop().

// The Main Loop Function
void loop() {

  Signal = analogRead(PulseSensorPurplePin);  // Read the PulseSensor's value.
                                              // Assign this value to the "Signal" variable.
   Serial.println(Signal);                    // Send the Signal value to Serial Plotter.


   if(Signal > Threshold){                          // If the signal is above "550", then "turn-on" Arduino's on-Board LED.
     digitalWrite(LED13,HIGH);
   } else {
     digitalWrite(LED13,LOW);                //  Else, the sigal must be below "550", so "turn-off" this LED.
   }

delay(10);


}

En ella, lo primero que vamos a hacer es almacenar en la variable Signal los valores que lea nuestro sensor. Para leer esos valores, usaremos la función analogRead(). Indicaremos que la señal analógica que ha de ser leída es la que recibamos con la variable PulseSensor PurplePin.
A continuación, imprimiremos por nuestro puerto serial el valor obtenido, aunque para visualizar las pulsaciones no nos va a servir de mucho, porque los números aparecen a gran velocidad. Para visualizar las posiciones usaremos el LED. ¿Cómo? Pues usaremos un condicional: "Oye, Arduino, si (if) la señal que lees es mayor que el umbral (Signal > Threshold), enciende el LED (digitalWrite(LED13,HIGH)), si no (else), apágalo (digitalWrite(LED13,LOW))".

Para finalizar, usamos un delay de 10 milisegundos, para darle a nuestro Arduino un pequeño respiro entre lectura y lectura.

En este GIF puedes ver cómo la luz naranja situada más a la derecha, comienza a parpadear cuando coloco mi dedo encima del pulsómetro:

image-1666605711519.gif

Cuando no está el dedo colocado, la luz también parpadeará aleatoriamente. Eso no sucede porque el sensor esté roto o no funcione bien, sino porque el sensor realizará lecturas erróneas. Intentará detectar pulsaciones, aunque nuestro dedo no esté colocado sobre él. Es importante colocar el dedo sin apretar mucho y sin moverlo y esperaremos uno 3 o 4 segundos hasta que el sensor sea capaz de leer correctamente nuestras pulsaciones.


FUENTES:

Librería de Pulse Sensor: https://pulsesensor.com/pages/installing-our-playground-for-pulsesensor-arduino
Sobre Pulse Sensor: https://pulsesensor.com/pages/code-and-guide