Pulsmesser

  • Hallo Leute,

    ich habe ein Problem mit meinem Pulsmesser vom Raspi.

    Er gibt nähmlich schon Werte aus, obwohl ich keinen Finger am Sensor habe.
    Außerdem sind die Werte sehr unrealistisch z.B. BPM 213, BPM 170, usw.

    Hier ist der Link von Github wovon wir die Dateien haben:
    https://github.com/tutRPi/Raspber…/pulsesensor.py

    Ich würde mich freuen, wenn ihr mir helfen könntet.

    MfG

    Kenns

    Hier ist die Beispiel Datei:
    from pulsesensor import Pulsesensor

    import time


    p = Pulsesensor()

    p.startAsyncBPM()


    try:

    while True:

    bpm = p.BPM

    if bpm > 0:

    print("BPM: %d" % bpm)

    else:

    print("No Heartbeat found")

    time.sleep(1)

    except:

    p.stopAsyncBPM()


    und hier die Datei vom Pulssensor:

    # extended from https://github.com/WorldFamousEle…r_Amped_Arduino


    import time

    import threading

    from MCP3008 import MCP3008


    class Pulsesensor:

    def __init__(self, channel = 0, bus = 0, device = 0):

    self.channel = channel

    self.BPM = 0

    self.adc = MCP3008(bus, device)


    def getBPMLoop(self):

    # init variables

    rate = [0] * 10 # array to hold last 10 IBI values

    sampleCounter = 0 # used to determine pulse timing

    lastBeatTime = 0 # used to find IBI

    P = 512 # used to find peak in pulse wave, seeded

    T = 512 # used to find trough in pulse wave, seeded

    thresh = 525 # used to find instant moment of heart beat, seeded

    amp = 100 # used to hold amplitude of pulse waveform, seeded

    firstBeat = True # used to seed rate array so we startup with reasonable BPM

    secondBeat = False # used to seed rate array so we startup with reasonable BPM


    IBI = 600 # int that holds the time interval between beats! Must be seeded!

    Pulse = False # "True" when User's live heartbeat is detected. "False" when not a "live beat".

    lastTime = int(time.time()*1000)


    while not self.thread.stopped:

    Signal = self.adc.read(self.channel)

    currentTime = int(time.time()*1000)


    sampleCounter += currentTime - lastTime

    lastTime = currentTime


    N = sampleCounter - lastBeatTime


    # find the peak and trough of the pulse wave

    if Signal < thresh and N > (IBI/5.0)*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 and Signal > P:

    P = Signal


    # signal surges up in value every time there is a pulse

    if N > 250: # avoid high frequency noise

    if Signal > thresh and Pulse == False and N > (IBI/5.0)*3:

    Pulse = True # set the Pulse flag when we think there is a pulse

    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 i in range(len(rate)): # 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

    continue


    # keep a running total of the last 10 IBI values

    rate[:-1] = rate[1:] # shift data in the rate array

    rate[-1] = IBI # add the latest IBI to the rate array

    runningTotal = sum(rate) # add upp oldest IBI values


    runningTotal /= len(rate) # average the IBI values

    self.BPM = 60000/runningTotal # how many beats can fit into a minute? that's BPM!


    if Signal < thresh and 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

    self.BPM = 0


    time.sleep(0.005)


    # Start getBPMLoop routine which saves the BPM in its variable

    def startAsyncBPM(self):

    self.thread = threading.Thread(target=self.getBPMLoop)

    self.thread.stopped = False

    self.thread.start()

    return


    # Stop the routine

    def stopAsyncBPM(self):

    self.thread.stopped = True

    self.BPM = 0

    return

  • FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten


    Aber wieso postest du die Dateien hier erneut obwohl es anscheint exakt den selben Inhalt wie auf github zu haben scheint? :-/

    Nichts desto trotz sagt das nichts über den von Dir verwendeten Sensor aus oder wie du den angeschlossen hast. Der Code steuert nur einen MCP3008 Chip an also einen "Analog to Digital Converter"

  • Zitat von meigrafd


    Aber wieso postest du die Dateien hier erneut obwohl es anscheint exakt den selben Inhalt wie auf github zu haben scheint? :-/

    Vorallem, warum nutzt ihr nicht den für Code vorgesehenen Tag/Schaltfläche?

    Phyton arbeitet mit Einrückungen, die beim einfachen Textposting verloren gehen.

    forum-raspberrypi.de/attachment/12828/

  • Sorry Leute, das ich es nicht übersichtlicher gemacht habe.

    Wir haben uns sowieso einen neuen Pulssensor gekauft, da wahrscheinlich der Fehler am Sensor liegt.

    Trotzdem, vielen Dank für eure Antworten.

  • Hallo Leute,

    trotz des neuen Pulssensors, gibt er immer noch falsche Werte aus. Auch wenn der Finger nicht drauf ist.

    Könntet ihr mir biite helfen, denn ich bin so langsam am verzweifeln.

    :s :wallbash:

  • Hallo Kenns,

    herzlich Willkommen in unserem Forum!


    Wie kannst Du Hilfe erwarten, wenn niemand hier wissen kann, welchen Sensor Du wie wo mit was verbunden hast?

    Meinst Du diesen Heart-Beat-Sensor, wie er mal im 37-Sensor-Kit oder 40-Sensor-Kit verkauft wurde? Wenn ja, dann suche mal nach entsprechenden Beiträgen (Arduino-Forum, µController-Foren, ...). Dieser Sensor bedarf einer gewissen Bedienung und Programmierung, bevor er was halbwegs Vernünftiges von sich gibt.

    Wenn Du etwas anderes meinst, dann solltest Du einen Link auf eine Bezugsquelle (inkl. Hersteller-Angabe, Modellbezeichnung des Sensors, Datennblatt) posten, damit überhaupt jemand sich des Materials annimmt, um Dir eine Hilfe zu ermöglichen.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Kenns,

    vielen Dank für die Rückmeldung. Demnach ist der von Dir verwendete Sensor der gleiche wi im Tutorial - und nicht der aus dem xx-Sensor-Kit (China-Gimmicks).


    Dann installiere Dir bitte das Programm Fritzing auf Deinem Raspberry Pi oder PC.

    Auf einem Linux-Betriebssystem geht das so:

    Code
    sudo apt-get install fritzing


    Fritzing ist eine Anwendung, mit der Du elektronische Schaltungen zeichnen und hier wieder hochladen kannst. Bitte verwende nicht die Schaltung aus dem verlinkten Thread - denn die Schaltung kennen wir jetzt ja.

    Es geht darum, DEINE Schaltung zu sehen und ggf. Fehler darauf erkennen zu kennen. Gehe Bauteil für Bauteil und Strippe für Strippe durch und zeichne genau auf, was womit verbunden ist. Vielleicht findest Du den Fehler dann selber.

    Wenn ich mal Schaltungen aufbaue und die nicht auf Anhieb funktionieren, dann fehlt ... ähem ... hust ... meistens eine gemeinsame Masse. Letztens war alles richtig, es fehlte nur die Verbindung von DOUT eines Sensors in den Raspberry Pi. Sowas stellst Du fest, wenn Du DEINE Schaltung nach Fritzing überträgst und das Ergebnis mit der Tutorien-Vorlage vergleichst.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!