プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

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で買える、赤外線センサー。