我试图用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++;
}
}
答案 0 :(得分:-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毫秒,有时它会是1004
,1008
,996
等等。非常非常接近。我们谈论的差异大约是眨眼的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包括的时间戳相比)。有了这个,你可以想象几个小时之后你会在几分钟后离开。
拥有时钟的诀窍是你真的需要依赖系统时钟。几乎每台计算机都有某种时钟机制,用于保持非常精确的时间。这就是为什么你的计算机时钟不像纯粹用软件那样漂移的原因。
您不必仅仅根据等待进行递增,而是必须从系统中获取实时时间。如果不以某种方式或形式引用它,您将无法维护它。