Pulse Sensor and Arduino

I am working on a project using the Pulse Amped Sensor and my Arduino uno. I have created a necklace made of RGB LEDs that blink in time with my heart beat. The BPM and other information is sent to a processing sketch that will create a second visual of the heart beat waveform over time. I have very little knowledge of any kind of coding and am wondering if anyone can help me achieve the desired effect i want with the LEDs.

Ideally i want the LEDs to change color based on an increase in BPM or decrease. Is is possible to do this? Is it possible to single out and LED and have it act differently than the ones around it?

Any help or suggestions would be greatly appreciated.

Here is the code i have:

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.

*/

// VARIABLES

int pulsePin = 0; // Pulse Sensor purple wire connected to analog pin 0

int blinkPin = 9; // pin to blink led at each beat

int fadePin = 5; // pin to do fancy classy fading blink at each beat

int fadeRate = 0; // used to fade LED on with PWM on fadePin

// 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, the Inter-Beat Interval

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.

void setup(){

pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat!

pinMode(fadePin,OUTPUT); // pin that will fade to your heartbeat!

Serial.begin(115200); // we agree to talk fast!

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);

}

void loop(){

sendDataToProcessing(‘S’, Signal); // send Processing the raw Pulse Sensor data

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

sendDataToProcessing(‘B’,BPM); // send heart rate with a ‘B’ prefix

sendDataToProcessing(‘Q’,IBI); // send time between beats with a ‘Q’ prefix

QS = false; // reset the Quantified Self flag for next time

}

ledFadeToBeat();

delay(20); // take a break

}

void ledFadeToBeat(){

fadeRate -= 15; // set LED fade value

fadeRate = constrain(fadeRate,0,255); // keep LED fade value from going into negative numbers!

analogWrite(fadePin,fadeRate); // fade LED

}

void sendDataToProcessing(char symbol, int data ){

Serial.print(symbol); // symbol prefix tells Processing what type of data is coming

Serial.println(data); // the data to send culminating in a carriage return

}

nlproulx:
I am working on a project using the Pulse Amped Sensor and my Arduino uno. I have created a necklace made of RGB LEDs that blink in time with my heart beat. The BPM and other information is sent to a processing sketch that will create a second visual of the heart beat waveform over time. I have very little knowledge of any kind of coding and am wondering if anyone can help me achieve the desired effect i want with the LEDs.

Ideally i want the LEDs to change color based on an increase in BPM or decrease. Is is possible to do this? Is it possible to single out and LED and have it act differently than the ones around it?

Any help or suggestions would be greatly appreciated.

Last question first … you can single out an individual LED but it all depends on the wiring of the RGB LEDs in your necklace. There are premade strings that have all the R LEDs, all the G LEDs and all the B LEDs wired in parallel and with those you can’t single out any one LED. Other strings have an IC which can be addressed individually and can be set to do brightness and color. I don’t know what you have for a necklace, if any. Start by telling us what you have. I note that you’ve dedicated 2 pins for driving the necklace. The voltage and current at any one pin might be suitable to drive an LED or 2 but certainly not what I’d think is needed for a whole necklace. The premade strings that are individually addressable aren’t controlled via blinking a pin, they are “talked” to via a serial link. Then again you might be coming up with some custom design using parts of the above, perhaps a premade string of parallel LEDs and then adding just one separate LED for the heartbeat.

WRG to color changing … sure why not ? :mrgreen: The color of a single RGB LED is determined by PWM’ing (what you did to fade) each color in the LED. Your code has 1 pin to fade an LED (single color). Multiply that by 3 (for a single RGB LED or a string wired in parallel) with code to set the PWM value (analogWrite) separately for each pin (R, G and B) as determined by slope of the BPM data and you’ll have color changing as a function of BPM.

While I see your code is incomplete (no way to set the IBI, BPM and QS flag) there is an error (??) that you can address before adding** those parts in. Your interrupt “stuff” is missing. Normal Arduino-land interrupts are run off pins 2 and 3 (IIRC). They allow the Arduino to respond to external signals. You want an internal timer based interrupt (I think) and so have to go off the Arduino reservation to make that happen. Start by reading these threads …

http://arduino.cc/forum/index.php/topic,44185.0.html

http://arduino.cc/forum/index.php/topic,43224.0.html

… and perhaps this (if needed) …

http://www.arduino.cc/playground/Code/Interrupts

** Or have you decided to not include that code for clarity ?

Oh I forgot … if you use the code button it’ll insert in the text box a set of code tags. Copy ‘n’ paste your code between those tags and you’ll get a box that preserves the indentations and so read so much easier. Here’s your code in such a box (after being auto-formatted). You need to use the full editor to see the code button.

// VARIABLES
int pulsePin = 0; // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 9; // pin to blink led at each beat
int fadePin = 5; // pin to do fancy classy fading blink at each beat
int fadeRate = 0; // used to fade LED on with PWM on fadePin


// 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, the Inter-Beat Interval
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.


void setup(){
  pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat!
  pinMode(fadePin,OUTPUT); // pin that will fade to your heartbeat!
  Serial.begin(115200); // we agree to talk fast!
  // 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);
}



void loop(){
  sendDataToProcessing('S', Signal); // send Processing the raw Pulse Sensor data
  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
    sendDataToProcessing('B',BPM); // send heart rate with a 'B' prefix
    sendDataToProcessing('Q',IBI); // send time between beats with a 'Q' prefix
    QS = false; // reset the Quantified Self flag for next time
  }

  ledFadeToBeat();

  delay(20); // take a break
}


void ledFadeToBeat(){
  fadeRate -= 15; // set LED fade value
  fadeRate = constrain(fadeRate,0,255); // keep LED fade value from going into negative numbers!
  analogWrite(fadePin,fadeRate); // fade LED
}


void sendDataToProcessing(char symbol, int data ){
  Serial.print(symbol); // symbol prefix tells Processing what type of data is coming
  Serial.println(data); // the data to send culminating in a carriage return
}