Nicht nur mit Fitnessarmbändern, auch am am Raspberry Pi ist es möglich Herzfrequenzen zu messen. Mit einem kleinen Modul – dem Raspberry Pi Puls Sensor – kann man sehr einfach den eigenen Puls und damit die Belastung bzw. auf Dauer den Gesundheitszustand messen. Dieser Sensor kann dank geringem Stromverbrauch auch in mobilen Raspberry Pi Anwendungen eingesetzt werden (Projekt Fitnesstracker? 😉 )
Was man dazu noch braucht und welche Bibliotheken genutzt werden können, werden in diesem Tutorial gezeigt.
Pulsmesser Zubehör
Da der Raspberry Pi Puls-Sensor nicht digital ausgelesen werden kann, benötigen wir einen Analog-Digital Wandler. In einem vorherigen Tutorial bin ich bereits genauer auf die Verwendung des ADC Wandlers eingegangen. Damit ist es möglich analoge Signale am Raspberry Pi auszulesen, da dieser – im Gegensatz zum Arduino – keine integrierten analogen IO-Pins hat.
Im Video (unten) habe ich folgende Bauteile verwendet:
Manche Sensoren werden mit einem Klettverschluss für den Finger mitgeliefert, was vorteilhaft für die Messung ist, da somit nicht zu viel Druck auf dem Finger herrscht.
Raspberry Pi Pulsmesser – Anschluss
Da auch dieser Sensor für den Arduino konzipiert wurde, liefert er kein digital auslesbares Signal. Um das analoge Signal dennoch auslesen zu können wird ein ADC wie der MCP3008 benötigt. In einem vorherigen Tutorial habe ich bereits gezeigt, wie man den Analog-Digital Wandler verwendet. Es spielt dabei keine Rolle, welchen Kanal des ADC’s du verwendest, solange du es später im Code anpasst.
Der Plus Pol des Pulssensors wird an 3.3V vom Raspberry Pi angeschlossen, sowie Minus an Ground. Den Signal- / Daten-Pin (beschriftet mit einem „S“) habe ich an Kanal 0 des MCP3008 angeschlossen.
Der ADC verwendet die SpiDev Bibliothek, die installiert sein muss.
Code zum Herzfrequenz auslesen
Falls du kein aktuelles Raspbian / NOOBS Betriebssystem benutzt, muss ggf. erst aktualisiert werden und git installiert werden.
sudo apt-get update sudo apt-get upgrade sudo apt-get install git
Auf GitHub habe ich eine Bibliothek zum Erfassen der Herzfrequenz bereit gestellt. Diese kannst du folgend herunterladen:
git clone https://github.com/tutRPi/Raspberry-Pi-Heartbeat-Pulse-Sensor
Auch anbei ist eine Beispieldatei, welche jede Sekunde die Herzfrequenz ausließt. Im Video weiter unten siehst du das noch einmal verdeutlicht.
Um das Beispiel zu starten wechseln wir in den Ordner und rufen die example.py
auf.
cd Raspberry-Pi-Heartbeat-Pulse-Sensor/ sudo python example.py
Um zu stoppen, drücke STRG+C.
Wenn du dir das Beispiel genauer ansiehst, so wirst du feststellen, dass mit p.startAsyncBPM()
ein Thread gestartet wird, der im Hintergrund den Puls misst. Mittels p.stopAsyncBPM()
kannst du diesen Thread – und damit die Messung – stoppen. Gerne kannst du den Code deinen Wünschen nach anpassen.
Pulsmesser Beispiel und Erweiterung
Im nachfolgenden Video habe ich die Beispieldatei ausgeführt und zeige die Messung meines Pulses. Zuvor habe ich meinen Puls mit meinem Smartphone (integrierter Pulsmesser) gemessen, wobei mir ein Ruhepuls vom 55 BPM angezeigt wurde.
Wie auch zu erkennen ist, ist die Messung nicht immer akkurat, vorallem wenn der Finger den Sensor nicht berührt. Hier könnte man sich mit einem Drucksensor o.ä. aushelfen und nur dann messen, wenn man sicher ist, dass der Finger den Pulssensor berührt. Außerdem dauert es ein paar Sekunden, bis der Puls richtig erfasst wird, aber das ist ja auch bei handelsüblichen Pulsmessern nicht anders.
Für das (ursprünglich für Arduino entwickelte) Modul, gibt es auch einen Beispielcode. Außerdem ist auf Github eine nette Visualisierung der Werte vorhanden. Es sollte nicht all zu viel Aufwand sein diese Dateien für meine Bibliothek anzupassen. Falls du Lust hast den Code zu verändern, darfst du auch gerne meine Bibliothek den Ansprüchen nach verändern. Über ein Kommentar würde ich mich freuen 🙂
30 Kommentare
Sehr interessantes Projekt!
hello.
My name is jun, I am a student at korea.
I interest pulse sensor. so i try your code at pi.
but i cann’t implement.. i have a error about
if you have a solution, plz … Could you give me a solution?
… thank you guys….. have a good day!!
Hi Jun,
the „P“ of the class has to be uppercase:
p = Pulsesensor()
Hi, I have try the code on Raspberry Pi 3 B and I can’t run it because of the error:
Traceback (most recent call last):
File „example.py“,line 4, in
p = Pulsesensor()
File „/home/pi/Raspberry-Pi-Heartbeat-Pulse-Sensor/pulsesensor.py“,line 11, in_init_
self.adc = MCP3008(bus, device)
File „/home/pi/Raspberry-Pi-Heartbeat-Pulse-Sensor/pulsesensor.py“,line 18, in_init_
self.open()
File „/home/pi/Raspberry-Pi-Heartbeat-Pulse-Sensor/pulsesensor.py“,line 20, in open
self.spi.open(self.bus, self.device)
IOError: [Errno 2] No such file or directory
Please help me on this error. Thank you
Sorry I made a mistake,
p = Pulsesensor()
Thank you very much for this excellent tutorial.
Would it also be possible to use a clip for measuring the pulse at my ear? E.g.
https://www.amazon.de/CooSpo-clip-Infrarot-Sensor-Pulsmesser-Sportger%C3%A4te-Laufband/dp/B00VSSBBCY/ref=sr_1_1?ie=UTF8&qid=1483626951&sr=8-1&keywords=puls-sensor+ohr
Cheers
Olaf
Hi Olaf,
should be possible with this module, if you can read the analogue Signal from the Aux Cable.
Hi. Sorry to bother you but i seem to face the same problem. I improved the
p = Pulse Sensor () line but theres still problem. Below are the errors.
File „example.py“, line 4, in
p = Pulse Sensor ()
File „/home/pi/Raspberry-Pi-Heartbeat-Pulse-Sensor/pulsesensor.py“,line 11, in_init_
self.adc = MCP3008 (bus, device)
File „/home/pi/Raspberry-Pi-Heartbeat-Pulse-Sensor/pulsesensor.py“,line 18, in_init_
self.open ()
File“ / home / pi / Raspberry- Pi Heartbeat Pulse sensor / pulsesensor.py „, line 20, in open
self.spi.open (self.bus, self.device)
IOError: [Errno 2] No such file or directory
Would appreciate your help.
Hi Mariam,
you have to install Spidev 🙂
hi ı am a student ı want buil your project but ı have a error it also say not herbeat found
Please help me on this error.
Please post the whole output / error message
did the problem got solved??? I too got the same problem want to know the solution .please anyone can help
Hi,
cooles Projekt. Das würde mich auch sehr interessieren. Kann man denn auch – event. auch zusätzlich – einen Impedanzsensor anschliessen, mit dem man den Hautwiderstand bzw. die Hautfeuchtigkeit messen kann?
Gruß
Michael
Hey, thanks for the tutorial. Could this code be used for an analog heartbeat sensor circuit, like one based on it led and photodiode???
The sensor I used is actually analogue, that’s why you need the MCP3008 ADC.
Hey do you know how to send the output of this sensor data to cloud servers like thingspeak using pyhton scripting.Can you suggest me how to do http request??
I have written a (german) tutorial on how to send data to thingspeak: Raspberry Pi Sensordaten mit ThingSpeak loggen und auswerten
Hallo, wo finde ich den code?
I want to understand how the raw data has been processed to bpm value.I couldn’t undestand it through comments in python files.Which algorithm has been used in processing the sensor data.
The analog data of the sensor is just converted to a digital readable value and then processed. Have you read the code?
Hallo Felix,
wir arbeiten derzeit an einem Projekt für den Informatikleistungskurs. In diesem Projekt möchten wir einen Herzfrequenzsensor mit dem RaspberryPi3 zum Laufen bringen. Jedoch gelingt es uns nicht die Visualisierung aus deinem Tutorial nachzuvollziehen, da alle Programme für ein Arduino entwickelt wurden.
Hättest Du eventuell ein konkretes Programm zur Visualisierung der Herzfrequenz?
Danke:)
Ich habe das Repo nur als Inspiration verlinkt. Aber gerade als Teilnehmer eines Informatik Leistungskurses sollte es für euch doch kein Problem sein den Arduino Code umzuschreiben 😉
Hallo Felix
Erstmals vielen Dank für das super Tutorial. Da ich frisch angefangen habe mit Programmieren wollte ich dich fragen ob du mir dein Programm zum ansteuern des MCP3008 kommentieren oder erklären kannst ? Mir ist nicht genau klar wo du definiert hast, welche Pins am Raspberry angesteuert werden sollen. Dies würde mir sehr weiterhelfen auch für folgende Projekte.
Die Pins, die genutzt werden, gehören zum SPI Bus.
Hi, I have followed your tutorial and it works initially, but it could not read bpm and shows „No heartbeat found“ after i format my sd card with the latest Raspbian, can you help me with this problem?
Hallo Felix,
danke für Dein Tut. Habe es nachgebaut aber ich kriege es nicht hin damit einen Puls zu messen.
Der Pulssensor leuchtet sobald der Pi in Betrieb geht und es scheinen auch Signale vom Sensor zu kommen. Ich habe in Deiner Klasse ein print (Signal) nach Deinem Signal = self.adc.read(self.channel) eingefügt. Hier sehe ich immer eine 0 in der Ausgabe. Wenn ich mit meinem Finger den Sensor berühre sehe ich eine kurze Zeit lang 255. Danach aber wieder 0, bis ich wieder loslasse. Frage mich nun, ob ich was falsch zusammengebastelt habe oder ob mein Sensor evtl. defekt ist? Wäre nett, wenn Du ne Idee hast wie ich das debuggen könnte!
Cooles Blog!
Kleine Korrektur. Ich sehe 0 und 252, nicht 255.
Dazwischen sehe ich nie irgendwelche Werte.
Könnte es sein, dass ich eine der Koomponenten zerstört habe, falls ich sie aus Versehen an 5V angeschlossen habe? Die Elektronikbastelei ist neu für mich und es kann sein, dass ich zuerst etwas falsch gemacht habe.
Update (fixed)
Nach sehr viel Herumprobieren, Neukaufen der Bauteile, ca. 10x neu verkabeln und neukompilieren vom Pyton Modul habe ich herausgefunden, warum es nicht geht.
Aktuelle Kernel in Raspberry Stretch haben diesen Bug hier, der den SPI-Bus betrifft:
https://www.raspberrypi.org/forums/viewtopic.php?t=191540
Die Maximalfrequenz des Busses wird per Default im Kernelmodul zu hoch gesetzt.
Durch das Hinzufügen von self.spi.max_speed_hz in MCP3008.py
habe ich es gefixed und es lief auf Anhieb.
def open(self):
self.spi.open(self.bus, self.device)
self.spi.max_speed_hz = 125000
OK, das war ein hartes Rätsel, aber ich habe ne Menge gelernt 🙂
Hatte das gleiche Problem wie Dan. Durch das hinzufügen der Zeile wie oben beschrieben funktioniert es auf Anhieb.
Funktioniert das Tutorial auch mit einem Raspberry Pi B3+ ?