2017-12-21 9 views
-1

私はArduinoでデジタル時計を作ろうとしていますが、数時間後には数分後です。クロックアルゴリズムはしばらくして数分後に遅れます

4ms後にaux値を大きくしました。技術的には15000 * 4ms後に最後の1桁を増やす必要がありますか?

void loop() { 
    // t is first hour digit 
    // y is the second hour digit 
    // u is the first minute digit 
    // i is the second minute digit 

    if (t == 2 && y == 4) { 
    t = 0; 
    y = 0; 
    } 
    digitalWrite(ox, 0); 
    digitalWrite(oy, 1); 
    digitalWrite(mx, 1); 
    digitalWrite(my, 1); 
    draw(t); 
    delay(1); 
    digitalWrite(ox, 1); 
    digitalWrite(oy, 0); 
    digitalWrite(mx, 1); 
    digitalWrite(my, 1); 
    draw(y); 
    delay(1); 
    digitalWrite(ox, 1); 
    digitalWrite(oy, 1); 
    digitalWrite(mx, 0); 
    digitalWrite(my, 1); 
    draw(u); 
    delay(1); 
    digitalWrite(ox, 1); 
    digitalWrite(oy, 1); 
    digitalWrite(mx, 1); 
    digitalWrite(my, 0); 
    draw(i); 
    delay(1); 
    aux++; 
    if (aux == 15000) { 
    aux = 0; 
    i++; 
    } 
    if (i > 9) { 
    i = 0; 
    u++; 

    } 
    if (u == 6) { 
    u = 0; 
    y++; 
    } 
    if (y > 9) { 
    y = 0; 
    t++; 
    } 
} 
+3

正確な時間を保つためにJavaScriptを使用することはできません。代わりに、moment.jsのようなライブラリを使用してください。 –

+0

moment.jsはまだJSですが、それ以上正確に保持することはできません。代わりにシステム時間を参照するだけです。これは、正確な時間が必要な場合に行う必要があります。 – samanime

+2

これは明らかにArduinoコード(C++)であり、JavaScriptではありません。 JavaScriptの回答が受け入れられたのはなぜですか? –

答えて

-2

このようなクロックをやろうとしているとの問題は、あなたのコードは、あなたが望む正確時刻に実行されていることを保証することはできませんです。

単純な例として、ブラウザで利用できるsetTimeout()機能を考えてみましょう。私はすべての1000ミリ秒私の機能を実行するためにsetTimeout()を言うならば、私は、各呼び出しの間で異なるが、正確に1000ミリ秒であることをことを期待:

let lastTime; 
 

 
const run =() => { 
 
    const now = Date.now(); 
 
    lastTime && console.log('diff', now - lastTime); 
 
    lastTime = now; 
 
    setTimeout(run, 1000); 
 
} 
 

 
run();

お知らせしかし、これがそうでないこと。少なくとも私のコンピュータにはない。時には違いは正確に1000ms、それ以外の場合は10041008996などです。非常に近いです。私たちは瞬きの約200分の1の違いを話していますが、時間を守ろうとしているときには、その小さな時間が足ります。

ここで私はする必要があります私がオフセットだと思うものに基づいて時間を追跡してみましょう:(タイムスタンプと比較

let lastTime; 
 
let currentTime = Date.now(); 
 
const interval = 1000; 
 

 
const pad = (num, len = 2) => ('000' + num).slice(-len); 
 
const format = d => pad(d.getHours()) + ':' + pad(d.getMinutes()) + ':' + pad(d.getSeconds()) + '.' + pad(d.getMilliseconds(), 3); 
 

 
const run =() => { 
 
    const now = Date.now(); 
 
    console.log(
 
    'tracked time:', format(new Date(currentTime)), 
 
    '|', 
 
    'offset:', Date.now() - currentTime, 
 
    '|', 
 
    lastTime ? 'since last: ' + (now - lastTime) : 'first run'); 
 
    lastTime = now; 
 
    currentTime += interval; 
 
    setTimeout(run, interval); 
 
}; 
 

 
run();

あなたは非常に迅速に私たちは離れて漂流し始めることがわかりますSOは右のコンソールメッセージに含まれています)。これで、数時間後に2〜3分後にどのようになったのか想像することができます。

時計を持っているというのは、本当にシステムクロックに頼る必要があるということです。ほぼすべてのコンピュータは、本当に正確な時間を保つために使用するクロックメカニズムを備えています。だからあなたのコンピュータの時計は純粋にソフトウェアで保持されているように漂っていません。

待ち時間に基づいてちょうど増分するのではなく、実際にはシステムからリアルタイムでグラブする必要があります。あなたはそれを何らかの方法や形で参照することなく維持することはできません。

+0

'setInterval'メソッドのアプローチは' setTimeout'アプローチよりも正確でしょうか?私は、 'setInterval'は計算遅延にあまり依存しないと思う。 – Alexander

+0

どちらもかなり同じです。計算遅延(少なくともこの例では)は、ミリ秒単位ではなく、ナノ秒単位で表されます。他のより複雑なシナリオでも可能ですが、それでも実行されずに別の実行が行われると、実際にはさらに多くのメモリを詰め込むため、さらに遅くなります。 – samanime

+1

質問は、Arduino(C++)またはProcessing(Java)JavaScriptについてではありません。 –

関連する問題