Sensore battito cardiaco timer

Buongiorno, vorrei realizzare un misuratore di battito cardiaco che mi dia i battiti al minuto, utilizzando il pulsesensor. Ho trovato questo sketch:

 #define SERIAL_PLOTTER  2

//  Variables
int pulsePin = 0;                 // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13;                // pin to blink led at each beat
int fadePin = 5;                  // pin to do fancy classy fading blink at each beat
int fadeRate = 0;                 // used to fade LED on with PWM on fadePin

// Volatile Variables, used in the interrupt service routine!
volatile int BPM;                   // int that holds raw Analog in 0. updated every 2mS
volatile int Signal;                // holds the incoming raw data
volatile int IBI = 600;             // int that holds the time interval between beats! Must be seeded!
volatile boolean Pulse = false;     // "True" when User's live heartbeat is detected. "False" when not a "live beat".
volatile boolean QS = false;        // becomes true when Arduoino finds a beat.

// SET THE SERIAL OUTPUT TYPE TO YOUR NEEDS
// PROCESSING_VISUALIZER works with Pulse Sensor Processing Visualizer
//      https://github.com/WorldFamousElectronics/PulseSensor_Amped_Processing_Visualizer
// SERIAL_PLOTTER outputs sensor data for viewing with the Arduino Serial Plotter
//      run the Serial Plotter at 115200 baud: Tools/Serial Plotter or Command+L
static int outputType = SERIAL_PLOTTER;


void setup(){
  pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!
  pinMode(fadePin,OUTPUT);          // pin that will fade to your heartbeat!
  Serial.begin(115200);             // we agree to talk fast!
  interruptSetup();                 // sets up to read Pulse Sensor signal every 2mS
   // IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE,
   // UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN
//   analogReference(EXTERNAL);
}


//  Where the Magic Happens
void loop(){

    serialOutput() ;

  if (QS == true){     // A Heartbeat Was Found
                       // BPM and IBI have been Determined
                       // Quantified Self "QS" true when arduino finds a heartbeat
        fadeRate = 255;         // Makes the LED Fade Effect Happen
                                // Set 'fadeRate' Variable to 255 to fade LED with pulse
        serialOutputWhenBeatHappens();   // A Beat Happened, Output that to serial.
        QS = false;                      // reset the Quantified Self flag for next time
  }

  ledFadeToBeat();                      // Makes the LED Fade Effect Happen
  delay(20);                             //  take a break
}





void ledFadeToBeat(){
    fadeRate -= 15;                         //  set LED fade value
    fadeRate = constrain(fadeRate,0,255);   //  keep LED fade value from going into negative numbers!
    analogWrite(fadePin,fadeRate);          //  fade LED
  }

Ora, se io volessi aggiungere un timer che misura il battito per soli 10 secondi dopo aver premuto un pulsante e che ricordi il valore ottenuto per fornire i bpm al minuto (che verranno quindi moltiplicati per 6) come potrei fare? Il metodo più semplice possibile se potete, grazie

Bobo17: Buongiorno, vorrei realizzare un misuratore di battito cardiaco che mi dia i battiti al minuto, utilizzando il pulsesensor. Ho trovato questo sketch:

 #define SERIAL_PLOTTER  2

//  Variables int pulsePin = 0;                // Pulse Sensor purple wire connected to analog pin 0 int blinkPin = 13;                // pin to blink led at each beat int fadePin = 5;                  // pin to do fancy classy fading blink at each beat int fadeRate = 0;                // used to fade LED on with PWM on fadePin

// Volatile Variables, used in the interrupt service routine! volatile int BPM;                  // int that holds raw Analog in 0. updated every 2mS volatile int Signal;                // holds the incoming raw data volatile int IBI = 600;            // int that holds the time interval between beats! Must be seeded! volatile boolean Pulse = false;    // "True" when User's live heartbeat is detected. "False" when not a "live beat". volatile boolean QS = false;        // becomes true when Arduoino finds a beat.

// SET THE SERIAL OUTPUT TYPE TO YOUR NEEDS // PROCESSING_VISUALIZER works with Pulse Sensor Processing Visualizer //      https://github.com/WorldFamousElectronics/PulseSensor_Amped_Processing_Visualizer // SERIAL_PLOTTER outputs sensor data for viewing with the Arduino Serial Plotter //      run the Serial Plotter at 115200 baud: Tools/Serial Plotter or Command+L static int outputType = SERIAL_PLOTTER;

void setup(){   pinMode(blinkPin,OUTPUT);        // pin that will blink to your heartbeat!   pinMode(fadePin,OUTPUT);          // pin that will fade to your heartbeat!   Serial.begin(115200);            // we agree to talk fast!   interruptSetup();                // sets up to read Pulse Sensor signal every 2mS   // IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE,   // UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN //  analogReference(EXTERNAL); }

//  Where the Magic Happens void loop(){

    serialOutput() ;

  if (QS == true){    // A Heartbeat Was Found                       // BPM and IBI have been Determined                       // Quantified Self "QS" true when arduino finds a heartbeat         fadeRate = 255;        // Makes the LED Fade Effect Happen                                 // Set 'fadeRate' Variable to 255 to fade LED with pulse         serialOutputWhenBeatHappens();  // A Beat Happened, Output that to serial.         QS = false;                      // reset the Quantified Self flag for next time   }

  ledFadeToBeat();                      // Makes the LED Fade Effect Happen   delay(20);                            //  take a break }

void ledFadeToBeat(){     fadeRate -= 15;                        //  set LED fade value     fadeRate = constrain(fadeRate,0,255);  //  keep LED fade value from going into negative numbers!     analogWrite(fadePin,fadeRate);          //  fade LED   }




Ora, se io volessi aggiungere un timer che misura il battito per soli 10 secondi dopo aver premuto un pulsante e che ricordi il valore ottenuto per fornire i bpm al minuto (che verranno quindi moltiplicati per 6) come potrei fare? Il metodo più semplice possibile se potete, grazie

Anche io ho quel sensore solo che adesso non lo trovo per provare lo sketch che ho modificato. In pratica ho fatto le modifiche nel loop inserendo la lettura del pulsane e utilizzando millis in un while. All' interno dell' while ho copiato il codice della lettura dell' battito

Grazie per la risposta, riesci a postare il tuo sketch, cosi lo capisco bene? Perché l'unico problema che non capisco come fare è dirgli di contare 10 secondi e quando scadono prelevare i dati del sensore

Bobo17:
Grazie per la risposta, riesci a postare il tuo sketch, cosi lo capisco bene? Perché l’unico problema che non capisco come fare è dirgli di contare 10 secondi e quando scadono prelevare i dati del sensore

scusami dalla fretta ho dimenticato di inserire il codice :o

#define PROCESSING_VISUALIZER 1
#define SERIAL_PLOTTER  2

//  Variables
int pulsePin = 0;
int blinkPin = 13;
int fadePin = 5;
int fadeRate = 0;
int pul = 7;                      // pin pulsante
int stato = 0;
int ult_stato = 0;
unsigned long t = 0;
unsigned long timer = 0;

// Volatile Variables, used in the interrupt service routine!
volatile int BPM;
volatile int Signal;
volatile int IBI = 600;
volatile boolean Pulse = false;
volatile boolean QS = false;

static int outputType = SERIAL_PLOTTER;

volatile int rate[10];
volatile unsigned long sampleCounter = 0;
volatile unsigned long lastBeatTime = 0;
volatile int P =512;
volatile int T = 512;
volatile int thresh = 530;
volatile int amp = 0;
volatile boolean firstBeat = true;
volatile boolean secondBeat = false;


void setup(){
  pinMode(blinkPin,OUTPUT);
  pinMode(fadePin,OUTPUT);
  pinMode(pul, INPUT);
  Serial.begin(115200);
  interruptSetup();
}


void loop(){
  stato = digitalRead(pul);
  t = millis();
  timer = millis();
  if(stato != ult_stato){
    if(stato == HIGH){
      while(t <= timer+10000){
        serialOutput() ;

        if (QS == true){
          
          fadeRate = 255;

          serialOutputWhenBeatHappens();
          QS = false;
        }
        
        ledFadeToBeat();
        t = millis();
        delay(20);    
      }
      Serial.print(BPM);
    }
  }
}





void ledFadeToBeat(){
    fadeRate -= 15;
    fadeRate = constrain(fadeRate,0,255);
    analogWrite(fadePin,fadeRate);
  }
void interruptSetup(){  
  
  TCCR2A = 0x02;
  TCCR2B = 0x06;
  OCR2A = 0X7C;
  TIMSK2 = 0x02;
  sei();
}

ISR(TIMER2_COMPA_vect){
  cli();
  Signal = analogRead(pulsePin);
  sampleCounter += 2;
  int N = sampleCounter - lastBeatTime;

    //  find the peak and trough of the pulse wave
  if(Signal < thresh && N > (IBI/5)*3){
    if (Signal < T){
      T = Signal;
    }
  }

  if(Signal > thresh && Signal > P){
    P = Signal;
  }
  
  if (N > 250){
    if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){
      Pulse = true;
      digitalWrite(blinkPin,HIGH);
      IBI = sampleCounter - lastBeatTime;
      lastBeatTime = sampleCounter;

      if(secondBeat){
        secondBeat = false;
        for(int i=0; i<=9; i++){
          rate[i] = IBI;
        }
      }

      if(firstBeat){
        firstBeat = false;
        secondBeat = true;
        sei();
        return;
      }


      // keep a running total of the last 10 IBI values
      word runningTotal = 0;

      for(int i=0; i<=8; i++){
        rate[i] = rate[i+1];
        runningTotal += rate[i];
      }

      rate[9] = IBI;
      runningTotal += rate[9];
      runningTotal /= 10;
      BPM = 60000/runningTotal;
      QS = true;
    }
  }

  if (Signal < thresh && Pulse == true){
    digitalWrite(blinkPin,LOW);
    Pulse = false;
    amp = P - T;
    thresh = amp/2 + T;
    P = thresh;
    T = thresh;
  }

  if (N > 2500){
    thresh = 530;
    P = 512;
    T = 512;
    lastBeatTime = sampleCounter;
    firstBeat = true;
    secondBeat = false;
  }

  sei();
}

void serialOutput(){
  switch(outputType){
    case PROCESSING_VISUALIZER:
      sendDataToSerial('S', Signal);
      break;
    case SERIAL_PLOTTER:
      //Serial.print(BPM);
      //Serial.print(",");
      //Serial.print(IBI);
      //Serial.print(",");
      //Serial.println(Signal);
      break;
    default:
      break;
      
  }

}

//  Decides How To OutPut BPM and IBI Data
void serialOutputWhenBeatHappens(){
  switch(outputType){
    case PROCESSING_VISUALIZER:
      sendDataToSerial('B',BPM);
      sendDataToSerial('Q',IBI);
      break;

    default:
      break;
  }
}

void sendDataToSerial(char symbol, int data ){
    Serial.print(symbol);
    Serial.println(data);
  }

Il mio codice l’ ho perso da tempo e non mi ero interessato a riscriverlo perché adesso uso elettrodi. Il codice l’ ho preso da quello dell’ adafruit (che l’ avrai preso anche te da la) e modificato

Grazie mille, ho provato anch’io a scriverne uno ma dato che non ho ancora il sensore sotto mano e visto che la discussione è ancora aperta volevo postare il mio sketch, cosi mi dite se può funzionare o se ci sono errori (logica, parentesi…) cosi sono sicuro che funzioni. L’ho semplificato un po in quanto non mi interessava il fade led e il programma per visualizzare il battito ma solo che li contasse e me li scrivesse su un display lcd

#define SERIAL_PLOTTER  2
#define BUTTON 7
#include <LiquidCrystal.h> 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  
int val = 0;                  
int vecchio_val = 0;          
int stato = 0; 
unsigned long interval=10000;
unsigned long previousMillis=0;
int counter=0;
int pulsePin = 0;              
volatile int BPM;                   
volatile int Signal;       
volatile int IBI = 600;             
volatile boolean Pulse = false;     
volatile boolean QS = false;        
static int outputType = SERIAL_PLOTTER;


void setup(){
lcd.begin(16, 2);
pinMode(BUTTON, INPUT);
  Serial.begin(115200);          
  interruptSetup();                 
}


void loop(){
val = digitalRead(BUTTON); 
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
    delay(15);             
  }   
  vecchio_val = val;         
    if (stato == 1) {  
lcd.clear();
counter=0;
unsigned long currentMillis = millis();
  serialOutput() ;
  if (QS == true){           
counter++;          serialOutputWhenBeatHappens();   
  QS = false;          
             if ((unsigned long)(currentMillis - previousMillis) >= interval) {
previousMillis = millis();
lcd.setCursor(0, 1);  
lcd.print(counter*6);
stato==0;
}
}
 }
}