Arduino定制功能无法正常工作

时间:2017-10-26 07:59:03

标签: arduino

我编写了自己的Arduino函数来测量心率。但是当它执行时它无法正常工作。为了计算心率,我必须进行以下计算:

heart_Rate = 60000/period;

但我意识到周期值不断积累。结果,心率降低。但是,当我在没有制作函数的情况下测试它(在void循环内)时,它的工作正常。

这是我的Arduino代码:

int H_val = 0;
void setup() {
  Serial.begin(9600);
}

float HeartRate() {
  int threshold = 750;
  int raw_ecg = 0;
  int E_input = 0;
  float period = 0;
  unsigned long p_time = 0;
  unsigned long c_time = 0;
  int H_rate;
  int oldvalue = 0;

  oldvalue = raw_ecg;
  raw_ecg = 0;
  raw_ecg = analogRead(A0);
  if (oldvalue < threshold && raw_ecg >= threshold) {
    p_time = c_time;
    c_time = millis();
    period = c_time - p_time;
  }

  if (period <= 0) {
    int H_rate = 0;
  } else {
    int H_rate = 60000 / period;
    return H_rate;
  }
  delay(2);
}

void loop() {
  H_val = HeartRate();
  Serial.println(H_val);
}

如何防止这段时间累积?

2 个答案:

答案 0 :(得分:0)

每次调用该函数时,局部变量都会再次初始化。在你的代码中,这意味着

p_time = c_time; //c_time = 0
c_time = millis();
period = c_time - p_time;

因此,随着millis()的增加,期间会增加。

如果您将变量声明为静态,则问题将得到解决:

static unsigned long p_time = 0;
static unsigned long c_time = 0;

通过这样做,变量在函数调用之间保持存在(并保持其值)并保持其局部范围。

它在循环中工作的原因是你永远不会离开循环,变量永远不会被重新初始化。

编辑:将c_time声明为静态,就像将它的值分配给p_time一样。但是有很多方法可以缩短代码。

答案 1 :(得分:-1)

这可能是数据类型的问题。将变量更改为float或int可以解决问题。

float H_val;

float HeartRate(){
    float H_rate;
    return H_rate;
}

void loop(){
    H_val = HeartRate();
}