Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Time Arduino毫秒()经过的暂停时间_Time_Arduino - Fatal编程技术网

Time Arduino毫秒()经过的暂停时间

Time Arduino毫秒()经过的暂停时间,time,arduino,Time,Arduino,我现在用一个代码来测量草图中经过的时间,就像这里看到的那样。代码需要精确到1秒左右,但我希望对其进行编程,使其尽可能健壮 unsigned long currentMillis = millis(); if ((unsigned long)(currentMillis - previousMillis) >= interval) {foo;} 我想知道添加暂停功能的最佳方式是什么,这样如果boolpause==true或者previousMillis或者interval进行调整,以确保

我现在用一个代码来测量草图中经过的时间,就像这里看到的那样。代码需要精确到1秒左右,但我希望对其进行编程,使其尽可能健壮

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

    foo
    将在500(ms)以上的
    Pause==false后触发

millis()每50天返回0毫秒。因此需要额外的测试<代码>上一个毫秒!=0控制触发

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
for
interval
时间连续而不是
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;  
}
//...