2017-10-26 3 views
0

나는 심장 박동을 측정하기 위해 내 자신의 Arduino 기능을 작성했습니다. 하지만 실행하면 제대로 작동하지 않습니다. 심장 박동수를 계산하기 위해, 나는 다음과 같은 계산을 할 필요가 :Arduino 맞춤식 기능이 작동하지 않습니다.

heart_Rate = 60000/period; 

을하지만 기간 값이 축적 계속 것을 깨달았다. 그 결과 심장 박동이 감소합니다. 그러나 함수를 만들지 않고 테스트 할 때 (내부 void 루프) 완벽하게 작동합니다.

이 내 아두 이노 코드입니다 : 내가 축적의 기간을 방지하려면 어떻게

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

?

답변

-1

데이터 유형 문제 일 수 있습니다. 변수를 float 또는 int로 변경하면 문제가 해결 될 수 있습니다.

float H_val; 

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

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

왜 float를 반환하고 코드를 작성하여 int를 반환 할 함수를 정의하겠습니까? 함수의 반환 형식은 실제로 반환하는 형식과 일치해야합니다. –

+0

죄송합니다. Imesh Nirangana의 코드에서 오류를 언급했지만 잘못 이해할 수 있음을 알았습니다. 나는 해결책을주기 위해 그것을 바꾼다. –

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에 할당하면됩니다. 그러나 코드를 단축하는 다양한 방법이 있습니다.

관련 문제