Hallo liebe Techniker
Ich sitze seit einigen Tagen an einem Freizeitprojekt und weis nicht wie ich voran kommen soll. Ich möchte an einem I2C oled display eine Pulsmessung mithilfe von einem Pulssensor und dem arduino nano anzeigen. Das Problem ist allerdings das die Werte nicht realistisch sind und die Pulskurve nicht ganz stimmt.
Ich hoffe ihr könnt mir weiterhelfen.
Hello my fellow technicians
I am trying to complete a project of mine. I want to measure the pulse and show it on my I2C Oled display. The display is connected to a arduino nano and a pulsesensor. I want to see the curve of the pulse. The BPM is also unrealistic.
I hope you can help me.
MfG. TechnikLars
#include <Adafruit_SSD1306.h>
#include <gfxfont.h>
#include <Adafruit_GFX.h>
#define OLED_Address 0x3C
Adafruit_SSD1306 oled(1);
int x=0;
int lastx=0;
int lasty=0;
int LastTime=0;
bool BPMTiming=false;
bool BeatComplete=false;
int BPM=0;
#define UpperThreshold 550 // obere Schwelle
#define LowerThreshold 500 // untere Schwelle
void setup() {
oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);
oled.clearDisplay(); // Display wird gecleart
oled.setTextSize(2); // Textgröße
}
void loop()
{
if(x>127) // wenn Wert vom Sensor größer als 127 dann:
{
oled.clearDisplay(); // Display wird gecleart
x=0; // Der Wert vom Sensor wird null gesetzt
lastx=x; //
}
int value=analogRead(A0);
oled.setTextColor(WHITE);
int y=60-(value/16);
oled.writeLine(lastx,lasty,x,y,WHITE);
lasty=y;
lastx=x;
// calc bpm
if(value>UpperThreshold)
{
if(BeatComplete)
{
BPM=millis()-LastTime;
BPM=int(60/(float(BPM)/1000));
BPMTiming=false;
BeatComplete=false;
}
if(BPMTiming==false)
{
LastTime=millis();
BPMTiming=true;
}
}
if((value<LowerThreshold)&(BPMTiming))
BeatComplete=true;
// display bpm
oled.writeFillRect(0,0,128,16,BLACK);
oled.setCursor(0,0);
oled.print(BPM);
oled.print(" BPM");
oled.display();
x++;
}
Hier ist der deutschsprachige Forumsteil, Du brauchst keine englische Übersetzung.
Setze Deinen Sketch bitte in Codetags (</> oben links im Forumseditor), damit er für alle sinnvoll lesbar ist.
Gib zur Kontrolle zusätzlich die Werte mal auf dem Seriellen Monitor aus, da siehst Du ob sie ok sind. Damit wäre dann die OLED-Ansteuerung das Problem, sonst der Sensor.
Ein Link zum Sensor und den verwendeten Libs wäre auch nicht schädlich.
Ich würde erst mal den ganzen OLED-Kram rauswerfen und mich auf die Erfassung des Pulses konzentrieren.
Das geht hervorragend, in dem man zwischenergebnisse mit Serial.print() auf den Seriellen Monitor ausgibt.
So kann man erkennen, was der Arduino eigentlich treibt.
Dann erst, wenn das funktioniert, die grafische Ausgabe angehen.
Mit einer wirklich EKG-ähnlichen Kurve sind einfache Sensoren wohl überfordert, fürchte ich ...
( ... kalibrieren ... )
Daraus dann die BPM zu ermitteln, überfordert eventuell deinen Sketch.
Allerdings ist die Pulsfrequenz jetzt nicht soo superschnell, sollte man mit SerialPlot oder deinem OLED schon Daten zum Auswerten bekommen, ohne dass man alle Werte als Zahlen aufgelistet mitschreibten muss.
das ist jetzt ein bisschen eng beisammen, fürchte ich.
Auch glaube ich, dass du zu oft die BPM ZahlenAnzeige machst ( jedesmal mit x++; )
... aber da kann ich mich auch verguckt haben ...
Ich würde erstmal 2 Modi nehmen: entweder Kurve, oder Auswertung
Und das Timing von loop-Zyklus und Anzeige der Kurve überprüfen, bzw. den Zyklus und das analogRead verzögern.
Bei einem Puls zwischen 60 und 180 und ca. 100 pixeln in x - Richtung) sollte eine Messung nur alle 100(200) ms drankommen, dann siehst du in einer Kurve 10(5) ... 30(15) Beats.
Wenn die Schrott sind, an der Messtechnik feilen, sonst an der Auswertung
Ein Pulssensor gibt kein EKG Signal aus.
Außerdem ist das vermeintliche EKG-Signals ein Potentialverlauf auf verschiedenen genau definierten Punkten auf der Körperoberfläche.