Go Down

Topic: Pulsmessung mit Nachkommerzahlen  (Read 219 times) previous topic - next topic

ppmk2

Hallo an Alle

Ich bin gerade an einer Pulsmessung am basteln mit diesem Sensor.
http://embedded-lab.com/blog/easy-pulse-version-1-1-sensor-overview-part-1/


Hier der Code:
Code: [Select]

/*  Getting_BPM_to_Monitor prints the BPM to the Serial Monitor, using the least lines of code and PulseSensor Library.
    Tutorial Webpage: https://pulsesensor.com/pages/getting-advanced

  --------Use This Sketch To------------------------------------------
  1) Displays user's live and changing BPM, Beats Per Minute, in Arduino's native Serial Monitor.
  2) Print: "♥  A HeartBeat Happened !" when a beat is detected, live.
  2) Learn about using a PulseSensor Library "Object".
  4) Blinks LED on PIN 13 with user's Heartbeat.
  --------------------------------------------------------------------*/

#define USE_ARDUINO_INTERRUPTS true    // Set-up low-level interrupts for most acurate BPM math.
#include <PulseSensorPlayground.h>     // Includes the PulseSensorPlayground Library.   

//DISPLAY
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);
int i = 1;

//  Variables
const int PulseWire = 0;       // PulseSensor PURPLE WIRE connected to ANALOG PIN 0
const int LED13 = 13;          // The on-board Arduino LED, close to PIN 13.
int Threshold = 550;           // Determine which Signal to "count as a beat" and which to ignore.
// Use the "Gettting Started Project" to fine-tune Threshold Value beyond default setting.
// Otherwise leave the default "550" value.

PulseSensorPlayground pulseSensor;  // Creates an instance of the PulseSensorPlayground object called "pulseSensor"


void setup() {

  Serial.begin(9600);          // For Serial Monitor

  // initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  // Configure the PulseSensor object, by assigning our variables to it.
  pulseSensor.analogInput(PulseWire);
  pulseSensor.blinkOnPulse(LED13);       //auto-magically blink Arduino's LED with heartbeat.
  pulseSensor.setThreshold(Threshold);

  // Double-check the "pulseSensor" object was created and "began" seeing a signal.
  if (pulseSensor.begin()) {
    Serial.println("We created a pulseSensor Object !");  //This prints one time at Arduino power-up,  or on Arduino reset.
  }
  display.clearDisplay();
}



void loop() {

  int myBPM = pulseSensor.getBeatsPerMinute();  // Calls function on our pulseSensor object that returns BPM as an "int".
  // "myBPM" hold this BPM value now.

  if (pulseSensor.sawStartOfBeat()) {            // Constantly test to see if "a beat happened".
    Serial.println("♥  A HeartBeat Happened ! "); // If test is "true", print a message "a heartbeat happened".
    Serial.print("BPM: ");                        // Print phrase "BPM: "
    Serial.println(myBPM);                        // Print the value inside of myBPM.



    //anzeigen(myBPM);
    display.clearDisplay();
  // set text color / Textfarbe setzen
  display.setTextColor(WHITE);
  // set text size / Textgroesse setzen
  display.setTextSize(5);
  // set text cursor position / Textstartposition einstellen
  display.setCursor(25,0);
  // show text / Text anzeigen
  display.println(myBPM);
  display.display();




  }

  delay(20);                    // considered best practice in a simple sketch.

}


void anzeigen() {
  display.clearDisplay();
 
  // set text color / Textfarbe setzen
  display.setTextColor(WHITE);
  // set text size / Textgroesse setzen
  display.setTextSize(5);
  // set text cursor position / Textstartposition einstellen
  display.setCursor(50,0);
  // show text / Text anzeigen
  display.println(i);


  display.display();
  //delay(1000);

  i++;
}


Ich würde gerne den Puls genauer, mit zwei Stellen hinter dem Komma auf dem Display anzeigen lassen.
Hat einer eine Lösung für mich?

Vielen Dank schon mal.  :-)

Grüße
Petra


Tommy56

Hast Du 3,27 Puls pro Minute? ;) Oder anders gefragt: Welchen Nutzen sollen die Nachkommastellen bringen?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

Oder anders gefragt, was gibt der Sensor denn als int raus ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

Hi

Hier
int myBPM = pulseSensor.getBeatsPerMinute();
bekommst Du von der Lib (Link?) die Schläge pro Minute.
Genau Dort wirst Du schauen müssen, ob Du Da was anpassen kannst.
... davon ab - warum INT?
Erwartest Du Negativ-BPMs?
Wobei - auch egal, Du wirst wohl kaum über 32000 Herzschläge die Minute kommen.

Wenn Du die Methode angeschaut hast, könntest Du Dir den 100-fachen Wert zurück geben lassen (wenn Du nun Werte >320 erwartest, wäre es an der Zeit ein UNSIGNED INT zubenutzen, Das geht bis 65535, entspräche dann 655,35 BPM).

In der aufgerufenen Methode wird wohl simpel berechnet, wie viele BPM bei der aktuellen Zeit zwischen den Schlägen, zusammen kommen - hier in der Berechnung den Wert *100 sollte fast schon reichen.

Dann musst Du nur noch die Anzeige wieder zerstückeln - da 4312 eben 43,12 BPM entspräche.

MfG

Deltaflyer

Ich glaub, bei 320 bpm wäre eine Funktion, die sofort den Notarzt ruft, wesentlich wichtiger, als ne Funktion, die da noch versucht, irgendwelche Nachkommastllen zu ermitteln.

ppmk2



Danke für die Antworten.

Ich habe noch nicht so viele Erfahrungen mit Arduino und Programmierung gemacht, bitte nicht böse sein wenn ich mich dusselig anstellen sollte.
Ich habe in den Bibliotheken nichts gefunden wo ich was ändern könnte.
Würde mich über Hilfe sehr freuen.


HotSystems

Aber unsere Fragen könntest du schon beantworten, oder ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Katsumi_S

Die Lib aus der Arduino-IDE habe ich mal gefunden:  https://github.com/WorldFamousElectronics/PulseSensorPlayground

Habe auf die Schnelle nicht kapiert wo man das ändern könnte. Die Lib scheint die Millisekunden zu zählen.

Allerdings sind die Nachkommastellen nutzlos. Ein Herz ist kein Uhrwerk und schlägt nicht gleichmäßig. Außer vielleicht bei einem Herzschrittmacher...

Gruß, Jürgen

ppmk2

Natürlich sry, in der ersten Antwort hatte ich das auch. Dann einmal zurück geklickt und alles war weg :-(


Es geht um ein Spiel bei dem jeder ein Pulsmesser trägt.
Wer auf ein Ereignis reagiert bekommt Punkte. Oft sind es aber nur kleine Pulsänderungen.
Die versuche ich dann mit den Kommazahl zu ermitteln.

HotSystems

Nur wie dir schon (versucht) wurde zu erklären, ein Puls ist eine "ganze" Zahl, da gibt es keine Nachkommazahlen.
Zudem gibt der Sensor den Wert als Int aus, das ist eine ganze Zahl.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Katsumi_S

@ TO:

Hast Du schon mal versucht welcher Puls bei Dir angezeigt wird und wie stark der sich ändert, obwohl Du gerade nicht viel machst? Der zeigt ja immer Schläge pro Minute. Wenn der nächste Schlag nur um 0,017 Sekunden früher kommt, zeigt er einen Schlag pro Minute mehr an.

Gruß, Jürgen

gregorss

Dann einmal zurück geklickt und alles war weg :-(
Ja, das Leben, das Universum und dieses Forum können unfreundlich sein :-)

Ansonsten ist Dein Code schwer lesbar/unübersichtlich und enthält „seltsame" Sachen. Daher habe ich ausnahmsweise (is ja Weihnachten ...) mal darin herumgepfuscht, um ihn zumindest lesbarer zu machen. Sonderlich viel Code ist es schließlich nicht.

Ziemlich kurz so:

Code: [Select]
#define USE_ARDUINO_INTERRUPTS true // Set-up low-level interrupts for most
                                    //acurate BPM math.
#include <PulseSensorPlayground.h> // Includes the PulseSensorPlayground
                                   // Library.  

//DISPLAY
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(4); // nicht genutzt bei diesem Display

//  Variables
int i = 1;
const int PulseWire = 0; // PulseSensor PURPLE WIRE connected to ANALOG PIN 0
const int LED13 = 13;    // The on-board Arduino LED, close to PIN 13.
int Threshold = 550;     // Determine which Signal to "count as a beat"
                         // and which to ignore.
                         // Use the "Getting Started Project" to fine-tune
                         // Threshold Value beyond default setting.
                         // Otherwise leave the default "550" value.

PulseSensorPlayground pulseSensor;  // Creates an instance of the
                                    // PulseSensorPlayground object
                                    // called "pulseSensor"

void setup() {
  Serial.begin(9600);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Display initialisieren

  pulseSensor.analogInput(PulseWire);
  pulseSensor.blinkOnPulse(LED13); // blink Arduino's LED with heartbeat.
  pulseSensor.setThreshold(Threshold);

  // Double-check the "pulseSensor" object was created
  // and "began" seeing a signal.
  if (pulseSensor.begin()) {
    Serial.println("We created a pulseSensor Object !"); // This prints one time
                                                         // at Arduino power-
                                                         // up,  or on reset.
  }
  display.clearDisplay();
}

void loop() {
  int myBPM = pulseSensor.getBeatsPerMinute();

  if (pulseSensor.sawStartOfBeat()) {
    Serial.println("♥  A HeartBeat Happened ! ");
    Serial.print("BPM: ");
    Serial.println(myBPM);

    //anzeigen(myBPM);
    display.clearDisplay(); // Display loeschen
    display.setTextColor(WHITE); // Textfarbe setzen
    display.setTextSize(5); // Textgroesse setzen
    display.setCursor(25,0); // Textstartposition einstellen
    display.println(myBPM); // Text schreiben
    display.display(); // Display auffrischen/zeigen
  }
  delay(20); // considered best practice in a simple sketch. <---WASIS?!
}

void anzeigen() {
  display.clearDisplay(); // Display loeschen
  display.setTextColor(WHITE); // Textfarbe setzen
  display.setTextSize(5); // Textgroesse setzen
  display.setCursor(50,0); // Textstartposition einstellen
  display.println(i); // Text schreiben
  display.display(); // Display auffrischen/zeigen

  i++;
}


Da fällt auf jeden Fall sofort auf, dass Du die Funktion anzeigen() gar nicht benutzt, sondern die Ausgabe in loop() erledigst. Ach ja: Wozu wird die Variable i denn überhaupt benutzt (bzw. eben nicht)?

Gruß

Gregor
„Ich glaube, ich leg' mich noch mal hin", sagte das Bit.

postmaster-ino

Hi

Wird in anzeigen() zum Anzeigen der Nummer der Messung benutzt, wenn's denn benutzt wird - sonst halt nicht.

@TO
Wenn Es Dir primär um die Änderung in der Geschwindigkeit der Schläge geht - den Wert, wie weit die Schläge auseinander sind, liefert die Lib doch mit - genau Das, was Du suchst.
Nun musst Du 'nur noch' einen Algorithmus ausknobeln, damit - unabhängig vom Grund-Puls - diese Änderung erkannt und bewertet wird.

... also eine Art Lügen-Detektor, darf ich Mal annehmen.

MfG

uwefed

@ TO:

Hast Du schon mal versucht welcher Puls bei Dir angezeigt wird und wie stark der sich ändert, obwohl Du gerade nicht viel machst? Der zeigt ja immer Schläge pro Minute. Wenn der nächste Schlag nur um 0,017 Sekunden früher kommt, zeigt er einen Schlag pro Minute mehr an.

Gruß, Jürgen
So zu schauen hab ich geglaubt Du hättest Dich verrechnet. Mir schien die Zeitdifferenz viel zu wenig. Nachgerechnet, aber es braucht wirklich so wenig um zur nächsten Zahl zu kommen und das bei Ruhepuls von 50.
Grüße Uwe

ppmk2

Ansonsten ist Dein Code schwer lesbar/unübersichtlich und enthält „seltsame" Sachen.
Der Code ist ja nicht von mir, hab den nur zusammen kopiert und iwie zu laufen gebracht. :smiley-yell:

Das int Ganzzahlen sind hab ich nun verstanden, aber könnte mach das nicht ändern.

Leider verstehe ich das alles nur bedingt.


Wenn Es Dir primär um die Änderung in der Geschwindigkeit der Schläge geht - den Wert, wie weit die Schläge auseinander sind, liefert die Lib doch mit - genau Das, was Du suchst.
Nun musst Du 'nur noch' einen Algorithmus ausknobeln, damit - unabhängig vom Grund-Puls - diese Änderung erkannt und bewertet wird.
Kann ich leider nicht finden.


... also eine Art Lügen-Detektor, darf ich Mal annehmen.

Jein, es wird ja nichts gesagt. Zum Beispiel wenn man beim Pokern ein gutes Blatt bekommt passiert ja was beim Puls.

 
Hätte jetzt gedacht das iwo gerundet wird. Ist ja sehr unwahrscheinlich das man genau 72 Schläge pro Minute hat, sondern eher 71,67 oder 72,36.

Go Up