Tagged: Josef Ayala Toggle Comment Threads | Keyboard Shortcuts

  • josefayala 3:25 pm on December 7, 2011 Permalink | Reply
    Tags: Josef Ayala   

    Josef Ayala-Tell Tale Heart Box (Pulse Sensor Project) 

    Description: The Tell Tale Heart Box was my small diorama rendition of an intense scene from Edgar Allen Poe’s short story. It essentially uses the pulse sensor to generate your heart beat and apply it to a solenoid that pushes the floor board up and down (simulating a live pulse and recreating the paranoia felt by the story’s protagonist that in turn causes him to turn himself in to the authorities stopping by his home).

    Heart Box uses:
    -Pulse Sensor (glued on the backside and ready for use on the back side of the box).
    -Solenoid (glued in the center of the box for vertical stance with a floor board glued to the pin).
    -3 9V batteries (2 for the solenoid/1 for the Arduino board)

    • Bread Board/Arduino Uno/Jumper Cables etc.

    more photos coming…

     
    NOTE: I lucked out with this project because the pulse sensor code runs off of one pin to begin with. I simply hooked the solenoid to that pin and had it working from the beginning. That said, the vast majority of this code is the work of Yury Gitman and Joel Murphy and has nothing to do with me.

    -Josef

    /*
    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 = 13; // pin 13 – solenoid
    int dimLED = 11; // LED on pin 11 fades with each pulse
    int PulseSensor = 5; // Pulse Sensor purple wire connected to analog pin 5

    void setup()
    {
    pinMode(LED, 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){ // 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); // 'd' = amplitude of waveform
    digitalWrite(LED,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

     
  • josefayala 4:28 pm on September 16, 2011 Permalink | Reply
    Tags: Josef Ayala   

    Hi 

    I’m Josef (by the way)

    A)   BS/MS

    B)   I am interested in this class because I would like to create in depth and technical projects. More importantly, I would like to immerse myself in the culture that surrounds Physical Computing to get a feel for what people are making and what problems people are trying to solve  within their respective fields.

    C)

     
c
Compose new post
j
Next post/Next comment
k
Previous post/Previous comment
r
Reply
e
Edit
o
Show/Hide comments
t
Go to top
l
Go to login
h
Show/Hide help
shift + esc
Cancel