我编写了自己的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);
}
如何防止这段时间累积?
答案 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();
}