Heartbeat Sensor

Ich benutzte den KY-039 Herzschlagsensor und habe bereits den vorliegenden Code geschrieben.
Nun möchte ich aber die Werte, die ich vom Sensor bekomme, benutzten um eine LED im Herztakt blinken zu lassen. Ich weiß aber nicht genau, wie ich das anstellen soll.
Habt ihr Tipps?
Danke schonmal :slight_smile:

#define IRPIN 11
#define LIFELED 13

int inp_pin = A0;

bool heartbeat;

void setup() {
 // put your setup code here, to run once:
 pinMode(IRPIN, OUTPUT);
 digitalWrite(IRPIN, LOW);
 pinMode(LIFELED, OUTPUT);
 digitalWrite(LIFELED, LOW);
 heartbeat = false;
 Serial.begin(57600);
}

void loop() {
 // put your main code here, to run repeatedly:
 if(heartbeat) {
   digitalWrite(IRPIN, HIGH);
   digitalWrite(LIFELED, HIGH);
 } else {
   digitalWrite(IRPIN, HIGH);
   digitalWrite(LIFELED, LOW);
 }
 int value = analogRead(inp_pin);
 Serial.println(value);

 delay(500);
 heartbeat = !heartbeat;
}

Anni, da bist Du ja wieder :o

Bitte hänge Code nicht als Bild an. Auch Dein Rechenknecht wird copy/paste können und wenn Du den Code noch zwischen die Code-Tags - das ist das Symbos </> bringst haben alle Freude beim Helfen.

Und bei Deinem letzten Projekt bist Du uns auch noch Antwort schuldig. Sonst macht nämlich helfen auch keinen Spaß.

anni14899:
Ich benutzte den KY-039 Herzschlagsensor und habe bereits den vorliegenden Code geschrieben.
Nun möchte ich aber die Werte, die ich vom Sensor bekomme, benutzten um eine LED im Herztakt blinken zu lassen. Ich weiß aber nicht genau, wie ich das anstellen soll.
Habt ihr Tipps?

Wenn Du den Code nicht als BILD gemalt hast, dann poste hier Code NICHT ALS BILD!

Wenn Du den Code in einem Editor geschrieben hast, markiere und kopiere den geschriebenen Code im Editor und füge ihn hier ALS TEXT in einem Forumsbeitrag ein, und zwar zwischen Code-Tags.

Hast Du eigentlich "How to use this forum" gelesen?

Lies bitte mal hier unter Punkt 7.:

oh tut mir leid, kann ich das denn noch ändern oder soll ich einen neuen post aufmachen ?

Du kannst editieren. Schau mal rechts unten bei Deinen Posts.

ok danke, ich habs jetzt geändert :slight_smile:

anni14899:
ok danke, ich habs jetzt geändert :slight_smile:

OK, SO wie der geänderte Beitrag jetzt aussieht, kann ich tatsächlich Code sehen. DAS IST BESSER!

Mein Tipp:

Sample alle zehn oder zwanzig Millisekunden regelmäßig einen Wert von Deinem Sensor:
int value = analogRead(inp_pin);

Da es um Herzschlag geht, dürften die Werte wohl mit dem Herzschlag regelmäßig steigen und fallen, oder?

Der einfachste Algorithmus, der mir zum Schalten einer Herzschlag-LED einfällt, wäre das:

  • immer wenn der Messwert in den letzten 10 oder 20 Millisekunden gestiegen ist ==> LED einschalten
  • ansonsten LED ausschalten

Hast Du schon mal eine loop() Funktion probiert, um Dir einfach mal die Messwerte alle 20 Millisekunden anzeigen zu lassen?

Vielleicht sowas ähnliches wie

void loop() 
{
  int value= analogRead(inp_pin);
  Serial.println(value);
  delay(20);
}

Was bekommst Du damit auf dem seriellen Monitor angezeigt,? Poste mal ein paar Zeilen Beispielausgabe!

Der Sensor misst die "Durchleuchtung" eines Fingers.
Der jeweilige Messwert ist vom mittleren Blutdruck und Zustand des Herzschlags abhängig (Pumpt, pumpt nicht)
Das müsste dann bei Scheifenmessungen (wie jurs beschrieben hat) so etwas wie eine nicht-lineare Welle ergeben.

Um den "Puls" anzuzeigen müsstet du fortlaufend Mittelwerte etwas vor und nach dem regelmäßigem Maximum ermitteln (Leuchtdauer) und diese in einen boolschen Wert umsetzen.
Z.b. bei 70% vor dem mittlerem Max.Wert Puls = true und wenn nach max. Mittelwert wieder bei 70% Puls = false.

Den kann man dann wie oben schon richtig im Ansatz gemacht anzeigen.

Schreibe doch einen Schmitt-Trigger Algorithmus. Meinetwegen bei alles über 600 an und bei alles unter 400 aus. So wird der "wacklige Bereich" zwischen an und aus sicher durchlaufen

.... ist das, was ich sagte/meinte.
Ein Analog-Eingang wandelt mit 10-Bit, also 0-1023 -> der/ein zu verwendender Wert !.
Und das zwischen anliegender Spannung von 0-5V.

Zur Erinnerung:
Hier wir mittels einer (High-Power) LED der optische Widerstand im Infrarot-Bereich zu einem lichtempfindlichen Photo-Transistor mit in der Regel jeweils gleicher Wellenlänge durch eine Fingerkuppe gemessen.

Je höher der Blutfluss / die Blutmenge ändert sich der optische Widerstand je nach Empfängerbauteil und dessen Beschaltung und Versorgungsspannung (i. d. R.) MAXIMAL ( !!! ) zwischen 0 und 5V oder umgekehrt.
Sofern in dem Modul ein Vorwiderstand als Spannungsteiler vorhanden/zuschaltbar ist, muss dessen Wert zwingend berücksichtigt werden.

Hier kommt schon wieder keine Rückmeldung mehr, wie beim ersten Problem. Hab keine Lust mehr.

Klaus_ww:
Hier kommt schon wieder keine Rückmeldung mehr, wie beim ersten Problem. Hab keine Lust mehr.

Ein bißchen Zeit mußt Du ihr schon lassen.
Grüße Uwe

960
960
961
958
958
957
958
957
957
956
957
957
956
956
956
957
957
957
961
968
968
968
968
968
968
970

Das bekomme ich auf dem seriellen Monitor angezeigt, ich weiß aber nicht, wie ich diese Werte deuten soll.
Irgendwie ist dort ja kein Schema, wie bei einem Herzschlag.
Ist mein Sensor vielleicht kaputt?

Vielen Danke für eure Tipps.

Liebe Grüße Anni

anni14899:
Das bekomme ich auf dem seriellen Monitor angezeigt, ich weiß aber nicht, wie ich diese Werte deuten soll.
Irgendwie ist dort ja kein Schema, wie bei einem Herzschlag.

Nein?

Ich sehe in der Zahlenreihe steigende und fallende Werte.
Das ist ein "schwaches Signal"

Und diese Werte steigen und fallen bei Dir NICHT im Rhythmus des Herzschlags?

Sondern sie folgen "keinem Schema?

Hast Du vielleicht diesen Sensor und hast Du die LED so ausgerichtet, dass sie direkt von der LED auf die Fotodiode leuchtet, so dass Du Deinen Finger dazwischenlegen kannst, und die LED leuchtet durch den Fingernagel, durch den Finger, und am Ende kommt das Licht an der Fotodiode an?

Sind Deine Fingernägel lackiert, wenn Du das Signal testest?

Lackierte Fingernägel können das Signal abschwächen.

Aber in Deiner Zahlenreihe sehe ich durchaus ein "Signal", also dass sich an den Messwerten etwas ändert. Aber um aus einem sich so schwach ändernden Signal etwas herauszulesen, z.B. eine Herzschlagfrequenz, muß Dein Sketch sicher schon einiges an Signalverarbeitung ausführen.

Aber solange sich das Signal bei Dir NICHT rhythmisch mit dem Herzschlag ändert, sondern mehr einem Rauschsignal mit stochastisch-zufälligen Änderungen folgt, brauchst Du Dir überhaupt keine Gedanken machen, ob Du damit eine LED im Herzschlagrhythmus schalten kannst.

Darüber brauchst Du erst dann ndachdenken, wenn Du vom Sensor ein sich mit dem Herzschlag rhythmisch änderndes Signal bekommst.

Aus einem Zufallsrauschen von Werten kannst Du keinen Herzschlag erkennen.

Vielleicht mal den Nagellack entfernen, wenn welcher drauf ist, und auf die korrekte Ausrichtung von LED und Fotodiode achten!

Siehe rote Linie im gezeigten Bild: Die Mittelachse der LED direkt auf die Fotodiode ausgerichtet, und den Finger dazwischen platzieren.

Der von mir oben gepostete Beispielcode macht alle 20 Millisekunden ein Sample, also 50 Werte pro Sekunde. Bei einer Herzfrequenz von 60 BPM (beats per minute) sollten die Werte also circa alle 50 Zeilen ungefähr wiederholen (50 Werte mal 20ms Pause zwischen den Werten = 1s).

Das Signal hat ca folgende Form: http://www.doctorshop.it/Prodotti/Saturimetro-SAT-500-per-monitoraggio-continuo-con-allarmi-e-connessione-USB-1900019 De kleinere Höcker kann fehlen.

Das Signal ist ziemlich klein und die Probleme sind wie schon gesagt Nagellack, aber auch schwach durchblutete Hände (kalte Hände). Auch Umgebungslicht kann Probleme machen.
Grüße Uwe

Ok danke euch,
lackierte Fingernägel habe ich nicht, vielleicht liegt es wirklich am Umgebungslicht.
Ich werde mal weiter daran rumprobieren.

Trotzdem vielen Dank an euch. :slight_smile:

hi,

ist doch ganz einfach, leute:

weiblich, 14. 8. 1999 geboren, das ist die twilight generation. da gibt's keinen puls zum messen.

und auch die vermutungen von uwe passen hundertprozentig: schwarzer, undurchlässiger nagellack, kalte hände und natürlich generell probleme mit dem umgebungslicht...

gruß stefan

:smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:

Na, na, Eisebär.
Bist du neidisch, weil bei dir zwar evtl. Puls zu messen wäre, das aber keinen mehr wirklich interessiert ausser einem Kardiologen?

Das Problem ist eher: will man den Puls aus 20 .. 30 Werten erkennen, dann müssten die über mehrere Sekunden verteilt werden. Also delay(200) statt delay(20).
Oder man muss sich eben längere Zahlenreihen ansehen um zu erkennen, ob die Schwankungen (zwischen 956 und 970) irgendeinem Rhythmus folgen, oder eher Rauschen darstellen.

Aus Daten über 600 ms kann man jedenfalls nicht so einfach die Pulsfrequenz ablesen.

hi,

Bist du neidisch, weil bei dir zwar evtl. Puls zu messen wäre, das aber keinen mehr wirklich interessiert ausser einem Kardiologen?

was soll das eventuell heißen? DA IST EIN PULS!!! vielleicht nicht mehr lange, aber noch isser da...

so, nu mal ernsthaft: die auflistung der werte oben wäre aussagekräftiger, wenn man das delay kennen würde und bei kurzem delay mehr werte hätte. wenn die unterschiede nicht größer sind, wird die auswertung sauschwer. eine kleine veränderung der position oder der haltung des fingers wird wahrscheinlich mehr unterschied ergeben. da ist ja nichts fixiert wie bei den "klemmen" beim onkel doktor im spital.

es gibt da beispielcode, der vielleicht ein ein wenig aussagekräftigere ergebnisse liefert:

https://tkkrlab.nl/wiki/Arduino_KY-039_Detect_the_heartbeat_module

gruß stefan

EDIT: miß doch mal 20 sekunden damit und häng das ergebnis in einer textdatei hier rein. eventuell das delay auf 75 oder 50 ändern...