Pulssensor Arduino, Störungen?
Hi, ich habe gerade ein Projekt, bei der ich ein Herz nach meinem Puls blinken lassen will. Um den Sensor zu testen benutze ich einen online gestellten Code, welcher weiter unten zu finden ist. Grundsätlich funktioniert auch alles, der Puls wird angenommen und die LED blinkt in meiner Herzfrequenz, allerdings wenn mein Finger nicht drauf ist, gibt es solche Störungen, dass die Leds nur dumm flackern. Bilder vom richtigen Signal und Störungen sind beide im Anhang. Wie kann ich das am besten raus filterm, dass nix leuchtet, wenn kein finger drauf ist, aber es nach der herzfrequenz leuchtet wenn mein finger drauf ist. Klar würde es klappen wenn ich einen anderen knopf habe, welchen ich drücken muss, wenn mein finger drauf ist, dass die leds dann erst angehen und ich das flacken wie ausschalte, aber ich will das ohne knopf haben. Hat wer Vorschläge, oder besser, vielleicht eine fertigen Code? Danke im Voraus für Antworten :)
Störungen:
Puls:
Code:
// Konstanten und Variablen definieren
const int pulsePin = A0; // Pin, an den der Puls-Sensor angeschlossen ist
const int ledPin = 13; // Eingebaute LED-Pin des Arduino
const int threshold = 515; // Schwellenwert für den Pulswert
const int stabilityThreshold = 50; // Schwellenwert für die Stabilität des Pulswertes
int pulseValue = 0; // Variable zur Speicherung des Pulswertes
int previousPulseValue = 0; // Variable zur Speicherung des vorherigen Pulswertes
void setup() {
pinMode(ledPin, OUTPUT); // LED-Pin als Ausgang definieren
Serial.begin(9600); // Serielle Kommunikation starten
}
void loop() {
pulseValue = analogRead(pulsePin); // Pulswert vom Sensor lesen
Serial.println(pulseValue); // Pulswert an den seriellen Monitor senden
// Überprüfen, ob der Pulswert stabil ist
if (abs(pulseValue - previousPulseValue) < stabilityThreshold) {
// LED ein- oder ausschalten basierend auf dem Schwellenwert
if (pulseValue > threshold) {
digitalWrite(ledPin, HIGH); // LED einschalten
} else {
digitalWrite(ledPin, LOW); // LED ausschalten
}
} else {
// Wenn der Pulswert nicht stabil ist, LED ausschalten
digitalWrite(ledPin, LOW);
}
previousPulseValue = pulseValue; // Aktuellen Pulswert speichern
delay(50); // Kurze Verzögerung für stabilere Werte
}
Was ist das genau für ein Sensor?
ein pulssensor von technoiot
2 Antworten
Ein paar Ideen, die eventuell helfen:
Vielleicht könnte ein Tiefpassfilter dabei helfen. In eher Pseudocode, kannst ihn so umsetzen:
alpha = 0.1
wert = alpha * aktuellGelesenerWert + (1-alpha) * vorherigerWert
vorherigerWert = wert
Da dein Puls auch nur ein kurzer Ausschlag ist, könnte es vielleicht kontraproduktiv sein. threshold wirst du anpassen müssen, da die Ausschläge nicht mehr so hoch sind.
Die Variante könnte auch besser sein, wenn du die Wartezeit verkürzt. Durch die kürzere Zeit sollte das Rauschen größer werden, welches per Tiefpassfilter reduziert wird. Die Werte mit Finger könnten daher besser herausstechen.
Ein anderer Ansatz wäre, eine minimale Zeit zwischen den Ausschlägen. Ohne Finger gibt es sehr häufige Ausschläge, die auch häufig über dem Schwellwert sind. Ein Teil sollte vermutlich schon vom stabilityThreshold gefilter werden.
So könntest du dir Zeit merken, wann der Wert über den threshold ist. Wenn du die LED anschalten würdest, schaust du, ob der alte Zeit mindestens z.B. 0,4 Sekunden her ist. Damit limitierst du deinen maximalen Puls, aber solltest bessere Ergebnisse bekommen.
Das wäre meine Ansätze, die ich u.A. aus der Signalverarbeitung mitgenommen habe. Du wirst aber noch etwas experimentieren müssen und z.B. Parameter ausprobieren. Eventuell helfen auch beide Varianten zusammen.
Einen zusätzlichen sensor um zu erkennen ob der finger drauf ist. Z.B. ein druckknopf. Der pulsensor scheint das nicht zu erkennen.
Das geht nicht. Das signal wenn kein finger drauf liegt, ist ja kaum von dem mit finger zu unterscheiden.
Höchstens wenn du irgendeinen komplexen algorithmus hast dass herzschläge erkennt, aber dafür wird die rechenleistung von einem arduino nicht reichen.
hi nochmal, ich hab es geschafft. Ich hab mir aus dem Signal des Sesnor einen BPM rechnen lassen und mache damit ein abfrage. wenn kein finger drauf ist, ist der bpm logischweise extrem hoch und so kann ich ihn leicht filtern. es funktioniert einwandfrei
Aber was heißt unrealistisch hoch? Beim sport kannste schon 150 bpm haben, teilweise bis 200.
werte von 15000 bis 30000, es klappt zwar aber der puls wird nicht immer perfekt angezeig
ja, genau das würde ich gern vermeiden, ich würde es gerne software technisch mithilfe eines tief passes lösen anstatt hardware technisch noch ein bauteil zu verweden, es soll nur den sensor und leds beinhalten