2017-12-21 19 views
-1

Arduino로 디지털 시계를 만들려고하는데 몇 시간 후에 몇 분 뒤에 있습니다.잠시 후 시계 알고리즘이 몇 분 뒤에 지연됩니다.

기술적으로 4ms 후에 aux 값이 증가 했으므로 15000 * 4ms 후에 바로 마지막 숫자를 증가시켜야합니까?

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() 기능을 사용할 수 있습니다. 나는 모든 1000MS 내 기능을 실행할 수 setTimeout()을 말한다면, 나는 각 호출 사이의 서로 다른 정확히 1000MS 될 것으로 기대 :

let lastTime; 
 

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

 
run();

공지 그러나, 이러한 경우가있다. 적어도 내 컴퓨터에는 없어요. 때로는 차이가 정확하게 1000ms이고, 다른 시간은 1004, 1008, 996 등입니다. 아주 가깝습니다. 우리는 약 1/200th의 깜박임의 차이점을 이야기하고 있습니다. 그러나 시간을 유지하려고 할 때, 그 작은 시간이 합쳐집니다. 여기

나는 내가해야 오프셋 무슨 생각을 기반으로 시간을 추적하려고합니다 :

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();

당신은 매우 신속하게 우리가 떨어져 표류하기 시작 것을 볼 수 있습니다 (타임 스탬프와 비교 그래서 콘솔 메시지에 오른쪽에 포함되어 있습니다). 이걸로 몇 시간 후에 어떻게 2 분이 지났을 지 상상할 수 있습니다.

시계가있는 속임수는 시스템 클럭에 의존해야합니다. 거의 모든 컴퓨터에는 정확한 시간을 유지하는 데 사용하는 일종의 시계 메커니즘이 있습니다. 그래서 컴퓨터 시계는 순수하게 소프트웨어로 유지되는 것과 같이 표류하지 않습니다.

대신 대기를 기준으로 증가하는 대신 실제로 시스템에서 실시간을 가져와야합니다. 어떤 방식이나 형식으로 참조하지 않고 유지 관리 할 수 ​​없습니다.

+0

이 경우'setInterval' 메소드 접근법이'setTimeout' 접근법보다 더 정확할까요? 제 생각에'setInterval'은 계산 지연에 덜 의존합니다. – Alexander

+0

아니요.둘 다 거의 동일합니다. 모든 계산 지연 (적어도이 예제에서)은 밀리 초가 아닌 나노초 단위의 스케일입니다. 다른 복잡한 시나리오에서도 가능합니다. 그렇더라도 하나가 완료되지 않고 다른 하나가 실행되면 실제로 더 많은 메모리를 씹기 시작할 것이기 때문에 실제로 느려질 것입니다. – samanime

+1

질문은 Arduino (C++) 또는 Processing (Java) JavaScript가 아닙니다. –