Monitor de ritmo cardíaco de Arduino que habla (4 / 5 paso)

Paso 4: codificación

Este es realmente el corazón de este proyecto (je). Paso 3, tienes el monitor de pulso físico, pero ahora decide que hacer con el dispositivo. El escudo de RGB LCD viene con 5 botones programables. Para nuestro proyecto, nos decidimos por el siguiente:

  • ARRIBA: Toma una lectura de la frecuencia cardíaca.
  • ABAJO: Muestra el promedio de los últimos 4 lecturas de ritmo cardíaco.
  • IZQUIERDA: Muestra las 4 últimas lecturas.
  • DERECHA: Da cierta motivación.
  • SELECT: Explica cada botón.

Hay tres partes de la codificación:

  1. Datos del Sensor de pulso
  2. Salida de audio del protector de la onda
  3. Prensas de RGB LCD protector pantalla y botón

Ahora, vamos sobre el código real. Básicamente nos malla código libremente disponible junto del escudo de RGB LCD protector de la onda y sitios web Sensor de pulso. También damos los dos archivos que necesitas en formato .txt. Tenga en cuenta que necesita un archivo proporcionado por el Sensor del pulso Página Web llamada Interrupt.ino (no altere este archivo de ninguna forma). Este archivo funciona en segundo plano y hace el trabajo duro que va a calcular el BPM de las lecturas del Sensor de pulso. Observe que este archivo debe estar en el mismo directorio como el que estamos mostrando a continuación el código de trabajo. También es importante recordar los nombres de archivo de audio para llamar los archivos específicos. Usted notará playcomplete ("file_name.wav") contiene un nombre de archivo específico. Una vez que subas el siguiente archivo (con el archivo de interrupción en el mismo directorio) que son buenos para ir!

 <p>// project: interactive heart rate monitor with audio</p><p>// LCD shield libraries #include <Wire.h><wire.h> #include <Adafruit_</wire.h>MCP23017.h></p><p><wire.h><adafruit_mcp23017.h>#include <<adafruit_rgblcdshield.h></adafruit_rgblcdshield.h></adafruit_mcp23017.h></wire.h>Adafruit_RGBLCDShield.h></p><p>#include <Average.h><average.h></average.h></p><p>// waveshield libraries #include <FatReader.h></p><p><fatreader.h>#include <SdReader.h><sdreader.h> #include <avr/pgmspace.h><avr pgmspace.h=""> #include "WaveUtil.h" #include "WaveHC.h"</avr></sdreader.h></fatreader.h></p><p>// objects for audio SdReader card; // This object holds the information for the card FatVolume vol; // This holds the information for the partition on the card FatReader root; // This holds the information for the filesystem on the card FatReader f; // This holds the information for the file we're play WaveHC wave; // This is the only wave (audio) object, since we will only play one at a time</p><p>#define DEBOUNCE 100 // button debouncer, may not be needed</p><p>//============================================================================== // adapted from Adafruit Waveshield website // methods for debugging void sdErrorCheck(void) // checks the SD card { if (!card.errorCode()) return; putstring("\n\rSD I/O error: "); Serial.print(card.errorCode(), HEX); putstring(", "); Serial.println(card.errorData(), HEX); while(1); }</p><p>// adapted from Adafruit rgb lcd shield website // The rgb lcd shield uses the I2C SCL and SDA pins. On classic Arduinos // this is Analog 4 and 5 so you can't use those for analogRead() anymore // However, you can connect other I2C sensors to the I2C bus and share // the I2C bus. Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();</p><p>// These #defines make it easy to set the backlight color #define RED 0x1 #define YELLOW 0x3 #define GREEN 0x2 #define TEAL 0x6 #define BLUE 0x4 #define VIOLET 0x5 #define WHITE 0x7</p><p>//================================================================================ // PULSE SENSOR CODE: adapted from Pulse Sensor website for this project /*</p><p> >> Pulse Sensor Amped 1.2 << This code is for Pulse Sensor Amped by Joel Murphy and Yury Gitman <a href="http://www.pulsesensor.com"> www.pulsesensor.com </a> >>> Pulse Sensor purple wire goes to Analog Pin 0 <<< Pulse Sensor sample aquisition and processing happens in the background via Timer 2 interrupt. 2mS sample rate. PWM on pins 3 and 11 will not work when using this code, because we are using Timer 2! The following variables are automatically updated: Signal : int that holds the analog signal data straight from the sensor. updated every 2mS. IBI : int that holds the time interval between beats. 2mS resolution. BPM : int that holds the heart rate value, derived every beat, from averaging previous 10 IBI values. QS : boolean that is made true whenever Pulse is found and BPM is updated. User must reset. Pulse : boolean that is true when a heartbeat is sensed then false in time with pin13 LED going out. */</p><p>// VARIABLES int pulsePin = 2; // Pulse Sensor purple wire connected to analog pin 2 (rgb lcd shield) int blinkPin = 6; // pin to blink led at each beat</p><p>int fadeRate = 0;</p><p>int heartvals[4]; int h = 0;</p><p>// these variables are volatile because they are used during the interrupt service routine! volatile int BPM; // used to hold the pulse rate volatile int Signal; // holds the incoming raw data volatile int IBI = 600; // holds the time between beats, must be seeded! volatile boolean Pulse = false; // true when pulse wave is high, false when it's low volatile boolean QS = false; // becomes true when Arduoino finds a beat.</p><p>//===============================================================================</p><p>void setup() {</p><p> pinMode( blinkPin, OUTPUT ); // pin that will blink to your heartbeat!</p><p> // Set the output pins for the DAC control. This pins are defined in the library pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT);</p><p> // enable pull-up resistors on switch pins (analog inputs) digitalWrite(14, HIGH); digitalWrite(15, HIGH); digitalWrite(16, HIGH); digitalWrite(17, HIGH); digitalWrite(18, HIGH); digitalWrite(19, HIGH);</p><p> Serial.begin( 9600 );</p><p> // debugging methods from waveshield website // if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you if (!card.init()) { //play with 8 MHz spi (default faster!) putstring_nl("Card init. failed!"); // Something went wrong, lets print out why sdErrorCheck(); while(1); // then 'halt' - do nothing! }</p><p> // enable optimize read - some cards may timeout. Disable if you're having problems card.partialBlockRead(true);</p><p> // Now we will look for a FAT partition! uint8_t part; for (part = 0; part < 5; part++) { // we have up to 5 slots to look in if (vol.init(card, part)) break; // we found one, lets bail }</p><p> if (part == 5) { // if we ended up not finding one :( putstring_nl("No valid FAT partition!"); sdErrorCheck(); // Something went wrong, lets print out why while(1); // then 'halt' - do nothing! }</p><p> // Lets tell the user about what we found putstring("Using partition "); Serial.print(part, DEC); putstring(", type is FAT"); Serial.println(vol.fatType(),DEC); // FAT16 or FAT32?</p><p> // Try to open the root directory if (!root.openRoot(vol)) { putstring_nl("Can't open root dir!"); // Something went wrong, while(1); // then 'halt' - do nothing! }</p><p> // secondary file with code for the Pulse Sensor interruptSetup(); // sets up to read Pulse Sensor signal every 2mS // UN-COMMENT THE NEXT LINE IF YOU ARE POWERING The Pulse Sensor AT LOW VOLTAGE, // AND APPLY THAT VOLTAGE TO THE A-REF PIN //analogReference(EXTERNAL); </p><p> // set up for LCD lcd.begin( 16, 2 ); lcd.setBacklight( RED );</p><p> lcd.setCursor( 0, 0 ); lcd.print( "Welcome to your" ); lcd.setCursor( 0, 1 ); lcd.print( "Arduino HRM!" ); playcomplete("intro.wav");</p><p> // lcd.clear();</p><p>} // END OF VOID SETUP</p><p>uint8_t i=0;</p><p>//===============================================================================</p><p>void loop() { uint8_t buttons = lcd.readButtons(); if ( buttons ) { lcd.clear(); lcd.setCursor( 0, 0 );</p><p> if ( buttons & BUTTON_UP ) { heartRate(); } if ( buttons & BUTTON_LEFT ) { playcomplete( "readings.wav" ); lcd.setCursor( 0, 0 ); lcd.print( "Last 4 readings: " ); lcd.setCursor( 0, 1 ); int i; for ( i=0; i<4; i++ ) { lcd.println( heartvals[i] ); } } if ( buttons & BUTTON_RIGHT ) { int randNumber = 0; randNumber = random( 1, 10 ); if ( randNumber == 1 ) { playcomplete("1.wav"); } if ( randNumber == 2 ) { playcomplete("2.wav"); } if ( randNumber == 3 ) { playcomplete("3.wav"); } if ( randNumber == 4 ) { playcomplete("4.wav"); } if ( randNumber == 5 ) { playcomplete("5.wav"); } if ( randNumber == 6 ) { playcomplete("6.wav"); } if ( randNumber == 7 ) { playcomplete("7.wav"); } if ( randNumber == 8 ) { playcomplete("8.wav"); } if ( randNumber == 9 ) { playcomplete("9.wav"); } if ( randNumber == 10 ) { playcomplete("10.wav"); } } if ( buttons & BUTTON_DOWN ) { averageH(); } if ( buttons & BUTTON_SELECT ) { lcd.print( "Select" ); playcomplete( "select.wav" ); } } } // END OF VOID LOOP</p><p>//===============================================================================</p><p>// methods needed for playing .wav files // adapted from waveshield website</p><p>// Plays a full file from beginning to end with no pause. void playcomplete(char *name) { // call our helper to find and play this name playfile(name); while (wave.isplaying) { // do nothing while its playing } // now its done playing }</p><p>void playfile(char *name) { // see if the wave object is currently doing something if (wave.isplaying) {// already playing something, so stop it! wave.stop(); // stop it } // look in the root directory and open the file if (!f.open(root, name)) { putstring("Couldn't open file "); Serial.print(name); return; } // OK read the file and turn it into a wave object if (!wave.create(f)) { putstring_nl("Not a valid WAV"); return; }</p><p> // ok time to play! start playback wave.play(); } //===============================================================================</p><p>// a method called to read and display BPM on lcd on UP button press void heartRate() { int x = 10;</p><p> while ( x != 0 ) { if ( QS == true ){ // Quantified Self flag is true when arduino finds a heartbeat fadeRate = 255; // Set 'fadeRate' Variable to 255 to fade LED with pulse lcd.setCursor( 0, 0 ); lcd.print( "Heart rate: " ); lcd.setCursor( 12, 0 ); lcd.println( BPM ); lcd.setCursor( 0, 1 ); lcd.print( "You are alive!" ); delay( 500 ); QS = false; // reset the Quantified Self flag for next time x--; } } heartvals[h] = BPM ; if ( h < 4 ) { h++; } else if ( h == 4 ) { h = 0; heartvals[h] = BPM ; }</p><p> int i; for ( i=0; i<4; i++ ) { Serial.println( heartvals[i]); } playcomplete( "finished.wav" ); }</p><p>// method to calculate the average of the 4 values in heartvals void averageH() { int average = 0; if ( heartvals[3] == 0 ) { lcd.setCursor( 4, 0 ); lcd.print( "Error..." ); lcd.setCursor( 0, 1 ); lcd.print( "4 values needed" ); } else { playcomplete( "average.wav" ); average = mean( heartvals, 4 ); lcd.setCursor( 0, 0 ); lcd.print( "Average: " ); lcd.setCursor( 9, 0 ); lcd.print( average ); }</p><p>}</p><p>//===============================================================================</p> 

Artículos Relacionados

Cómo hacer un soporte de bicicleta para un Garmin u otro Monitor de ritmo cardíaco

Cómo hacer un soporte de bicicleta para un Garmin u otro Monitor de ritmo cardíaco

materiales:Cinta aislantePedazo de madera delgadaPlástico de la cinta "Cojinete"pedazo de estera/paño de goma fina1) primero se corta la cinta plástica teniendo por la mitad, esto es lo que aumentará el diámetro del manillar para la parte del re
Monitor de ritmo cardíaco hecha en casa

Monitor de ritmo cardíaco hecha en casa

Hemos diseñado a este monitor de ritmo cardiaco con varias especificaciones en mente. En primer lugar queríamos a un móvil pulsómetro que podría grabar y almacenar ritmos cardíacos durante 24 horas. En segundo lugar, queríamos que el monitor de ritmo
Edison de Intel: monitor de ritmo cardíaco

Edison de Intel: monitor de ritmo cardíaco

Se trata de cómo hacer un simple DIY pulsómetro con Edison de Intel.La construcción principal sí mismo es bastante simple. Usted tendrá un pequeño tubo. Resistencia de la LDR y un led.Por otra parte, el código necesita mucho de calibrar.Utilicé mi tí
Monitor de ritmo cardíaco DIY con TCRT5000L y LM358

Monitor de ritmo cardíaco DIY con TCRT5000L y LM358

hacer tu propio monitor de ritmo cardiaco usando componentes simples.  Esquemas disponibles (véase la sección de comentarios).  ¡ Disfrute!
Fotopletismografía - (Monitor de ritmo cardíaco de IR)

Fotopletismografía - (Monitor de ritmo cardíaco de IR)

Este Instructable documenta cómo crear a un simple pulsómetro con fotopletismografía en un fototransistor IR vía transmisiva absorción utilizando el Arduino para procesar los datos pulsátiles y mostrar resultados en directo a través de una pantalla T
Dispositivo usando arduino de medición del ritmo cardíaco

Dispositivo usando arduino de medición del ritmo cardíaco

Este proyecto le muestra cómo diseñar y construir un dispositivo para medir el ritmo cardíaco mediante nuestro Arduino encantador!Paso 1: Información básica sobre este proyecto Un monitor de ritmo cardíaco es un dispositivo de seguimiento personal qu
Ritmo cardíaco partido pendiente

Ritmo cardíaco partido pendiente

Mis amigos estaban hablando sobre brunch una vez día acerca de lo guay (y qué aterrador) sería si un conversando con (tal vez en una fiesta o en una fecha) puede realmente ver cuando su pulso se acelera, proporcionando una ventana en sus sentimientos
Consejos para vivir con trastornos del ritmo cardíaco / an CIE

Consejos para vivir con trastornos del ritmo cardíaco / an CIE

En julio de 2008, yo estaba asimilada por los Borg..... .no realmente. Pero algo: tuve mi primer Implantable Cardioverter Defibrillator (ICD) a."Un cardioverter-defibrillator implantable (ICD), un dispositivo del tamaño de paginación que se implanta
3D impreso Fitness reloj con Sensor de ritmo cardíaco

3D impreso Fitness reloj con Sensor de ritmo cardíaco

Visita www.project3dprint.com para descargar los archivos STL y solicitar el kit de electrónica para este proyecto!  Ver el video instructivo sobre cómo montar todos juntos!Este es el perfecto gadget poco usable para mostrar a sus compañeros de gimna
Esqueleto de Halloween de Arduino que habla

Esqueleto de Halloween de Arduino que habla

Bienvenidos a otro de mi instructables!Así que Halloween está al caer otra vez y quería usar el Arduino que tenía.  Fui a la tienda de halloween y encontraron un cráneo con una calavera con bisagras y eso fue la chispa que comenzó este proyecto.  Sab
Reloj de Arduino que habla

Reloj de Arduino que habla

Este proyecto utiliza el Arduino MEGA y un reproductor de MP3 (Adafruit) no sólo de la época, pero también carillones regulares 15 minutos y el tiempo del estado cuando sea necesario.Para mantener las cosas simples, he comprado la mayoría de los artí
Monitor de ritmo cardiaco

Monitor de ritmo cardiaco

He construido un circuito de monitor de ritmo cardíaco relativamente simple que es supervisado y controlado por un Arduino Uno. La teoría de operación está basado en el hecho de que la luz infrarroja (IR) es parcialmente absorbida por la sangre. Cuan
Monitor de ritmo cardiaco con energía solar

Monitor de ritmo cardiaco con energía solar

¡ Hola todos! En este Instructable, te mostraré cómo hacer tu propio Monitor de frecuencia cardíaca basados en Arduino! Pero esto no es cualquier otro DIY calor Monitor de ritmo; Este es un Monitor de ritmo cardíaco accionado Solar!Este Monitor de ri
Monitor de ritmo cardiaco Polar habilitado para la Web

Monitor de ritmo cardiaco Polar habilitado para la Web

Utilizar un sensor de ritmo cardíaco Polar, un tablero barato hardware conectado vía USB y un poco de software para poner su ritmo cardiaco en el Web. Los datos vivos es servido desde su computadora y accesible a través del relé Yaler (revelación: so