10分間隔でスプレッドシートに温度・湿度を記録するJavaScriptを作りました。しかし、なぜか途中から5分前後の間隔で記録されています。ラズパイ3のブラウザでsetInterval()を使ったときに起こりました。
ブラウザで定期的に動作
温度センサーで取得した値を、obniz経由でラズパイ3のブラウザChromiumに表示させています。
タイマー処理はラズパイのブラウザ上で動作しています。
ブラウザのJavaScriptで、10分間隔で何か実行する場合、下記のような記述方法があります。
1 2 3 4 5 |
const timer = () => { // 実行する命令 }; setInterval(timer, 1000 * 60 * 10);//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 4 5 6 7 8 9 10 11 |
let nowM, oldM; const timer = () => { oldM = nowM; nowM = new Date().getMinutes() if((nowM % 10 === 0 && oldM % 10 !== 0)){ //10分毎で処理 //実行する命令 } }; setInterval(timer, 30000); //時刻チェックは30秒毎 |
1分間に2回処理しないよう、前回から分が変わっている時だけ実行するようにしました。(もっと良い書き方があるかもしれません。)
このコードであれば、3時間以降でもだいたい10分間隔で実行してくれます。
ラズパイのブラウザを起動しっぱなしで温度を記録しようとするのはレアケースだと思いますが、参考になる人がいれば・・・。