Arduino millis()暂停时间

时间:2017-06-28 14:18:00

标签: time arduino

我目前使用测量elapsed time的代码测量我的草图中的已用时间,就像在此处看到的那样。代码需要准确到大约1秒,但我想编程它尽可能健壮。

unsigned long currentMillis = millis();
if ((unsigned long)(currentMillis - previousMillis) >= interval) 
{foo;}

我想知道添加暂停功能的最佳方式是什么,以便bool pause == true previousMillisinterval进行调整以确保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; } }

现在我正在思考以下几点:

foo

有更好的方法吗?我觉得它应该是一个更简单的操作。

修改 为了清理问题,我的目标是pause==trueinterval总共interval=1000时触发,如果pause==true(ms),那么foo 500(毫秒)pause==true将在1500毫秒后出现

修改2

为了进一步澄清,在interval = 1000需要进入帐户之前运行的时间可以说:

    程序启动时
  • pause == true(ms)。
  • 程序运行500(ms)
  • 500(ms)Pause == false
  • 之后
  • 3小时后foo

    Pause == false

  • 的500(ms)之后将触发

    (function() { var unfollowButtons = $('button.Unfollow'); var index = unfollowButtons.length - 1; function unfollow(callback) { if (index >= 0) { $(unfollowButtons[index--]).click(); } callback(); } function handleUnfollow(maxIter, iter) { iter = typeof iter === "number" ? iter : 0; if ( iter >= maxIter ) { // base case reached, stop further recursive calls return true; } // call unfollow once unfollow(function() { setTimeout(function() { // recursive call handleUnfollow(maxIter, ++iter); }, Math.floor((Math.random() * 1000) + 500)); }); } // execute recursive function, which will iterate 2 times handleUnfollow(2); })();

3 个答案:

答案 0 :(得分:0)

if (pause && ((unsigned long)(currentMillis - previousMillis) >= interval))

答案 1 :(得分:0)

millis()每50天返回零一毫秒。因此额外的测试。 PreviousMillis != 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

当不处于暂停状态时,计时器将在interval ms之后通过第二次测试。

完成后,计时器设置为零;这可以避免误触发。

答案 2 :(得分:0)

目前我已经编写了以下具有我想要的功能的代码,但我确定它不是最好的方法

(Global Vars)

Cannot read property 'set' of undefined

(代码)

unsigned long time_B  =0
unsigned long time_E = 0