ミリ秒したい(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}