Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
脉冲传感器&x2B;用于计算BPM的arduino mkr1000_Arduino_Interrupt_Arduino Mkr1000 - Fatal编程技术网

脉冲传感器&x2B;用于计算BPM的arduino mkr1000

脉冲传感器&x2B;用于计算BPM的arduino mkr1000,arduino,interrupt,arduino-mkr1000,Arduino,Interrupt,Arduino Mkr1000,tldr;使用pulse sensor和mkr1000计算BPM的简单/逻辑方法(对于初学者)是什么?我不需要任何可视化或处理草图,只需要打印BPM值 请容忍我,我是这方面的新手,我已经尽了最大的努力来理解这一点并解决这个问题,但徒劳无功 我正在使用带有Arduino mkr1000的脉冲传感器(SEN-11574)计算BPM并在串行监视器中打印。我能够使用他们的起始代码获得原始读数 // Variables int PulseSensorPurplePin = 0; // Pu

tldr;使用pulse sensor和mkr1000计算BPM的简单/逻辑方法(对于初学者)是什么?我不需要任何可视化或处理草图,只需要打印BPM值

请容忍我,我是这方面的新手,我已经尽了最大的努力来理解这一点并解决这个问题,但徒劳无功

我正在使用带有Arduino mkr1000的脉冲传感器(SEN-11574)计算BPM并在串行监视器中打印。我能够使用他们的起始代码获得原始读数

//  Variables
int PulseSensorPurplePin = 0;        // Pulse Sensor PURPLE WIRE connected to ANALOG PIN 0
int LED13 = 13;   //  The on-board Arduion LED


int Signal;                // holds the incoming raw data. Signal value can range from 0-1024
int Threshold = 550;            // Determine which Signal to "count as a beat", and which to ingore. 


// The SetUp Function:
void setup() {
  pinMode(LED13,OUTPUT);         // pin that will blink to your heartbeat!
   Serial.begin(9600);         // Set's up Serial Communication at certain speed. 

}

// The Main Loop Function
void loop() {

  Signal = analogRead(PulseSensorPurplePin);  // Read the PulseSensor's value. 
                                              // Assign this value to the "Signal" variable.

   Serial.println(Signal);                    // Send the Signal value to Serial Plotter.


   if(Signal > Threshold){                          // If the signal is above "550", then "turn-on" Arduino's on-Board LED.  
     digitalWrite(LED13,HIGH);          
   } else {
     digitalWrite(LED13,LOW);                //  Else, the sigal must be below "550", so "turn-off" this LED.
   }


delay(10); 
}
然而,真正的问题是,我无法使用可用的示例代码计算BPM 据我所知,interrupt.ino文件中的中断计时器功能与mkr1000不兼容。附上此代码供您参考

// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE.
// Timer 2 makes sure that we take a reading every 2 miliseconds
ISR(TIMER2_COMPA_vect){                         // triggered when Timer2 counts to 124
  cli();                                      // disable interrupts while we do this
  Signal = analogRead(pulsePin);              // read the Pulse Sensor
  sampleCounter += 2;                         // keep track of the time in mS with this variable
  int N = sampleCounter - lastBeatTime;       // monitor the time since the last beat to avoid noise

    //  find the peak and trough of the pulse wave
  if(Signal < thresh && N > (IBI/5)*3){       // avoid dichrotic noise by waiting 3/5 of last IBI
    if (Signal < T){                        // T is the trough
      T = Signal;                         // keep track of lowest point in pulse wave
    }
  }

  if(Signal > thresh && Signal > P){          // thresh condition helps avoid noise
    P = Signal;                             // P is the peak
  }                                        // keep track of highest point in pulse wave

  //  NOW IT'S TIME TO LOOK FOR THE HEART BEAT
  // signal surges up in value every time there is a pulse
  if (N > 250){                                   // avoid high frequency noise
    if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){
      Pulse = true;                               // set the Pulse flag when we think there is a pulse
      digitalWrite(blinkPin,HIGH);                // turn on pin 13 LED
      IBI = sampleCounter - lastBeatTime;         // measure time between beats in mS
      lastBeatTime = sampleCounter;               // keep track of time for next pulse

      if(secondBeat){                        // if this is the second beat, if secondBeat == TRUE
        secondBeat = false;                  // clear secondBeat flag
        for(int i=0; i<=9; i++){             // seed the running total to get a realisitic BPM at startup
          rate[i] = IBI;
        }
      }

      if(firstBeat){                         // if it's the first time we found a beat, if firstBeat == TRUE
        firstBeat = false;                   // clear firstBeat flag
        secondBeat = true;                   // set the second beat flag
        sei();                               // enable interrupts again
        return;                              // IBI value is unreliable so discard it
      }


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

      for(int i=0; i<=8; i++){                // shift data in the rate array
        rate[i] = rate[i+1];                  // and drop the oldest IBI value
        runningTotal += rate[i];              // add up the 9 oldest IBI values
      }

      rate[9] = IBI;                          // add the latest IBI to the rate array
      runningTotal += rate[9];                // add the latest IBI to runningTotal
      runningTotal /= 10;                     // average the last 10 IBI values
      BPM = 60000/runningTotal;               // how many beats can fit into a minute? that's BPM!
      QS = true;                              // set Quantified Self flag
      // QS FLAG IS NOT CLEARED INSIDE THIS ISR
    }
  }

  if (Signal < thresh && Pulse == true){   // when the values are going down, the beat is over
    digitalWrite(blinkPin,LOW);            // turn off pin 13 LED
    Pulse = false;                         // reset the Pulse flag so we can do it again
    amp = P - T;                           // get amplitude of the pulse wave
    thresh = amp/2 + T;                    // set thresh at 50% of the amplitude
    P = thresh;                            // reset these for next time
    T = thresh;
  }

  if (N > 2500){                           // if 2.5 seconds go by without a beat
    thresh = 530;                          // set thresh default
    P = 512;                               // set P default
    T = 512;                               // set T default
    lastBeatTime = sampleCounter;          // bring the lastBeatTime up to date
    firstBeat = true;                      // set these to avoid noise
    secondBeat = false;                    // when we get the heartbeat back
  }

  sei();                                   // enable interrupts when youre done!
}// end isr
串行监视器仅显示这些不断变化的数字:

S797
S813
S798
S811
S822
S802
S821
S819
S818
S806
S797
S797
S812
S816
S794
S820
S821
S808
S816
S820
S803
S810
S811
S806
S822
S817
S811
S822
S800
S820
S799
S800
S815
S809
S820
S822
S821
S809
S796
S821
S816
S798
S820
总而言之,我希望有人能帮助我编写代码,以更基本/更简单的方式计算BPM,而不必处理BPM的可视化


抱歉发了这么长的帖子,谢谢

我使用的传感器是DFRobot压电圆盘振动传感器模块

void setup() {



 Serial.begin(57600); 
}

void loop() {
  int avg = 0;
  for(int i=0;i<64;i++){
    avg+=analogRead(A2);
  }
  Serial.println(avg/64,DEC);
  delay(5);
}


void setup() {
  Serial.begin(57600); 
}

void loop() {
  int avg = 0;
  for(int i=0;i<64;i++){
    avg+=analogRead(A2);
  }
  Serial.println(avg/64,DEC);
  delay(5);
}



 When defining an arbitrary threshold (e.g. half of the maximum measured value), the rising edge of the signal will pass the threshold once per heartbeat, making measuring it as simple as measuring the time between two successive beats. For less jitter, I chose to calculate the heart rate using the average of the last 16 time differences between the beats.
void setup(){
序列号。开始(57600);
}
void循环(){
int平均值=0;

对于(int i=0;i我就是这样做的,以克服电路板上没有中断的情况:

#define pulsePin A0

//  VARIABLES
int rate[10];                    
unsigned long sampleCounter = 0; 
unsigned long lastBeatTime = 0;  
unsigned long lastTime = 0, N;
int BPM = 0;
int IBI = 0;
int P = 512;
int T = 512;
int thresh = 512;  
int amp = 100;                   
int Signal;
boolean Pulse = false;
boolean firstBeat = true;          
boolean secondBeat = true;
boolean QS = false;    

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

}

void loop() {

              if (QS == true) {
                Serial.println("BPM: "+ String(BPM));
                QS = false;
              } else if (millis() >= (lastTime + 2)) {
                readPulse(); 
                lastTime = millis();
              }     
}



void readPulse() {

  Signal = analogRead(pulsePin);              
  sampleCounter += 2;                           
  int N = sampleCounter - lastBeatTime;   

  detectSetHighLow();

  if (N > 250) {  
    if ( (Signal > thresh) && (Pulse == false) && (N > (IBI / 5) * 3) )
      pulseDetected();
  }

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

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

}

void detectSetHighLow() {

  if (Signal < thresh && N > (IBI / 5) * 3) {
    if (Signal < T) {                       
      T = Signal;                         
    }
  }

  if (Signal > thresh && Signal > P) {    
    P = Signal;                           
  }                                       

}

void pulseDetected() {
  Pulse = true;                           
  IBI = sampleCounter - lastBeatTime;     
  lastBeatTime = sampleCounter;           

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

  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;                              
}
#定义pulsePin A0
//变数
整数率[10];
无符号长采样计数器=0;
无符号长时间=0;
无符号长lastTime=0,N;
int BPM=0;
int-IBI=0;
int P=512;
int T=512;
int thresh=512;
int amp=100;
int信号;
布尔脉冲=假;
布尔第一拍=真;
布尔第二拍=真;
布尔QS=false;
无效设置(){
Serial.begin(9600);
}
void循环(){
如果(QS==true){
Serial.println(“BPM:+String(BPM));
QS=假;
}否则如果(毫秒()>=(上次+2)){
readPulse();
lastTime=millis();
}     
}
void readPulse(){
信号=模拟读数(pulsePin);
采样计数器+=2;
int N=采样计数器-上次采样时间;
检测Thighlow();
如果(N>250){
如果((信号>阈值)&&(脉冲==假)&&(N>(IBI/5)*3))
脉冲检测();
}
如果(信号2500){
thresh=512;
P=512;
T=512;
lastBeatTime=采样计数器;
第一拍=真;
第二拍=真;
}
}
void detectThighlow(){
中频(信号(IBI/5)*3){
如果(信号阈值和&信号>P){
P=信号;
}                                       
}
真空脉冲检测(){
脉冲=真;
IBI=采样计数器-上次采样时间;
lastBeatTime=采样计数器;
如果(第一拍){
第一拍=假;
回来
}
如果(第二拍){
第二拍=假;

对于(iTi=0;I ARDUNO不是C,也不是完全的C++。非常感谢。这肯定是有效的。我看到BPM值,当串行监视器开始打印时,它从40秒的正常范围开始,10秒内开始增加到200以上。我想知道这是不是我的MKR1000或代码?我有两个不同的脉冲传感器,它们都有相同的问题!此外,我还计划使用数字管脚来计算温度,并想知道是否有一些事情我应该小心?再次,非常感谢。这真的很有帮助!欢迎投票并接受答案。添加其他传感器时,请确保不会增加延迟当它计算BPM时,当QS为真时,可以在第一个if语句中添加延迟关于跳跃读数,这与传感器的质量以及如何使用传感器有关,因为它与反射光一起工作,所以需要确保它是隔离的。此外,我是如何添加if语句来检查BPM是否在特定范围内的范围(40-100),当它不是我打印的“无效读取”时,所有额外的代码都需要在第一个if语句中。
void setup() {



 Serial.begin(57600); 
}

void loop() {
  int avg = 0;
  for(int i=0;i<64;i++){
    avg+=analogRead(A2);
  }
  Serial.println(avg/64,DEC);
  delay(5);
}


void setup() {
  Serial.begin(57600); 
}

void loop() {
  int avg = 0;
  for(int i=0;i<64;i++){
    avg+=analogRead(A2);
  }
  Serial.println(avg/64,DEC);
  delay(5);
}



 When defining an arbitrary threshold (e.g. half of the maximum measured value), the rising edge of the signal will pass the threshold once per heartbeat, making measuring it as simple as measuring the time between two successive beats. For less jitter, I chose to calculate the heart rate using the average of the last 16 time differences between the beats.
int threshold = 60;
int oldvalue = 0;
int newvalue = 0;
unsigned long oldmillis = 0;
unsigned long newmillis = 0;
int cnt = 0;
int timings[16];

void setup() {
  Serial.begin(57600); 
}

void loop() {
  oldvalue = newvalue;
  newvalue = 0;
  for(int i=0; i<64; i++){ // Average over 16 measurements
    newvalue += analogRead(A2);
  }
  newvalue = newvalue/64;
  // find triggering edge
  if(oldvalue<threshold && newvalue>=threshold){ 
    oldmillis = newmillis;
    newmillis = millis();
    // fill in the current time difference in ringbuffer
    timings[cnt%16]= (int)(newmillis-oldmillis); 
    int totalmillis = 0;
    // calculate average of the last 16 time differences
    for(int i=0;i<16;i++){
      totalmillis += timings[i];
    }
    // calculate heart rate
    int heartrate = 60000/(totalmillis/16);
    Serial.println(heartrate,DEC);
    cnt++;
  }
  delay(5);
}



int threshold = 60;
int oldvalue = 0;
int newvalue = 0;
unsigned long oldmillis = 0;
unsigned long newmillis = 0;
int cnt = 0;
int timings[16];

void setup() {
  Serial.begin(57600); 
}

void loop() {
  oldvalue = newvalue;
  newvalue = 0;
  for(int i=0; i<64; i++){ // Average over 16 measurements
    newvalue += analogRead(A2);
  }
  newvalue = newvalue/64;
  // find triggering edge
  if(oldvalue<threshold && newvalue>=threshold){ 
    oldmillis = newmillis;
    newmillis = millis();
    // fill in the current time difference in ringbuffer
    timings[cnt%16]= (int)(newmillis-oldmillis); 
    int totalmillis = 0;
    // calculate average of the last 16 time differences
    for(int i=0;i<16;i++){
      totalmillis += timings[i];
    }
    // calculate heart rate
    int heartrate = 60000/(totalmillis/16);
    Serial.println(heartrate,DEC);
    cnt++;
  }
  delay(5);
}
#define pulsePin A0

//  VARIABLES
int rate[10];                    
unsigned long sampleCounter = 0; 
unsigned long lastBeatTime = 0;  
unsigned long lastTime = 0, N;
int BPM = 0;
int IBI = 0;
int P = 512;
int T = 512;
int thresh = 512;  
int amp = 100;                   
int Signal;
boolean Pulse = false;
boolean firstBeat = true;          
boolean secondBeat = true;
boolean QS = false;    

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

}

void loop() {

              if (QS == true) {
                Serial.println("BPM: "+ String(BPM));
                QS = false;
              } else if (millis() >= (lastTime + 2)) {
                readPulse(); 
                lastTime = millis();
              }     
}



void readPulse() {

  Signal = analogRead(pulsePin);              
  sampleCounter += 2;                           
  int N = sampleCounter - lastBeatTime;   

  detectSetHighLow();

  if (N > 250) {  
    if ( (Signal > thresh) && (Pulse == false) && (N > (IBI / 5) * 3) )
      pulseDetected();
  }

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

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

}

void detectSetHighLow() {

  if (Signal < thresh && N > (IBI / 5) * 3) {
    if (Signal < T) {                       
      T = Signal;                         
    }
  }

  if (Signal > thresh && Signal > P) {    
    P = Signal;                           
  }                                       

}

void pulseDetected() {
  Pulse = true;                           
  IBI = sampleCounter - lastBeatTime;     
  lastBeatTime = sampleCounter;           

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

  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;                              
}