setIntervalのズレ(ラズパイ3のブラウザで確認)

10分間隔でスプレッドシートに温度・湿度を記録するJavaScriptを作りました。しかし、なぜか途中から5分前後の間隔で記録されています。ラズパイ3のブラウザでsetInterval()を使ったときに起こりました。

ブラウザで定期的に動作

温度センサーで取得した値を、obniz経由でラズパイ3のブラウザChromiumに表示させています。

タイマー処理はラズパイのブラウザ上で動作しています。

ブラウザのJavaScriptで、10分間隔で何か実行する場合、下記のような記述方法があります。

setInterval()で、10分(=600,000ミリ秒)ごとに実行する書き方です。

3時間後、タイマーが狂う

ラズパイを放置していたら、3時間後に突然大きなズレが発生していました。ちなみにラズパイはディスプレイをつないでいない状態です。

冒頭のスプレッドシートを再掲します。

開始3時間は10分間隔でしたが、その後5分前後の間隔になっています。

理由は分かりません。

ラズパイ3か、ブラウザが省電力モードに入ったのかもしれません。

処理速度が落ちて間隔が伸びるのかなと考えていましたが、逆に縮まるようです。

決まった時間に処理実行

解決策として、現在時刻の分が10で割りきれる数(例えば1:00, 1:10, 1:20, 1:30, 1:40, 1:50)の時だけ実行するようにします。

1分間に2回処理しないよう、前回から分が変わっている時だけ実行するようにしました。(もっと良い書き方があるかもしれません。)

このコードであれば、3時間以降でもだいたい10分間隔で実行してくれます。

ラズパイのブラウザを起動しっぱなしで温度を記録しようとするのはレアケースだと思いますが、参考になる人がいれば・・・。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)