Ich bin gerade an einer Pulsmessung am basteln mit diesem Sensor.
Hier der Code:
/* 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?
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.
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.
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.
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.
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.
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.
ppmk2:
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:
#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)?
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.
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
gregorss:
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.
Das int Ganzzahlen sind hab ich nun verstanden, aber könnte mach das nicht ändern.
Leider verstehe ich das alles nur bedingt.
postmaster-ino:
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.
postmaster-ino:
... 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.
Der Code ist ja nicht von mir, hab den nur zusammen kopiert und iwie zu laufen gebracht.
Das schöne ist ja: Man kann alles ändern, denn es liegt ja im Quellcode vor.
Das schlechte: Man muss das auch tun, wenn es kein anderer für einen macht.
Da kommst du ins Spiel!
Denn das ist eine schöne Gelegenheit, um mal zu lernen, was da überhaupt passiert.
Und auch eine Gelegenheit, es besser zu machen, als der Vorreiter.
Naja - aus der Zeit zwischen den Schlägen lässt sich wunderbar eine Kommazahl berechnen - einzige Ausnahme: Die Rechnung geht ohne Rest auf - dann eben ohne Kommastellen.
irgendwo war ich einem Link o.Ä. gefolgt und las, daß die ms zwischen den Schlägen zurück gegeben wurden.
Das wirst Du nun finden müssen, Du solltest die Lib auch besser zerlegen können, als ich, Der Diese noch nicht Mal auf dem Rechner hat (und wohl dort auch nicht braucht).
Der Rest ist 'Kinderkacke' - 60000 (Millisekunden pro Minute) / 837 (Millisekunden zwischen den Schlägen) macht 71,68458781362007168459 Schläge die Minute (wobei ich befürchte, daß der Taschenrechner hier die letzte Stelle gerundet hat ...)
Zur aller aller größten Not teilt man den Kram, wie in der Grundschule - also schriftlich!
Da kann man dann so viele Nachkommastellen auf's Display bringen, daß selbst PI neidisch drein schaut - also wenn man nicht 'Komma-Null' Puls hat - dann gewinnt halt PI
Ist ja sehr unwahrscheinlich das man genau 72 Schläge pro Minute hat, sondern eher 71,67 oder 72,36.
Falsch.
Zwischen 71 und 73 ist kein Unterschied. Ob du das Messergebnis 71, 72 oder 73 nennst, bleibt dir überlassen. "Handgestoppte" Pulsfrequenzen werden 15 sec lang gezählt, und ergeben dann Zahlen wie 68, 72, 76 wobei es eher Zufall ist, ob ein Puls am Anfang und am Ende gerade noch mitgezählt wird und also eine Streubreite von 4 (oder gar bis 8 ) noch nicht wirklich signifikant ist.
Auch medizinische BPM-Geräte mitteln über mehrere Pulsschläge, damit nicht mehr Gezappel angezeigt wird als vorhanden ist.
Du kannst natürlich die Zeit zwischen zwei Pulsschlägen in Millisekunden messen, das ergibt Zahlen mit 3 "signifikanten" Stellen, aus denen du auch einen Kehrwert mit drei Stellen bilden kannst.
Aber ob das deinen Pokerbluff-Analysator verbessert, wage ich zu bezweifeln.