Time Arduino毫秒()经过的暂停时间
我现在用一个代码来测量草图中经过的时间,就像这里看到的那样。代码需要精确到1秒左右,但我希望对其进行编程,使其尽可能健壮Time Arduino毫秒()经过的暂停时间,time,arduino,Time,Arduino,我现在用一个代码来测量草图中经过的时间,就像这里看到的那样。代码需要精确到1秒左右,但我希望对其进行编程,使其尽可能健壮 unsigned long currentMillis = millis(); if ((unsigned long)(currentMillis - previousMillis) >= interval) {foo;} 我想知道添加暂停功能的最佳方式是什么,这样如果boolpause==true或者previousMillis或者interval进行调整,以确保
unsigned long currentMillis = millis();
if ((unsigned long)(currentMillis - previousMillis) >= interval)
{foo;}
我想知道添加暂停功能的最佳方式是什么,这样如果boolpause==true
或者previousMillis
或者interval
进行调整,以确保foo
在pause==false
之后触发interval
现在我想的是:
//global setup
bool pause=false;
unsigned long previousMillis = 0;
unsigned long interval = 1000;
_________
unsigned long currentMillis = millis();
RClock();
if ((unsigned long)(currentMillis - previousMillis) >= interval)
{
interval=1000;
foo;
}
void RClock()
{
if(pause)
{
unsigned long runtime = millis()-previousMillis;
unsigned long timeleft= interval-runtime;
previousMillis=millis();
interval=timeleft;
}
}
有更好的方法吗?我觉得这应该是一个更简单的操作
编辑
为了澄清问题,我的目标是在pause==true
时触发foo
,总共触发interval
,因此如果interval=1000
(ms),在这段时间内,pause==true
持续500(ms)foo
将在1500 ms后触发
编辑2
为了进一步澄清,需要将某事物在pause==true
之前运行的时间考虑在内,比如:
- 程序启动时的
(毫秒)间隔=1000
- 程序运行500(毫秒)
- 500(ms)后
pause==true
- 3小时后
Pause==false
将在500(ms)以上的foo
Pause==false后触发
void Loop()
{
//...
if (pause)
{
previousMillis = millis();
if (previousMillis == 0)
previousMillis = 1; // avoid the one in a billion chance of missing a trigger
}
if (previousMillis && ((millis() - previousMillis) > interval))
{
previousMillis = 0; // prevents retriggering
foo();
}
//...
}
当pause==true
时,定时器与当前“时间”同步设置
不暂停时,计时器将在间隔
毫秒后通过第二次测试
完成后,定时器设置为零;这避免了错误的触发器。目前,我已经编写了以下代码,这些代码具有我想要的功能,但我确信这不是最好的方法 (全球增值税) (代码)
你的问题不是很清楚。你想“暂停计时器”,而
pause==true
?正确。我的最终目标是foo
在pause==true
时触发,总共interval
在代码中指定pause=true
?我从问题中了解到的是,您希望每1000毫秒执行500毫秒的foo,对吗?这是否像我在编辑2中提到的那样有效?我认为只有当pause==false
forinterval
时间连续而不是interval
累积时,它才会起作用。@ATE-ENGE我已经对逻辑添加了一些解释。写出来,我认为它不符合我想要的。如果interval=1000
(ms)和pause==false
从millis()=0到799,那么pause==true
at millis()=800到801,foo将在millis()=1800触发,而不是在1001触发这不是您在原始问题中描述的。“foo
将在500(ms)以上的Pause==false后触发。”。
void Loop()
{
//...
if (pause)
{
previousMillis = millis();
if (previousMillis == 0)
previousMillis = 1; // avoid the one in a billion chance of missing a trigger
}
if (previousMillis && ((millis() - previousMillis) > interval))
{
previousMillis = 0; // prevents retriggering
foo();
}
//...
}
unsigned long time_B =0
unsigned long time_E = 0
//...
unsigned long RClock (bool reset, bool pause)
{
unsigned long Ctime=millis();
if(reset)
{
time_B=Ctime;
//Serial.println("reset");
}
if(pause)
{
time_B=Ctime-time_E;
//Serial.println("pause");
}
time_E=Ctime-time_B;
return time_E;
}
//...