ミリ秒したい(millis

1millis()

millis()で、起動してから現在までの経過時間をミリ秒で取得できます。

注釈

millis()は32ビットなので、約50日でオーバーフローします。 長期測定の場合は対応が必要です。

起動時間したい

 1unsigned long g_started;
 2
 3void setup() {
 4    Serial.begin(115200);
 5
 6    // 初期化処理いろいろ
 7
 8    // 起動時刻を取得
 9    g_started = millis();
10}
11
12void loop() {
13    unsigned long uptime = millis() - g_start;
14    Serial.print("Uptime (ms): ");
15    Serial.println(uptime);
16
17    delay(1000);    // 1秒ごとに表示
18}

setup()で基準となる時刻を取得しておくことで、 loop()内のタイムスタンプとして利用できます。

オーバーフロー処理したい

 1#include <Arduino.h>
 2
 3uint32_t _previous_millis = 0;  前回の millis を保存
 4uint64_t _uptime64 = 0;
 5
 6void uptime_start() {
 7    _previous_millis = millis();
 8    _uptime64 = 0;
 9}
10
11uint64_t get_uptime() {
12    uint32_t current = millis();
13
14    // オーバーフロー検出
15    if (current < _previous_millis) {
16        _uptime64 += (uint64_t)0xFFFFFFFFUL + 1;
17    }
18
19    _uptime64 += (uint64_t)(current - _previous_millis);
20    _previous_millis = current;
21
22    return _uptime64;
23}

オーバーフローするとmillis()は0に戻ります。 そのときcurrent_previous_millisより小さくなるため current < _previous_millisで検出できます。

オーバーフローを検出したら、桁が繰り上がったことを記録しておくようにします。 32bitでオーバーフローするので0xFFFFFFFFUL + 1で1桁繰り上げできます。

current - _previous_millisはオーバーフローしてからの時刻差(マイナスの値)です。 _uptime64に加算することで、現在の経過時間が計算できます。

 1void setup() {
 2    Serial.begin(115200);
 3    uptime_start();
 4}
 5
 6void loop() {
 7    uint64_t uptime = get_uptime();
 8    Serial.print("Uptime (ms): ");
 9    Serial.println(uptime);
10
11    // delay(1000)
12}