Doguino: Using Arduino to Measure a Dogs Heartbeat

For a while now I have seen biometric tools that measure heartbeats in order to give an indication of an emotive state. Not only has biometrics been taken up in businesses to measure happiness and engagement at work but more recently they have been embedded into pet collars to help owners track their pet’s health and emotions often through an app.

Petpace Collar that claims to tell you how your dog is feeling
Petpace Collar that claims to tell you how your dog is feeling
voice collar
The Voyce collar  claims to let owners know what their dog is trying to tell them in regards to health

 

 

 

 

 

 

While I have blogged before about biometrics and emotions (see ‘Is it possible to use Biometrics to measure dogs emotions?‘), I decided to have a go at building a biometric device for dogs myself, to explore this further.

Looking online there are a few costly pre-built dog heart rate monitors, often through collars, such as PetPace collar ($149.95), Voyce collar ($199.99) and  Alivecor Vet a phone snap-on ($199.99). But how do these work?

Alivecor Vet works by having two metal strips (see below) which act as electrodes to measure the electric current in the heart over a period of time called electrocardiography (ECG).

 

AliveCor Vet Phone case showing metal electrodes
AliveCor Vet Phone case showing metal electrodes

In order for this to work you have to have skin contact, hence why AliveCor recommends using alcohol to allow the electric current bypass the issue of the pet’s fur. PetPace and Voyce do not advertise how they measure heartbeat but due to the fact that it is on the neck it must measure heartbeat through light. Technology, such as the apple watch and other devices worn on the wrist (or dogs neck), shine light into your skin to detect the difference in volume in blood that occurs when your heart beats and pushes blood through these vessels. Sensors on the device can detect how much light is reflected back which is less when there is a higher volume of blood. This way of measuring heartbeat is called photoplethysmography. To combat the fur getting in the way PetPace has sticking out probes to get close enough to the skin so that the light can reach the skin: ochie!

PetPace Collar front and back
PetPace Collar front and back

In the device I wanted to make I did not want it to be uncomfatable to dogs through probes worn on the neck like PetPace and Voyce, or alcohol gel like AliveCor. Therefore I chose to do it via photoplethysmography and through an area on the dog that does not have much (or much fur!): the ear.

As I wanted a low priced solution I chose to build the device through Arduino (Genuino Uno) board which cost approximately £14.40 (€20).

Arduino Uno Genuino (Euro Version)
Arduino Uno Genuino (Euro Version)

Arduino is an open source microcontroller that is programmable through Arduino Software (IUD). The photoplethysmography device I chose a Grove Ear Clip Sensor with receiver module from SeedStudio (cost around £10/€13.40).

Grove Ear Clip Heart Rate Sensor
Grove Ear Clip Heart Rate Sensor

To pair these devices together I used standard Arduino wires: 10mm male jump wires. To ensure more accuracy I ran the Arduino board off a 9v battery connected via a battery connector (snap connector). 

The software I decided to use was also from SeedStudo written by FrankieChu (shown below). Unlike the code shown I did not use the base shield and instead wired it straight into the board. Authough the code allows for it, I also did not use LEDs & Breadboard to create a flashing LED representing heart rate. Instead I used the Serial Monitor (available under tools) to create an average heart rate per every 20 beats taken.

How does this all work? This project works by measuring each heartbeat through photoplethysmography (as described above) and then creating a signal interruption when the blood volume is at its fullest. The IUD then times these interruptions (beats) to create an average interruption per minute. If using the LED, these interruptions also cause Arduino to change the state from LOW to HIGH causing a pulse flash.

Once this was fully built it looked like the following:

Heart Rate Monitor Fully Built!
Heart Rate Monitor Fully Built!

Now to test it. I initially used it on the edge of my dog’s ears in a similar fashion to my own when building the monitor. However due to the furriness of the edge of my dog’s ear the light could not penetrate through this with the monitor restarting itself due to lack of signal. To combat this I then clipped the ear monitor to the middle by folding over his ear where there was no fur.

(Disclaimer: This did not hurt him and the ear clip is not tight (I tried it myself). He actually fell asleep while I was doing this as you can see!). 

Dog hooked up to Arudino Ear Clip Project
Dog hooked up to Arudino Ear Clip Project

In the serial monitor this produced both the interruptions times (in milliseconds), total time (ms), beat number (out of 20) and average heartbeat (marked on diagram below).

Ouput shown in the Serial Monitor in Arudino whilst montoring a dogs heartbeat via the ear. Dogs average heart rate was 63.
Ouput shown in the Serial Monitor in Arudino whilst montoring a dogs heartbeat via the ear. Dogs average heart rate was 63.

Once the dog fell asleep the heart rate would fall into the 60s vs. in the 120s during being awake and excited.

So you can measure in ears, now what? Once it was established you are able to take a dogs heart beat through their ears, I realized this method was not viable to be used in ordinary circumstances as the dogs ear was not in a normal position. I then tried other places on a dog’s body, including the inside of his leg which has not only high concentrations of veins but also is not very furry. I was able to get readings here, but they were not as reliable as the inside of the ear. This was because the average number of beats had greater variations; the rate would jump from 60 to in the 100s within 20 beats. A dog’s heart rate usually varies from 60 to 140 bmp (as you can tell from the above heartbeat (a low 63) he was sleeping). The variation was suspect due to the dog moving his leg causing interruptions altering the average time between the interruptions which are how the heartbeat is calculated.

So what have we learned? I have found out it is possible to measure a dogs heartbeat through a cheap photoplethysmography device built using Arduino (approx £25 spent). However this is not possible in ordinary movement due to the dense fur usually found on a dog preventing photoplenthysmographies light transmission. Without shaving the dog, which we do not want to do, or constantly folding the dog’s ear over, which would be uncomfortable whilst standing due to the ear naturally flopping down in this breed, I am unsure how you would measure heartbeat. This is perhaps why current technology requires prongs into the dog or alcoholic gel.

Further work from this? With the current technology not supporting ECG or photoplethysmography, the alternative option could be though breathing monitoring which is directly linked to heart rate. As some dogs wear a dog harness already, a monitoring device could be put into place in a similar fashion and measure the breath rate.  However in dogs with one of their primary senses being smell, this could cause interruptive data, or smell data? We shall have to see!


 

EXTRA DETAILS INCLUDING IDU CODE, ITEM LIST & FRITZING SKETCH

Arduino Code Used – Originally coded by Frankie Chu found on Seed Studio

// Function: This program can be used to measure heart rate, the lowest pulse in the program be set to 30.
// Use an external interrupt to measure it.
// Hardware: Grove - Ear-clip Heart Rate Sensor, Grove - Base Shield, Grove - LED
// Arduino IDE: Arduino-1.0
// Author: FrankieChu 
// Date: Jan 22, 2013
// Version: v1.0
// by www.seeedstudio.com
#define LED 4//indicator, Grove - LED is connected with D4 of Arduino
boolean led_state = LOW;//state of LED, each time an external interrupt 
 //will change the state of LED
unsigned char counter;
unsigned long temp[21];
unsigned long sub;
bool data_effect=true;
unsigned int heart_rate;//the measurement result of heart rate
const int max_heartpluse_duty = 2000;//you can change it follow your system's request.
 //2000 meams 2 seconds. System return error 
 //if the duty overtrip 2 second.
void setup()
{
 pinMode(LED, OUTPUT);
 Serial.begin(9600);
 Serial.println("Please ready your chest belt.");
 delay(5000);
 arrayInit();
 Serial.println("Heart rate test begin.");
 attachInterrupt(0, interrupt, RISING);//set interrupt 0,digital port 2
}
void loop()
{
 digitalWrite(LED, led_state);//Update the state of the indicator
}
/*Function: calculate the heart rate*/
void sum()
{
 if(data_effect)
 {
 heart_rate=1200000/(temp[20]-temp[0]);//60*20*1000/20_total_time 
 Serial.print("Heart_rate_is:\t");
 Serial.println(heart_rate);
 }
 data_effect=1;//sign bit
}
/*Function: Interrupt service routine.Get the sigal from the external interrupt*/
void interrupt()
{
 temp[counter]=millis();
 Serial.println(counter,DEC);
 Serial.println(temp[counter]);
 switch(counter)
 {
 case 0:
 sub=temp[counter]-temp[20];
 Serial.println(sub);
 break;
 default:
 sub=temp[counter]-temp[counter-1];
 Serial.println(sub);
 break;
 }
 if(sub>max_heartpluse_duty)//set 2 seconds as max heart pluse duty
 {
 data_effect=0;//sign bit
 counter=0;
 Serial.println("Heart rate measure error,test will restart!" );
 arrayInit();
 }
 if (counter==20&&data_effect)
 {
 counter=0;
 sum();
 }
 else if(counter!=20&&data_effect)
 counter++;
 else 
 {
 counter=0;
 data_effect=1;
 }
 
}
/*Function: Initialization for the array(temp)*/
void arrayInit()
{
 for(unsigned char i=0;i < 20;i ++)
 {
 temp[i]=0;
 }
 temp[20]=millis();
}

Fritzing Sketch of Heartbeat Monitor

Fritzing Sketch of Ear Heart beat Monitor

Items used

  • Arduino Uno Board
  • Jumper Wires (x3)
  • Grove Ear Heart Rate Sensor
    •  Grove Ear Clip
    • Grove Receiver Module
Written by Ilyena Hirskyj-Douglas 5th December 2015