imageIn dit project zitten een helder infrarode (IR) LED en een fototransistor aan de vinger om de hartslag te meten. De rode LED knippert bij elke puls. Deze meter werkt als volgt: De LED aan de ene de kant van de vinger en fototransistor aan de andere kant.


//HARTSLAGMODULE schakeling 24
//met infrarood
/// Copyright (c)2015 Dan Truong
/// Permission is granted to use this software under the MIT
/// licence, with my name and copyright kept in source code
/// http://http://opensource.org/licenses/MIT
/// KY039 Arduino Heartrate Monitor V1.0 (April 02, 2015)

/// @param[in] IRSensorPin Analog pin on which IR detector is connected
/// @param[in] delay (msec) delay between calls to this method. It is
///                  best to call it at least 5 times per beat, aka
///                  no slower than 150msec for 70bpm. An ideal value
///                  is 60ms or faster to handle up to 200 BPM.
/// @brief
/// True if heartbeat is detected on the sensor.
/// This code is trivial and just does a peak detection, instead of
/// trying to detect the heart’s pulse waveform.
/// Note: I am fudging sensor data with the delay to make the integer
/// math after that uses constants, somewhat independant of the sleep
/// delay used in the main loop. Otherwise if maxValue decays too slow
/// or too fast, it causes glitches and false beat detection.
#define HBDEBUG(i) i
//#define HBDEBUG(i)

heartbeatDetected(int IRSensorPin, int delay)
static int maxValue = 0;
static bool isPeak = false;
int rawValue;
bool result = false;

rawValue = analogRead(IRSensorPin);
// Separated because analogRead() may not return an int
rawValue *= (1000/delay);
HBDEBUG(Serial.print(isPeak); Serial.print(“p, “));
HBDEBUG(Serial.print(rawValue); Serial.print(“r, “));
HBDEBUG(Serial.print(maxValue); Serial.print(“m, “));

// If sensor shifts, then max is out of whack.
// Just reset max to a new baseline.
if (rawValue * 4L < maxValue) {
maxValue = rawValue * 0.8;
HBDEBUG(Serial.print(“RESET, “));

// Detect new peak
if (rawValue > maxValue – (1000/delay)) {
// Only change peak if we find a higher one.
if (rawValue > maxValue) {
maxValue = rawValue;
// Only return true once per peak.
if (isPeak == false) {
result = true;
Serial.print(result); Serial.print(“,  *”);
isPeak = true;
} else if (rawValue < maxValue – (3000/delay)) {
isPeak = false;
// Decay max value to adjust to sensor shifting
// Note that it may take a few seconds to re-detect
// the signal when sensor is pushed on meatier part
// of the finger. Another way would be to track how
// long since last beat, and if over 1sec, reset
// maxValue, or to use derivatives to remove DC bias.
return result;

// Arduino main code
int ledPin=13;
int analogPin=0;

void setup()
// Built-in arduino board pin for the display LED

// Init serial console
Serial.println(“Heartbeat detection sample code.”);

const int delayMsec = 60; // 100msec per sample

// The main loop blips the LED and computes BPMs on serial port.
void loop()
static int beatMsec = 0;
int heartRateBPM = 0;

if (heartbeatDetected(analogPin, delayMsec)) {
heartRateBPM = 60000 / beatMsec;

// Print msec/beat and instantaneous heart rate in BPM
Serial.print(“, “);

beatMsec = 0;
} else {
// Note: I assume the sleep delay is way longer than the
// number of cycles used to run the code hence the error
// is negligible for math.
beatMsec += delayMsec;


download ino via menu “Schets”

Geef een reactie

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit /  Bijwerken )

Google photo

Je reageert onder je Google account. Log uit /  Bijwerken )


Je reageert onder je Twitter account. Log uit /  Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit /  Bijwerken )

Verbinden met %s