Skip to main content

How to use a Bone Conductor Transducer

What is aBone Heart Rate Sensor?Conduction?

HeartBone Rateconduction Sensoris a plug-and-playway sensorof transmitting sound to the inner ear through the bones of the skull instead of through the air and eardrum. In normal hearing, sound waves travel through the air, vibrate the eardrum, and are then passed to the inner ear. With bone conduction, vibrations are sent directly through the skull bones to the cochlea (the hearing organ), bypassing the eardrum entirely.

The Bone Conductor Transducer can create the vibration, and hence sounds, making everything (?!) into a speaker. It can work on several different surfaces, including Acrylic, Wood, Plastic and Glass! Hollow objects perform better than objects that canare easilydenser. incorporateThe livebone heart-rateconductor datatransducer into projects. Inproduces the lab,best wequality offersound thewhen Ear-clip/Finger-clipit's Heartpressed Rateup Sensoragainst froma Seeed Studio. surface.

For other popular heart rate sensors that look like below, we found it to be tricky to use. The user cannot press on the sensor too hard or too soft, otherwise you will get very unstable reading.

WiringCircuit

You will need the following components to make the circuit.

  1. RedPower Supply (For testing, you can use the 3.3V and GND from Arduino if you have one.)
  2. 3.5mm audio jack
  3. Audio Amplifier (We have MAX98306 in CTH, you can use other similar models.)
  4. 3.5mm Audio cable (to connect to 5Vthe (Power)computers/phones)
  5. YellowBone toConductor A0 (Signal)
  6. Black to GND (Ground)Transducer

boneConductorCircuit.png

Get

If Started

you

Thisare exampleusing willMAX98306, printyou can use the BPMjumper onto change the serialamplifier monitorgain and blinkat the builtinbottom. LED to indicate each beat.MAX98306.png

int PulseSensorPurplePin = A0;    // Pulse Sensor connected to analog pin A0
int LED = LED_BUILTIN;            // On-board LED
int Threshold = 550;              // Threshold for detecting a heartbeat

int Signal;                       // Holds raw analog reading
bool PulseDetected = false;       // True when a beat is detected
unsigned long lastBeatTime = 0;   // Time (ms) of the last beat
float BPM = 0;                    // Calculated Beats Per Minute

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  // Read the sensor
  Signal = analogRead(PulseSensorPurplePin);

  // Check if signal crosses the threshold upward (beat detected)
  if (Signal > Threshold && !PulseDetected) {
    PulseDetected = true;  // mark that we’re in a beat

    unsigned long currentTime = millis();
    unsigned long delta = currentTime - lastBeatTime;

    if (lastBeatTime > 0) {  // skip first beat (no interval yet)
      BPM = 60000.0 / delta;  // 60000 ms per minute
      Serial.print("BPM: ");
      Serial.println(BPM);
    }

    lastBeatTime = currentTime;
    digitalWrite(LED, HIGH);  // flash LED on beat
  }

  // When signal goes back below threshold, reset for next detection
  if (Signal < Threshold && PulseDetected) {
    PulseDetected = false;
    digitalWrite(LED, LOW);
  }

  // Small non-blocking pause (optional for stability)
  // Just ensures serial output isn’t too fast
  static unsigned long lastPrint = 0;
  if (millis() - lastPrint > 20) {
    //Serial.print("Signal: ");
    //Serial.println(Signal);
    lastPrint = millis();
  }
}

This example will print your heart rate on the Serial Potter, you will see somthing similar to the hospital machine.

//  Variables
int PulseSensorPurplePin = 0;        // Pulse Sensor PURPLE WIRE connected to ANALOG PIN 0
int LED = LED_BUILTIN;   //  The on-board Arduion LED


int Signal;                // holds the incoming raw data. Signal value can range from 0-1024
int Threshold = 540;       // Determine which Signal to "count as a beat", and which to ingore.


// The SetUp Function:
void setup() {
  pinMode(LED,OUTPUT);         // pin that will blink to your heartbeat!
   Serial.begin(115200);       // Set's up Serial Communication at certain speed.

}

// The Main Loop Function
void loop() {

  Signal = analogRead(PulseSensorPurplePin);  // Read the PulseSensor's value.
                                              // Assign this value to the "Signal" variable.

   Serial.println("Signal " + String(Signal)); // Send "reading " followed by the Signal value to Serial Plotter.


   if(Signal > Threshold){                          // If the signal is above "550", then "turn-on" Arduino's on-Board LED.
     digitalWrite(LED,HIGH);
   } else {
     digitalWrite(LED,LOW);                //  Else, the sigal must be below "550", so "turn-off" this LED.
   }


delay(20);


}