Final Project: From the Inside – Out & LOVE

2nd Iteration: From the Inside – Out

This project is called From the Inside – Out. Using Arduino LilyPad, a pulse sensor and LED’s the heart bit of the user will be exposed to the exterior world. The LED’s will blink following the bit. The jackets has a jeans-ring that has the pulse sensor. The LED’s are Blue over the blue jeans jacket.

Storyboard:

Photographs:

Video:

2nd Iteration: LOVE

This project is called Love. Using the LOL Shield and two push buttons. When one button is pressed there is one heart blinking. When the other button is pressed, the other heart is blinking. If both buttons are pressed at the same time, both hearts get together, become a big heart and the word LOVE appears.

Photographs:

Video:

To see the codes:

LOVE:

/*

This file was dynamically created by the Lol Shield Theatre: http://falldeaf.com/lolshield/
Feel free to drop by and create your own cinema masterpiece :)

-falldeaf

Animation information -
/////////////////////////
//title: together
//author: catalina
//description: hearts together
/////////////////////////
//current score: 0 (as of Sunday 13th of November 2011 05:26:58 PM )
//animation page at: http://falldeaf.com/lolshield/show.php?anim=613
/////////////////////////

This program is a modification of the Basic LoL Shield Test

Modified by falldeaf on 2/27/2011.

Writen for the LoL Shield, designed by Jimmie Rodgers:
http://jimmieprodgers.com/kits/lolshield/

This needs the Charliplexing library, which you can get at the
LoL Shield project page: http://code.google.com/p/lolshield/

Created by Jimmie Rodgers on 12/30/2009.
Adapted from: http://www.arduino.cc/playground/Code/BitMath

History:
December 30, 2009 - V1.0 first version written at 26C3/Berlin

This is free software; you can redistribute it and/or
modify it under the terms of the GNU Version 3 General Public
License as published by the Free Software Foundation;
or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

*/

#include //Imports the library, which needs to be

byte line = 0; //Row counter
char buffer[10];
int value;
int inputPin = A4; //boton

int value2;
int inputPin2 = A5; //CAMBIAR PIN

void setup()
{
Serial.begin(9600);
pinMode(inputPin, OUTPUT);
digitalWrite(inputPin, HIGH); //pull up resistor

pinMode(inputPin2, OUTPUT);
digitalWrite(inputPin2, HIGH); //pull up resistor

LedSign::Init(); //Initializes the screen
}

void loop()
{

int val = digitalRead(inputPin);
Serial.println(val);

int val2 = digitalRead(inputPin2);
Serial.println(val2);

if (val == LOW && val2 == HIGH){

delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(54);
DisplayBitMap(62);
DisplayBitMap(28);
DisplayBitMap(8);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);

delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(54);
DisplayBitMap(62);
DisplayBitMap(28);
DisplayBitMap(8);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);

delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(54);
DisplayBitMap(62);
DisplayBitMap(28);
DisplayBitMap(8);
DisplayBitMap(0);

delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);

//delay(100);
}

if (val2 == LOW && val == HIGH){

delay(100);
DisplayBitMap(0);
DisplayBitMap(6912);
DisplayBitMap(7936);
DisplayBitMap(3584);
DisplayBitMap(1024);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);

delay(100);

DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);

delay(100);

DisplayBitMap(0);
DisplayBitMap(6912);
DisplayBitMap(7936);
DisplayBitMap(3584);
DisplayBitMap(1024);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);

DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);

delay(100);

DisplayBitMap(0);
DisplayBitMap(6912);
DisplayBitMap(7936);
DisplayBitMap(3584);
DisplayBitMap(1024);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);

// delay(100);

}

if (val == LOW && val2 == LOW) {

DisplayBitMap(0);
DisplayBitMap(6912);
DisplayBitMap(7936);
DisplayBitMap(3584);
DisplayBitMap(1078);
DisplayBitMap(62);
DisplayBitMap(28);
DisplayBitMap(8);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(6912);
DisplayBitMap(7936);
DisplayBitMap(3584);
DisplayBitMap(1078);
DisplayBitMap(62);
DisplayBitMap(28);
DisplayBitMap(8);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(6912);
DisplayBitMap(7936);
DisplayBitMap(3584);
DisplayBitMap(1078);
DisplayBitMap(62);
DisplayBitMap(28);
DisplayBitMap(8);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(6912);
DisplayBitMap(7936);
DisplayBitMap(3584);
DisplayBitMap(1078);
DisplayBitMap(62);
DisplayBitMap(28);
DisplayBitMap(8);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(3456);
DisplayBitMap(4076);
DisplayBitMap(1916);
DisplayBitMap(568);
DisplayBitMap(16);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(864);
DisplayBitMap(992);
DisplayBitMap(448);
DisplayBitMap(128);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(864);
DisplayBitMap(992);
DisplayBitMap(448);
DisplayBitMap(128);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(1904);
DisplayBitMap(2032);
DisplayBitMap(2032);
DisplayBitMap(992);
DisplayBitMap(448);
DisplayBitMap(128);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(3960);
DisplayBitMap(2184);
DisplayBitMap(2920);
DisplayBitMap(3048);
DisplayBitMap(1488);
DisplayBitMap(672);
DisplayBitMap(320);
DisplayBitMap(128);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(8192);
DisplayBitMap(8192);
DisplayBitMap(8192);
DisplayBitMap(8192);
DisplayBitMap(8192);
DisplayBitMap(8192);
DisplayBitMap(8192);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(4096);
DisplayBitMap(4096);
DisplayBitMap(4096);
DisplayBitMap(4096);
DisplayBitMap(4096);
DisplayBitMap(4096);
DisplayBitMap(12288);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(2048);
DisplayBitMap(2048);
DisplayBitMap(2048);
DisplayBitMap(2048);
DisplayBitMap(2048);
DisplayBitMap(2048);
DisplayBitMap(14336);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(1024);
DisplayBitMap(1024);
DisplayBitMap(1024);
DisplayBitMap(1024);
DisplayBitMap(1024);
DisplayBitMap(1024);
DisplayBitMap(15360);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(512);
DisplayBitMap(512);
DisplayBitMap(512);
DisplayBitMap(512);
DisplayBitMap(512);
DisplayBitMap(512);
DisplayBitMap(7680);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(8448);
DisplayBitMap(8448);
DisplayBitMap(8448);
DisplayBitMap(8448);
DisplayBitMap(8448);
DisplayBitMap(8448);
DisplayBitMap(12032);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(12416);
DisplayBitMap(4224);
DisplayBitMap(4224);
DisplayBitMap(4224);
DisplayBitMap(4224);
DisplayBitMap(4224);
DisplayBitMap(14208);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(14400);
DisplayBitMap(2112);
DisplayBitMap(2112);
DisplayBitMap(2112);
DisplayBitMap(2112);
DisplayBitMap(2112);
DisplayBitMap(15296);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(15392);
DisplayBitMap(9248);
DisplayBitMap(9248);
DisplayBitMap(9248);
DisplayBitMap(9248);
DisplayBitMap(9248);
DisplayBitMap(15840);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(7696);
DisplayBitMap(4624);
DisplayBitMap(4624);
DisplayBitMap(4624);
DisplayBitMap(4624);
DisplayBitMap(4624);
DisplayBitMap(7920);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(12040);
DisplayBitMap(2312);
DisplayBitMap(2312);
DisplayBitMap(2312);
DisplayBitMap(2312);
DisplayBitMap(2312);
DisplayBitMap(3960);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(6020);
DisplayBitMap(5252);
DisplayBitMap(9348);
DisplayBitMap(1156);
DisplayBitMap(1156);
DisplayBitMap(1156);
DisplayBitMap(1980);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(3010);
DisplayBitMap(2626);
DisplayBitMap(4674);
DisplayBitMap(4674);
DisplayBitMap(8770);
DisplayBitMap(578);
DisplayBitMap(990);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(1505);
DisplayBitMap(1313);
DisplayBitMap(2337);
DisplayBitMap(2337);
DisplayBitMap(4385);
DisplayBitMap(4385);
DisplayBitMap(8687);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(752);
DisplayBitMap(656);
DisplayBitMap(1168);
DisplayBitMap(1168);
DisplayBitMap(10384);
DisplayBitMap(10384);
DisplayBitMap(4343);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(376);
DisplayBitMap(328);
DisplayBitMap(8776);
DisplayBitMap(8776);
DisplayBitMap(5192);
DisplayBitMap(5192);
DisplayBitMap(2171);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(8380);
DisplayBitMap(8356);
DisplayBitMap(4388);
DisplayBitMap(4388);
DisplayBitMap(2596);
DisplayBitMap(2596);
DisplayBitMap(1085);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(4190);
DisplayBitMap(4178);
DisplayBitMap(2194);
DisplayBitMap(2194);
DisplayBitMap(1298);
DisplayBitMap(1298);
DisplayBitMap(542);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(10287);
DisplayBitMap(10280);
DisplayBitMap(9288);
DisplayBitMap(9288);
DisplayBitMap(8840);
DisplayBitMap(8840);
DisplayBitMap(8463);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(13335);
DisplayBitMap(5140);
DisplayBitMap(4644);
DisplayBitMap(12836);
DisplayBitMap(4420);
DisplayBitMap(4420);
DisplayBitMap(12423);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(14859);
DisplayBitMap(2570);
DisplayBitMap(2322);
DisplayBitMap(14610);
DisplayBitMap(2210);
DisplayBitMap(2210);
DisplayBitMap(14403);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(15621);
DisplayBitMap(1285);
DisplayBitMap(1161);
DisplayBitMap(15497);
DisplayBitMap(1105);
DisplayBitMap(1105);
DisplayBitMap(15393);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(3905);
DisplayBitMap(321);
DisplayBitMap(290);
DisplayBitMap(3874);
DisplayBitMap(276);
DisplayBitMap(276);
DisplayBitMap(3848);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(1952);
DisplayBitMap(160);
DisplayBitMap(145);
DisplayBitMap(1937);
DisplayBitMap(138);
DisplayBitMap(138);
DisplayBitMap(1924);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(976);
DisplayBitMap(80);
DisplayBitMap(72);
DisplayBitMap(968);
DisplayBitMap(69);
DisplayBitMap(69);
DisplayBitMap(962);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(488);
DisplayBitMap(40);
DisplayBitMap(36);
DisplayBitMap(484);
DisplayBitMap(34);
DisplayBitMap(34);
DisplayBitMap(481);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(244);
DisplayBitMap(20);
DisplayBitMap(18);
DisplayBitMap(242);
DisplayBitMap(17);
DisplayBitMap(17);
DisplayBitMap(240);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(122);
DisplayBitMap(10);
DisplayBitMap(9);
DisplayBitMap(121);
DisplayBitMap(8);
DisplayBitMap(8);
DisplayBitMap(120);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(61);
DisplayBitMap(5);
DisplayBitMap(4);
DisplayBitMap(60);
DisplayBitMap(4);
DisplayBitMap(4);
DisplayBitMap(60);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(30);
DisplayBitMap(2);
DisplayBitMap(2);
DisplayBitMap(30);
DisplayBitMap(2);
DisplayBitMap(2);
DisplayBitMap(30);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(15);
DisplayBitMap(1);
DisplayBitMap(1);
DisplayBitMap(15);
DisplayBitMap(1);
DisplayBitMap(1);
DisplayBitMap(15);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(7);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(7);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(7);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(3);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(3);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(3);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(1);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(1);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(1);
DisplayBitMap(0);
delay(100);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);
DisplayBitMap(0);

}

}

void DisplayBitMap(int lineint)
{
//int data[9] = {95, 247, 123, 511, 255, 1, 5, 31, 15};

//for(line = 0; line < 9; line++) {
for (byte led=0; led<14; ++led) {
if (lineint & (1<= 9) line = 0;
}

From the Inside-Out code:

/*
This program reads data from the Pulse Sensor.
Serial output is designed to mate with Processing sketch "P_PulseSensor_xx" series
Serial Protocol initiates datastring with coded ascii character, ends each message with carriage return
We named the variable that holds the heart rate (BPM) after the group Quantified Self.
They backed our Kickstarter campaing at the $600 level and having a variable named after them is one of their rewards.
Go Count Yourself!!! http://quantifiedself.com/

by Joel Murphy & Yury Gitman in Brooklyn, Summer 2011.
*/

// VARIABLES
unsigned long time; // Holds current time for pulse rate calculation
unsigned long lastTime; // Used for calculating time between beats
int Sensor; // Holds current analog Sensor Reading
int lastSensor; // Used to find waveform direction
int Peak; // Holds value of peak in waveform
int Trough; // Holds value of trough in waveform
int beats[10]; // Array to collect time between beats for calculating BPM
int beatCounter = 0; // Used to hold position in beats array
int QuantifiedSelf; // Used to hold the heart rate value (BPM)
int drop; // Holds the amplitude of waveform

int fadeRate = 10; // when arduino finds a heartbeat, it will fade an LED on pin 11 (PWM)
int Fade = 0; // Fade variable will set PWM

boolean falling = false; // used to keep track of waveform direction

// PINS
int LED[] = {2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 16, 17}; // pin 13 LED blinks on each pulse
//int dimLED = 11; // LED on pin 11 fades with each pulse
int PulseSensor = A1; // Pulse Sensor purple wire connected to analog pin 5
int i;

void setup()
{
for(i=0; i< 12; i++){
pinMode(LED[i], OUTPUT); } // set the LED pins as outputs
//pinMode(dimLED, OUTPUT);
Serial.begin(115200); // start the hardware serial block and set the baud rate
lastTime = millis(); // initialize lastTime variable
}
void loop()
{
Sensor = analogRead(PulseSensor); // take a reading
Serial.print("s"); // send raw analog data to Processing sketch (or other)
Serial.println(Sensor); // 's' = Raw Sensor Data
// USE WITH LED ON PIN 11 FOR FADE EFFECT
Fade -= fadeRate; // Fade variable set to 255 when heart beat is found
Fade = constrain(Fade,0,255); // these lines fade the LED
//analogWrite(dimLED,Fade);

// KEEP TRACK OF THE DIRECTION OF THE WAVEFORM
if (falling == false){ // if the sensor values are rising
if (Sensor < lastSensor-1){ // if current reading is less than last reading - noise
falling = true; // a peak has been reached
Serial.print("P"); // send peak value to Processing scketch (or other)
Serial.println(Peak);
for(i=0; i lastSensor){ // otherwise, if current reading is bigger, values are still rising
Peak = Sensor; // record the next potential peak
lastSensor = Sensor; // keep track of rising signal
}
}
if (falling == true){ // if the sensor values are falling
if (Sensor > lastSensor){ // if current reading is bigger than last reading
falling = false; // a trough has been reached
Serial.print("T"); // send trough value to Processing sketch (or other)
Serial.println(Trough); // 'T' = Trough in waveform
drop = Peak - Trough; // difference = signal amplitude
Peak = 0; // setting Peak to 0 here helps get rid of noise
// THIS IF STATEMENT IS HOW THE HEARTBEAT IS FOUND IN PULSE SENSOR WAVEFORM
if (drop > 4 && drop <60){ // ignore noise in signal. adjust as needed
timeBeat(); // go work out the BPM
Serial.print("d"); // send the amplitude to Processing Sketch (or other)
Serial.println(drop);
for(i=0; i<12; i++){ // 'd' = amplitude of waveform
digitalWrite(LED[i],HIGH);} // start pin 13 LED blink
Fade = 255; // set fading LED to high brightness

}
}else if (Sensor < lastSensor){ // otherwise, if current reading is smaller weʻre still falling
Trough = Sensor; // record the next potential trough
lastSensor = Sensor; // keep track of falling signal
}
}
delay(20); // break for 20mS. Processing frame-rate = 100.

}// END VOID LOOP

void timeBeat(){
time = millis(); // take note of the current time
beats[beatCounter] = time - lastTime; // record miliseconds since the last pulse in beats array
lastTime = time; // stay up to date!
beatCounter ++; // move array pointer to next position in array
if (beatCounter == 10){ // if we've taken 10 readings, it's time to derive heart rate
QuantifiedSelf = getBPM(); // go derive the heart rate
Serial.print("q"); // send the heart rate to Processing sketch (or other)
Serial.println(QuantifiedSelf); // 'q' = heart rate
beatCounter = 0;
}
}// END OF timeBeat FUNCTION

// This function will return a value for heart rate (Beats Per Minute)
int getBPM(){
int dummy; // used in sorting
int mean; // used in averaging
boolean done = false; // clear sorting flag
// this simple sorting routine will arrange values in the beat array from lowest to highest
while(done != true){
done = true;
for (int j=0; j beats[j + 1]){ // sorting numbers here
dummy = beats[j + 1];
beats [j+1] = beats[j] ;
beats[j] = dummy;
done = false;
}
}
}
// this FOR loop selects the longer beat time values to avoid incorrect heart rate readings
for(int k=1; k<9; k++){ // exclude lowest and highest values from averaging
mean += beats[k]; // add beat times together
}
mean /=8; // averaging
mean = 60000/mean; // devide 60 seconds by average pulse length
return mean; // return beats per minute
}// END OF getBPM function