質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

arduinoのtime関数について

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 4,223

suketti

score 4

前提・実現したいこと

arduinoと心拍センサ(http://ssci.to/1135)を使って5秒間だけ値を読み取りその中で平均の値を出したいです。

現状はセンサの値に合わせてモーターを制御するとこまでは確認できました

どのような方法があるかご教授いただけれ幸いです

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

#define in1Pin 9
#define in2Pin 10

int PulseSensorPurplePin = 0;        

//int LED13 = 13;   





int Signal;                

int Threshold = 550;            





// The SetUp Function:

void setup() {
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  //pinMode(LED13,OUTPUT);        

   Serial.begin(9600);        

}
void loop() {

      //digitalWrite(in1Pin,LOW);
      //digitalWrite(in2Pin,HIGH);

  Signal = analogRead(PulseSensorPurplePin);  





   Serial.println(Signal);                    





   if(Signal > Threshold){                            

     //digitalWrite(LED13,HIGH);     
     digitalWrite(in1Pin,LOW);     

   } else {

     //digitalWrite(LED13,LOW);  
     digitalWrite(in1Pin,HIGH);    

   }





delay(10);


}

試したこと

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

  • 計測開始~終了は、millis()で取得できる時刻値で判定する。
  • 計測中、計測値および計測回数を積算する。
  • 計測終了時、積算された計測値を計測回数で割る。

という流れでよいかと思います。
計測値および回数がオーバーフローしないように注意が必要です。

以下、概念コードです。

unsigned long start_time = 0;   // 計測開始時刻
unsigned long check_cnt = 0;    // 計測回数
float check_val = 0;            // 積算された計測値

int state = 0;  // 動作状態

loop(){

    if( state == 0){        // 計測開始待ち
        if( isStart()){     // 何らかの計測開始アクションを取得
            start_time = millis();
            check_cnt = 0;
            check_val = 0;
            state = 1;
        }
    }
    else if ( state == 1){  // 計測中
        unsigned long cur_time = millis();
        if( (cur_time - start_time) <= 5000){
            check_val += getVal();  // 値を取得し積算
            check_cnt++;
        }
        else{
            state = 2;
        }
    }
    else if( state == 2){   // 計測終了
        int avg_val = check_val / check_cnt;
        state = 0;
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

脈拍は毎分60~100回ですから、5秒だと5~8回しか打うちません。
1回数え損ねると20~12%の誤差が生じることになりますから、一定の回数脈拍が打つ時間を測定したほうが良いように思います。
以前、看護婦さんは脈拍数用のメモリがついた時計(ナースウォッチ)を使っていて、脈拍15回の時間で1分間の脈拍数を測定(推測)していました。 ナースウォッチ
そこで、脈拍が15回打つ時間を計って、そこから1分間の脈拍数を求めるコードをちょっと書いてみました。

#define in1Pin 9
#define in2Pin 10

int PulseSensorPurplePin = 0;        

int Signal;                
int Threshold = 550;            
int status=0; // 0:初期状態(測定開始前)、1:測定中、2:測定終了
int lastSignal = 0; 
int pulseCount; //脈拍数
int startTime;
int endTime;
float pulse;

// The SetUp Function:

void setup() {
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  //pinMode(LED13,OUTPUT);        

   Serial.begin(9600);        

}
void loop() {

  Signal = analogRead(PulseSensorPurplePin);  

  // Serial.println(Signal); //測定に影響するかもしれないので、コメントアウト                    

   if(Signal > Threshold){                    

     if (lastSignal=0) //脈拍の始まり {
       if (status=0) { //最初の脈拍
         startTime = millis(); //開始時間
         pulseCount=0;
         status=1;       
       } else if (status=1) {
         pulseCount=pulseCount+1; //脈拍数を増やす
         if (pulseCount=15){  //15回目の脈拍
           endTime = millis(); //終了時間
           // 脈拍は、15 * 1分 / (15回の脈拍に要した時間)
           pulse = 15 * (60000 / (endTime-startTime)); //millisはミリ秒の値を返す。1分をミリ秒で表すと60000
           Serial.printf( F("%f pulses/sec."),Signal);  //脈拍をシリアルに書き出す
         }
         status=2;
       }
       lastSignal = 1
     //digitalWrite(LED13,HIGH);     
     //digitalWrite(in1Pin,LOW);     
     }
   } else {
     lastSignal = 0

     //digitalWrite(LED13,LOW);  
     //digitalWrite(in1Pin,HIGH);
   }

delay(10);
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる