一段时间后,时钟算法落后几分钟

问题描述 投票:-1回答:1

我正在尝试使用Arduino制作一个数字时钟,但几个小时后它就落后了几分钟。

我在4ms之后增加了辅助值,所以技术上在15000 * 4 ms后它会增加最后一分钟数字吗?

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++;
  }
}
arduino clock
1个回答
-2
投票

尝试做这样的时钟的问题是你不能保证你的代码正好在你想要的时间运行。

举个简单的例子,考虑浏览器中可用的setTimeout()函数。如果我告诉setTimeout()每1000毫秒运行一次我的函数,我希望每次调用之间的差异恰好是1000毫秒:

let lastTime;

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

run();

但请注意,情况并非如此。至少不在我的电脑上。有时它的差异恰好是1000毫秒,其他时候它将是10041008996等。非常非常接近。我们说的是差异大约是眨眼的1/200,但是,当你想要保持时间时,那些微小的时间加起来。

在这里,我将尝试根据我认为的偏移量应该跟踪时间:

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包括在内)。有了这个,你可以想象几个小时之后你会在几分钟后离开。

拥有时钟的技巧是你真的需要依赖系统时钟。几乎每台计算机都有某种时钟机制,用于保持非常精确的时间。这就是为什么你的计算机时钟不像纯粹用软件那样漂移的原因。

您不必仅仅根据等待进行递增,而是必须从系统中获取实时时间。如果不以某种方式或形式引用它,您将无法维护它。

© www.soinside.com 2019 - 2024. All rights reserved.