プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、ラズパイ始めました。

Arduinoで時間を計る その2

今日は、前回続きです。
スイッチが押下されている時間を計測します。
下図のようなプルアップ回路を作って、タクトスイッチが押されている時間を計測します。
(Input I/Oが3だったり4だったりしますがあしからず)

f:id:s51517765:20160919131858j:plain

スイッチが押されれていないと、digitalReadはHIGHです。 

while (digitalRead(4) == HIGH) {} 

whileは()のなかの条件が成立している間、{}のなかを実行しますが、ここでは{}の中を空欄にすることで、digitalRead(4) == HIGH のあいだ、ここに留まります。
スイッチが押されて、digitalRead == LOWとなると、このwhileを抜けて、

time_m = micros();//スイッチが押され始めた時刻<200b>

に進みます。
次に

while (digitalRead(4) == HIGH) {} 

に進みdigitalRead(4) == LOW となるとこのwhileを抜けて
time_n = micros(); //スイッチが離された時刻
に進みます。
この時刻の差が 押下されている時間になります。

unsigned long time_m = 0;
unsigned long time_n = 0;
unsigned long time_nagasa = 0;
 
void setup() {
  pinMode(4, INPUT);
  Serial.begin(57600);
}
 
void loop() {
  while (digitalRead(4) == HIGH) {}
  time_m = micros(); //スイッチが押され始めた時刻
  delayMicroseconds(20); //チャタリング対策
  while (digitalRead(4) == LOW) {}
  time_n = micros(); //スイッチが離された時刻
  delayMicroseconds(20);
  time_nagasa = time_n - time_m; //スイッチが押下されて離された時間を算出

  delayMicroseconds(20);
  Serial.print("ms =");
  Serial.println(time_nagasa);
}

これを繰り返すことで、押された時刻、離された時刻を次々取得することを考えます。
ExcelなどにSerial出力を貼り付けられるように、HIGH or LOW、それぞれの継続時間、total時間、 HIGH = 1、LOW = 0を 「,」(カンマ)区切りで出力します。
カンマ区切りを入れることで、Excel上で 「区切り位置」 を設定することで、グラフ作成が容易になります。

unsigned long time_m = 0;
unsigned long time_n = 0;
unsigned long time_nagasa = 0;
unsigned long time_total = 0;
int i = 0;
void setup() {
  pinMode(4, INPUT);
  Serial.begin(57600);
}
void loop() {
  Serial.print("START  = ");
  Serial.println("0,0,1");
  for (;;) { //繰り返し範囲設定 無限繰り返し
    while (digitalRead(4) == HIGH) {}
    time_m = micros();
    time_nagasa = time_m - time_n; //スイッチが押下されていない時間を算出
    time_total = time_total + time_nagasa;
    Serial.print("---  = ");
    Serial.print("  ");
    Serial.print(time_nagasa);
    Serial.print(",");
    Serial.print(time_total);
    Serial.println(",1");
    Serial.print("LOW  = ");
    Serial.print(time_nagasa);
    Serial.print(",");
    Serial.print(time_total);
    Serial.println(",0");
    delayMicroseconds(20);
    while (digitalRead(4) == LOW) {}
    time_n = micros();
    delayMicroseconds(20);
    time_nagasa = time_n - time_m; //スイッチが押下されて離された時間を算出
    time_total = time_total + time_nagasa;
    Serial.print("---  = ");
    Serial.print("  ");
    Serial.print(time_nagasa);
    Serial.print(",");
    Serial.print(time_total);
    Serial.println(",0");
    Serial.print("HIGH = ");
    Serial.print(time_nagasa);
    Serial.print(",");
    Serial.print(time_total);
    Serial.print(",");
    Serial.println("1");
  }
}

f:id:s51517765:20160919132403p:plain
ここまでできたら、ほぼ完成したも同然。
次は赤外線リモコン解析をします。

Amazonで買える、赤外線センサー。