2019年9月5日木曜日

マルチファンクションシールドで時間計測

Arduinoで遊んでいるといつも電源で悩みます。だいたいモバイルバッテリーをつないで済ますのですが、結構大きくて邪魔だったりします。で、なにかいいものないかなと思っていたのですが、部品箱を漁っていたらLIR2032を2個入れる電池ボックスを発掘しました。
 
お!これは行けそうだということでVINにつないでみるとちゃんと動作\(^_^)/でもどのくらいの時間もつかなぁと調べようとしたのですが、じっと見張っているのも馬鹿らしい…
 
ちょうどマルティファンクションシールドというのが余っていたので、信号がHIGHになってからLOWになるまでの秒数を7セグLEDに表示するのを作りましたw(写真右)
 
計測してみると5分程度しかもたないみたいです…ただ、ボタン電池が購入してから1年以上放置していたものなので劣化してしまっている、あるいは、中華なので最初から不良なんて可能性もあります^^;
 
ちなみに動作させた左側のArduinoは孫の夏休みの自由研究用にと用意したFMラジオです。元は宿題用にバラックだったのですが、興味を示さなかったのでボツ。ジィジの記念用にケースというかワーキンベースというかを3Dプリンターで印刷しました^^;

時間計測しかできませんが意外と便利だったのでソースを公開します。

/**
 * 時間計測器
 * 
 * filename:  Uno-Timer.ino
 * 
 * @version   1.0.0
 * @copyright Copyright (C) 2019 Yoshio Kiya All rights reserved.
 * @date      2019-09-01
 * @author    木屋 善夫
 */
#include <TimerOne.h>
#include <Wire.h>
#include <MultiFuncShield.h>

enum
{
  WAITING,
  STARTED,
  STOPED,
};

uint8_t mode;
unsigned long startTime;
unsigned long offTime;
unsigned long stopTime;

#define PIN_INPUT 5

void setup() {
  Timer1.initialize();
  MFS.initialize(&Timer1);    // initialize multi-function shield library

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(PIN_INPUT, INPUT);

  int pin = digitalRead(PIN_INPUT);
  digitalWrite(LED_BUILTIN, !pin);
  MFS.write(-1);

  mode = WAITING;
}

void loop() {
  int pin = digitalRead(PIN_INPUT);
  digitalWrite(LED_1_PIN, !pin);
  unsigned long now = millis();

  // モードごとの動作
  switch (mode) {
    case WAITING: {
      // 起動前
      if (pin) {
        // スイッチがオンになった
        mode = STARTED;
        startTime = now;
        digitalWrite(LED_2_PIN, LOW); // 点灯
      } else {
        digitalWrite(LED_2_PIN, (now >> 9) & 1);
      }

      break;
    }
    case STARTED: {
      if (!pin)
      {
        // スイッチがオフになった
        mode = STOPED;
        stopTime = millis();
        digitalWrite(LED_3_PIN, LOW); // 点灯
      } else {
        digitalWrite(LED_3_PIN, (now >> 9) & 1);
      }

      int sec = (int)((now - startTime) / 1000);
      int min = sec / 60 * 100;
      sec = sec % 60;
      MFS.write(min + sec);
      break;
    }
    case STOPED: {
      if (pin) {
        mode = STARTED;
        digitalWrite(LED_4_PIN, HIGH);  // 消灯
      } else {
        digitalWrite(LED_4_PIN, (now >> 9) & 1);
      }
      break;
    }
  }

  delay(100);
}


使い方は、マルチファンクションシールドの右下の方にある A5 ピンに信号線をつなぎ、GND どうしを接続してください。

マルチファンクションシールドの右にあるLEDの意味は上から

  1. ウォッチドク:動作中は約0.5秒間隔で点滅します。
  2. スタンバイ:信号線が HIGH になるのを待っています。
  3. 計測中:最初に信号が HIGH になってから最後に LOW になるまでの時間を7セグLEDに「分分秒秒」で表示します。
  4. 計測終了:信号が HIGH になると 3. に戻ります。

参考資料