From 8c1aab9b4bd5f4ee492bf9ac8735dbac60618b2d Mon Sep 17 00:00:00 2001 From: Saurutobi Date: Sat, 24 Aug 2013 15:39:16 -0700 Subject: [PATCH] Added pulse sensing --- .../Interrupt.ino | 108 +++++++++++ ...ing_costume_with_temp_and_pulse_Sensor.ino | 174 ++++++++++++++++++ .../program_to_test_and_read_freq_for_pwm.ino | 0 .../program_to_test_and_read_temperatures.ino | 0 .../Interrupt.ino | 109 +++++++++++ .../PulseSensorAmped_Arduino_1dot2.ino | 90 +++++++++ .../DallasTemperature/DallasTemperature.cpp | 0 .../DallasTemperature/DallasTemperature.h | 0 .../DallasTemperature/README.TXT | 0 .../DallasTemperature/change.txt | 0 .../examples/Alarm/Alarm.pde | 0 .../examples/AlarmHandler/AlarmHandler.pde | 0 .../examples/Multiple/Multiple.pde | 0 .../examples/Simple/Simple.pde | 0 .../examples/Single/Single.pde | 0 .../examples/Tester/Tester.pde | 0 .../WaitForConversion/WaitForConversion.pde | 0 .../WaitForConversion2/WaitForConversion2.pde | 0 .../DallasTemperature/keywords.txt | 0 .../Arduino-Libraries}/OneWire/OneWire.cpp | 0 .../Arduino-Libraries}/OneWire/OneWire.h | 0 .../DS18x20_Temperature.pde | 0 .../examples/DS2408_Switch/DS2408_Switch.pde | 0 .../examples/DS250x_PROM/DS250x_PROM.pde | 0 .../Arduino-Libraries}/OneWire/keywords.txt | 0 .../Arduino-Libraries/README.txt | 1 + .../DS18B20_address_finder.ino | 0 .../arduino_ds18b20_temperature_sensor.ino | 0 28 files changed, 482 insertions(+) create mode 100644 Assasin costume/running_costume_with_temp_and_pulse_Sensor/Interrupt.ino create mode 100644 Assasin costume/running_costume_with_temp_and_pulse_Sensor/running_costume_with_temp_and_pulse_Sensor.ino rename Assasin costume/{testing programs => testing-config programs}/program_to_test_and_read_freq_for_pwm/program_to_test_and_read_freq_for_pwm.ino (100%) rename Assasin costume/{testing programs => testing-config programs}/program_to_test_and_read_temperatures/program_to_test_and_read_temperatures.ino (100%) create mode 100644 Sample-Reference Programs/PulseSensorAmped_Arduino_1dot2/Interrupt.ino create mode 100644 Sample-Reference Programs/PulseSensorAmped_Arduino_1dot2/PulseSensorAmped_Arduino_1dot2.ino rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/DallasTemperature.cpp (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/DallasTemperature.h (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/README.TXT (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/change.txt (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/examples/Alarm/Alarm.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/examples/AlarmHandler/AlarmHandler.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/examples/Multiple/Multiple.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/examples/Simple/Simple.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/examples/Single/Single.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/examples/Tester/Tester.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/examples/WaitForConversion/WaitForConversion.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/examples/WaitForConversion2/WaitForConversion2.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/DallasTemperature/keywords.txt (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/OneWire/OneWire.cpp (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/OneWire/OneWire.h (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/OneWire/examples/DS18x20_Temperature/DS18x20_Temperature.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/OneWire/examples/DS2408_Switch/DS2408_Switch.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/OneWire/examples/DS250x_PROM/DS250x_PROM.pde (100%) rename {arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries => Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries}/OneWire/keywords.txt (100%) create mode 100644 Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/README.txt rename {arduino_ds18b20_temperature_sensor => Sample-Reference Programs/arduino_ds18b20_temperature_sensor}/DS18B20_address_finder/DS18B20_address_finder.ino (100%) rename {arduino_ds18b20_temperature_sensor => Sample-Reference Programs/arduino_ds18b20_temperature_sensor}/arduino_ds18b20_temperature_sensor.ino (100%) diff --git a/Assasin costume/running_costume_with_temp_and_pulse_Sensor/Interrupt.ino b/Assasin costume/running_costume_with_temp_and_pulse_Sensor/Interrupt.ino new file mode 100644 index 0000000..244bae4 --- /dev/null +++ b/Assasin costume/running_costume_with_temp_and_pulse_Sensor/Interrupt.ino @@ -0,0 +1,108 @@ + + + +volatile int rate[10]; // array to hold last ten IBI values +volatile unsigned long sampleCounter = 0; // used to determine pulse timing +volatile unsigned long lastBeatTime = 0; // used to find IBI +volatile int P =512; // used to find peak in pulse wave, seeded +volatile int T = 512; // used to find trough in pulse wave, seeded +volatile int thresh = 512; // used to find instant moment of heart beat, seeded +volatile int amp = 100; // used to hold amplitude of pulse waveform, seeded +volatile boolean firstBeat = true; // used to seed rate array so we startup with reasonable BPM +volatile boolean secondBeat = false; // used to seed rate array so we startup with reasonable BPM + + +void interruptSetup(){ + // Initializes Timer2 to throw an interrupt every 2mS. + TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE + TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER + OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE + TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A + sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED +} + + +// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE. +// Timer 2 makes sure that we take a reading every 2 miliseconds +ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124 + cli(); // disable interrupts while we do this + Signal = analogRead(pulsePin); // read the Pulse Sensor + sampleCounter += 2; // keep track of the time in mS with this variable + int N = sampleCounter - lastBeatTime; // monitor the time since the last beat to avoid noise + + // find the peak and trough of the pulse wave + if(Signal < thresh && N > (IBI/5)*3){ // avoid dichrotic noise by waiting 3/5 of last IBI + if (Signal < T){ // T is the trough + T = Signal; // keep track of lowest point in pulse wave + } + } + + if(Signal > thresh && Signal > P){ // thresh condition helps avoid noise + P = Signal; // P is the peak + } // keep track of highest point in pulse wave + + // NOW IT'S TIME TO LOOK FOR THE HEART BEAT + // signal surges up in value every time there is a pulse + if (N > 250){ // avoid high frequency noise + if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){ + Pulse = true; // set the Pulse flag when we think there is a pulse + digitalWrite(fadePin,HIGH); // turn on pin 13 LED + IBI = sampleCounter - lastBeatTime; // measure time between beats in mS + lastBeatTime = sampleCounter; // keep track of time for next pulse + + if(secondBeat){ // if this is the second beat, if secondBeat == TRUE + secondBeat = false; // clear secondBeat flag + for(int i=0; i<=9; i++){ // seed the running total to get a realisitic BPM at startup + rate[i] = IBI; + } + } + + if(firstBeat){ // if it's the first time we found a beat, if firstBeat == TRUE + firstBeat = false; // clear firstBeat flag + secondBeat = true; // set the second beat flag + sei(); // enable interrupts again + return; // IBI value is unreliable so discard it + } + + + // keep a running total of the last 10 IBI values + word runningTotal = 0; // clear the runningTotal variable + + for(int i=0; i<=8; i++){ // shift data in the rate array + rate[i] = rate[i+1]; // and drop the oldest IBI value + runningTotal += rate[i]; // add up the 9 oldest IBI values + } + + rate[9] = IBI; // add the latest IBI to the rate array + runningTotal += rate[9]; // add the latest IBI to runningTotal + runningTotal /= 10; // average the last 10 IBI values + BPM = 60000/runningTotal; // how many beats can fit into a minute? that's BPM! + QS = true; // set Quantified Self flag + // QS FLAG IS NOT CLEARED INSIDE THIS ISR + } + } + + if (Signal < thresh && Pulse == true){ // when the values are going down, the beat is over + Pulse = false; // reset the Pulse flag so we can do it again + amp = P - T; // get amplitude of the pulse wave + thresh = amp/2 + T; // set thresh at 50% of the amplitude + P = thresh; // reset these for next time + T = thresh; + } + + if (N > 2500){ // if 2.5 seconds go by without a beat + thresh = 512; // set thresh default + P = 512; // set P default + T = 512; // set T default + lastBeatTime = sampleCounter; // bring the lastBeatTime up to date + firstBeat = true; // set these to avoid noise + secondBeat = false; // when we get the heartbeat back + } + + sei(); // enable interrupts when youre done! +}// end isr + + + + + diff --git a/Assasin costume/running_costume_with_temp_and_pulse_Sensor/running_costume_with_temp_and_pulse_Sensor.ino b/Assasin costume/running_costume_with_temp_and_pulse_Sensor/running_costume_with_temp_and_pulse_Sensor.ino new file mode 100644 index 0000000..b17dfa2 --- /dev/null +++ b/Assasin costume/running_costume_with_temp_and_pulse_Sensor/running_costume_with_temp_and_pulse_Sensor.ino @@ -0,0 +1,174 @@ +//Author: Saurutobi +#include +#include + +enum LINE { + lineA = 2, + lineB, + lineC, + lineD, + lineE, + lineF, + lineG +} line; + +int statusLED = 10; +int testLED = 13; +float inputTemp = 12; +int freq1 = 100; +int freq2 = 200; +int freq3 = 300; +int freq4 = 400; +int freq5 = 500; +int freq6 = 600; +int freq7 = 700; +int freq8 = 800; +int freq9 = 900; +int freq10 = 1000; +int lowthreshold = 0; +int threshold1 = 1; +int threshold2 = 2; +int threshold3 = 3; +int threshold4 = 4; +int threshold5 = 5; +int threshold6 = 6; +int threshold7 = 7; +int highthreshold = 8; + +// Data wire is plugged into pin 3 on the Arduino +#define ONE_WIRE_BUS 3 + +// Setup a oneWire instance to communicate with any OneWire devices +OneWire oneWire(ONE_WIRE_BUS); + +// Pass our oneWire reference to Dallas Temperature. +DallasTemperature sensors(&oneWire); + +//USE THE DS18B20_address_finder to get this address +DeviceAddress tempSensor = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE }; + +//Pulse Sensor Variables +int pulsePin = 0; // Pulse Sensor purple wire connected to analog pin 0 +int fadePin = 9; // 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, 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. + +void setup() +{ + //set up testLED, statusLED for output + pinMode(testLED, OUTPUT); + pinMode(statusLED, OUTPUT); + + //set up all lines for output + pinMode(lineA, OUTPUT); + pinMode(lineB, OUTPUT); + pinMode(lineC, OUTPUT); + pinMode(lineD, OUTPUT); + pinMode(lineE, OUTPUT); + pinMode(lineF, OUTPUT); + pinMode(lineG, OUTPUT); + + // Start up the library + sensors.begin(); + // set the resolution to 10 bit (good enough?) + sensors.setResolution(tempSensor, 9); + + //Pulse Sensor Setup + pinMode(fadePin,OUTPUT); // pin that will fade to your heartbeat! + interruptSetup(); // sets up to read Pulse Sensor signal every 2mS +} + +void loop() +{ + //read temperature here + sensors.requestTemperatures(); + inputTemp = sensors.getTempC(tempSensor); + dWrite(); + + //Pulse Sensor + 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 + QS = false; // reset the Quantified Self flag for next time + } + ledFadeToBeat(); + + //delay(20); // take a break +} + +void dWrite() +{ + //we want to stop when we've started over the 3rd time + enum LINE line = lineA; + int frequency = HIGH; + for(int counter = 0; counter < 2; line = static_cast(static_cast(line) + 1)) + { + digitalWrite(testLED, frequency); //do the first test + digitalWrite(line, frequency); //write to the specific line and freq + if (line == lineG) //if we're at the end do something different + { + /*** Depending on HIGH or LOW we will do freq# or 1000 - freq# ***/ + if (inputTemp <= lowthreshold) + { + delayMicroseconds((counter * 1000) - freq1); + } + else if (inputTemp > lowthreshold && inputTemp <= threshold1) + { + delayMicroseconds((counter * 1000) - freq2); + } + else if (inputTemp > threshold1 && inputTemp <= threshold2) + { + delayMicroseconds((counter * 1000) - freq3); + } + else if (inputTemp > threshold2 && inputTemp <= threshold3) + { + delayMicroseconds((counter * 1000) - freq4); + } + else if (inputTemp > threshold3 && inputTemp <= threshold4) + { + delayMicroseconds((counter * 1000) - freq5); + } + else if (inputTemp > threshold4 && inputTemp <= threshold5) + { + delayMicroseconds((counter * 1000) - freq6); + } + else if (inputTemp > threshold5 && inputTemp <= threshold6) + { + delayMicroseconds((counter * 1000) - freq7); + } + else if (inputTemp > threshold6 && inputTemp <= threshold7) + { + delayMicroseconds((counter * 1000) - freq8); + } + else if (inputTemp > threshold7 && inputTemp <= highthreshold) + { + delayMicroseconds((counter * 1000) - freq9); + } + else + { + delayMicroseconds((counter * 1000) - freq10); + } + + if (counter == 0) //only do this stuff the first time + { + frequency = LOW; //change the frequency + digitalWrite(testLED, frequency); //do a test write + } + + counter++; //change the next set of writes + line = lineA; + } + } +} + +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 +} diff --git a/Assasin costume/testing programs/program_to_test_and_read_freq_for_pwm/program_to_test_and_read_freq_for_pwm.ino b/Assasin costume/testing-config programs/program_to_test_and_read_freq_for_pwm/program_to_test_and_read_freq_for_pwm.ino similarity index 100% rename from Assasin costume/testing programs/program_to_test_and_read_freq_for_pwm/program_to_test_and_read_freq_for_pwm.ino rename to Assasin costume/testing-config programs/program_to_test_and_read_freq_for_pwm/program_to_test_and_read_freq_for_pwm.ino diff --git a/Assasin costume/testing programs/program_to_test_and_read_temperatures/program_to_test_and_read_temperatures.ino b/Assasin costume/testing-config programs/program_to_test_and_read_temperatures/program_to_test_and_read_temperatures.ino similarity index 100% rename from Assasin costume/testing programs/program_to_test_and_read_temperatures/program_to_test_and_read_temperatures.ino rename to Assasin costume/testing-config programs/program_to_test_and_read_temperatures/program_to_test_and_read_temperatures.ino diff --git a/Sample-Reference Programs/PulseSensorAmped_Arduino_1dot2/Interrupt.ino b/Sample-Reference Programs/PulseSensorAmped_Arduino_1dot2/Interrupt.ino new file mode 100644 index 0000000..f2081aa --- /dev/null +++ b/Sample-Reference Programs/PulseSensorAmped_Arduino_1dot2/Interrupt.ino @@ -0,0 +1,109 @@ + + + +volatile int rate[10]; // array to hold last ten IBI values +volatile unsigned long sampleCounter = 0; // used to determine pulse timing +volatile unsigned long lastBeatTime = 0; // used to find IBI +volatile int P =512; // used to find peak in pulse wave, seeded +volatile int T = 512; // used to find trough in pulse wave, seeded +volatile int thresh = 512; // used to find instant moment of heart beat, seeded +volatile int amp = 100; // used to hold amplitude of pulse waveform, seeded +volatile boolean firstBeat = true; // used to seed rate array so we startup with reasonable BPM +volatile boolean secondBeat = false; // used to seed rate array so we startup with reasonable BPM + + +void interruptSetup(){ + // Initializes Timer2 to throw an interrupt every 2mS. + TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE + TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER + OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE + TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A + sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED +} + + +// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE. +// Timer 2 makes sure that we take a reading every 2 miliseconds +ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124 + cli(); // disable interrupts while we do this + Signal = analogRead(pulsePin); // read the Pulse Sensor + sampleCounter += 2; // keep track of the time in mS with this variable + int N = sampleCounter - lastBeatTime; // monitor the time since the last beat to avoid noise + + // find the peak and trough of the pulse wave + if(Signal < thresh && N > (IBI/5)*3){ // avoid dichrotic noise by waiting 3/5 of last IBI + if (Signal < T){ // T is the trough + T = Signal; // keep track of lowest point in pulse wave + } + } + + if(Signal > thresh && Signal > P){ // thresh condition helps avoid noise + P = Signal; // P is the peak + } // keep track of highest point in pulse wave + + // NOW IT'S TIME TO LOOK FOR THE HEART BEAT + // signal surges up in value every time there is a pulse + if (N > 250){ // avoid high frequency noise + if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){ + Pulse = true; // set the Pulse flag when we think there is a pulse + digitalWrite(blinkPin,HIGH); // turn on pin 13 LED + IBI = sampleCounter - lastBeatTime; // measure time between beats in mS + lastBeatTime = sampleCounter; // keep track of time for next pulse + + if(secondBeat){ // if this is the second beat, if secondBeat == TRUE + secondBeat = false; // clear secondBeat flag + for(int i=0; i<=9; i++){ // seed the running total to get a realisitic BPM at startup + rate[i] = IBI; + } + } + + if(firstBeat){ // if it's the first time we found a beat, if firstBeat == TRUE + firstBeat = false; // clear firstBeat flag + secondBeat = true; // set the second beat flag + sei(); // enable interrupts again + return; // IBI value is unreliable so discard it + } + + + // keep a running total of the last 10 IBI values + word runningTotal = 0; // clear the runningTotal variable + + for(int i=0; i<=8; i++){ // shift data in the rate array + rate[i] = rate[i+1]; // and drop the oldest IBI value + runningTotal += rate[i]; // add up the 9 oldest IBI values + } + + rate[9] = IBI; // add the latest IBI to the rate array + runningTotal += rate[9]; // add the latest IBI to runningTotal + runningTotal /= 10; // average the last 10 IBI values + BPM = 60000/runningTotal; // how many beats can fit into a minute? that's BPM! + QS = true; // set Quantified Self flag + // QS FLAG IS NOT CLEARED INSIDE THIS ISR + } + } + + if (Signal < thresh && Pulse == true){ // when the values are going down, the beat is over + digitalWrite(blinkPin,LOW); // turn off pin 13 LED + Pulse = false; // reset the Pulse flag so we can do it again + amp = P - T; // get amplitude of the pulse wave + thresh = amp/2 + T; // set thresh at 50% of the amplitude + P = thresh; // reset these for next time + T = thresh; + } + + if (N > 2500){ // if 2.5 seconds go by without a beat + thresh = 512; // set thresh default + P = 512; // set P default + T = 512; // set T default + lastBeatTime = sampleCounter; // bring the lastBeatTime up to date + firstBeat = true; // set these to avoid noise + secondBeat = false; // when we get the heartbeat back + } + + sei(); // enable interrupts when youre done! +}// end isr + + + + + diff --git a/Sample-Reference Programs/PulseSensorAmped_Arduino_1dot2/PulseSensorAmped_Arduino_1dot2.ino b/Sample-Reference Programs/PulseSensorAmped_Arduino_1dot2/PulseSensorAmped_Arduino_1dot2.ino new file mode 100644 index 0000000..32f7d83 --- /dev/null +++ b/Sample-Reference Programs/PulseSensorAmped_Arduino_1dot2/PulseSensorAmped_Arduino_1dot2.ino @@ -0,0 +1,90 @@ + +/* +>> Pulse Sensor Amped 1.2 << +This code is for Pulse Sensor Amped by Joel Murphy and Yury Gitman + www.pulsesensor.com + >>> 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. + +This code is designed with output serial data to Processing sketch "PulseSensorAmped_Processing-xx" +The Processing sketch is a simple data visualizer. +All the work to find the heartbeat and determine the heartrate happens in the code below. +Pin 13 LED will blink with heartbeat. +If you want to use pin 13 for something else, adjust the interrupt handler +It will also fade an LED on pin fadePin with every beat. Put an LED and series resistor from fadePin to GND. +Check here for detailed code walkthrough: +http://pulsesensor.myshopify.com/pages/pulse-sensor-amped-arduino-v1dot1 + +Code Version 1.2 by Joel Murphy & Yury Gitman Spring 2013 +This update fixes the firstBeat and secondBeat flag usage so that realistic BPM is reported. + +*/ + + +// VARIABLES +int pulsePin = 0; // Pulse Sensor purple wire connected to analog pin 0 +int blinkPin = 13; // 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, 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. + + +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 + } + + + + + + + diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/DallasTemperature.cpp b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/DallasTemperature.cpp similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/DallasTemperature.cpp rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/DallasTemperature.cpp diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/DallasTemperature.h b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/DallasTemperature.h similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/DallasTemperature.h rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/DallasTemperature.h diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/README.TXT b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/README.TXT similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/README.TXT rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/README.TXT diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/change.txt b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/change.txt similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/change.txt rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/change.txt diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Alarm/Alarm.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Alarm/Alarm.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Alarm/Alarm.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Alarm/Alarm.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/AlarmHandler/AlarmHandler.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/AlarmHandler/AlarmHandler.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/AlarmHandler/AlarmHandler.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/AlarmHandler/AlarmHandler.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Multiple/Multiple.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Multiple/Multiple.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Multiple/Multiple.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Multiple/Multiple.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Simple/Simple.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Simple/Simple.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Simple/Simple.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Simple/Simple.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Single/Single.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Single/Single.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Single/Single.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Single/Single.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Tester/Tester.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Tester/Tester.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/Tester/Tester.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/Tester/Tester.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/WaitForConversion/WaitForConversion.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/WaitForConversion/WaitForConversion.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/WaitForConversion/WaitForConversion.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/WaitForConversion/WaitForConversion.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/WaitForConversion2/WaitForConversion2.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/WaitForConversion2/WaitForConversion2.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/examples/WaitForConversion2/WaitForConversion2.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/examples/WaitForConversion2/WaitForConversion2.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/keywords.txt b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/keywords.txt similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/DallasTemperature/keywords.txt rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/DallasTemperature/keywords.txt diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/OneWire.cpp b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/OneWire.cpp similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/OneWire.cpp rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/OneWire.cpp diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/OneWire.h b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/OneWire.h similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/OneWire.h rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/OneWire.h diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/examples/DS18x20_Temperature/DS18x20_Temperature.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/examples/DS18x20_Temperature/DS18x20_Temperature.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/examples/DS18x20_Temperature/DS18x20_Temperature.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/examples/DS18x20_Temperature/DS18x20_Temperature.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/examples/DS2408_Switch/DS2408_Switch.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/examples/DS2408_Switch/DS2408_Switch.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/examples/DS2408_Switch/DS2408_Switch.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/examples/DS2408_Switch/DS2408_Switch.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/examples/DS250x_PROM/DS250x_PROM.pde b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/examples/DS250x_PROM/DS250x_PROM.pde similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/examples/DS250x_PROM/DS250x_PROM.pde rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/examples/DS250x_PROM/DS250x_PROM.pde diff --git a/arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/keywords.txt b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/keywords.txt similarity index 100% rename from arduino_ds18b20_temperature_sensor/These Libraries go in MyDocuments-Arduino-Libraries/OneWire/keywords.txt rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/OneWire/keywords.txt diff --git a/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/README.txt b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/README.txt new file mode 100644 index 0000000..e1e39d9 --- /dev/null +++ b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/Arduino-Libraries/README.txt @@ -0,0 +1 @@ +These Libraries go in MyDocuments \ No newline at end of file diff --git a/arduino_ds18b20_temperature_sensor/DS18B20_address_finder/DS18B20_address_finder.ino b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/DS18B20_address_finder/DS18B20_address_finder.ino similarity index 100% rename from arduino_ds18b20_temperature_sensor/DS18B20_address_finder/DS18B20_address_finder.ino rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/DS18B20_address_finder/DS18B20_address_finder.ino diff --git a/arduino_ds18b20_temperature_sensor/arduino_ds18b20_temperature_sensor.ino b/Sample-Reference Programs/arduino_ds18b20_temperature_sensor/arduino_ds18b20_temperature_sensor.ino similarity index 100% rename from arduino_ds18b20_temperature_sensor/arduino_ds18b20_temperature_sensor.ino rename to Sample-Reference Programs/arduino_ds18b20_temperature_sensor/arduino_ds18b20_temperature_sensor.ino