2个定时器arduino [2x millis()]

时间:2015-11-13 11:58:13

标签: c arduino

我对此代码有疑问。我知道问题是什么,但我无法找到一个好的解决方案。

我使用millis() - clock()time()有两个功能。

函数clock()返回日期和时间,函数time()返回另一个操作开启的时间。

问题在于我无法存储time()函数计算的时间。当我调用该函数2次时,从0:00开始。

我知道这是因为我每次调用循环都会覆盖变量,但我找不到合适的解决方案。这看起来很愚蠢,但我有一段时间有这个问题。

PS:我希望每次循环都有时间信息。

预期结果:

Start

2s: press 1 - clock = 2s, time = 0s.
5s: press 2 - clock = 5s, time = 3s.
15s: press 1 - clock = 15s, time = 3s.
20s: press 2 - clock = 20s, time = 8s.

我的代码:

void clock() {
  // ... function that returns date and time;
  // ... using millis();
}
void time(){
  if (first == 0){
    sec_aux = 0;
    min_aux = 0;
    UtlTime = millis();
    first = -1;
  }
  if(millis() - UtlTime < 0){
    UtlTime = millis();
  }
  else{
    sec_aux = int((millis() - UtlTime) / 1000);
  }
  if(sec_aux > 59){
    sec_aux = 0;
    min_aux++;
    UtlTime = millis(); 
  }
  sec = sec_aux;
  min = min_aux;
  Serial.println("TIME");
  Serial.print(min); Serial.print(":"); Serial.println(sec);
}

void loop() {
  if (Serial.available()) {
    inChar = Serial.read();
  }
  switch(inChar){
    case '1':
      time();
      clock();
      break;
    case '2':
      clock();
      first = 0;
      break;
    default:
      clock();
  }
}

1 个答案:

答案 0 :(得分:0)

好的,如果我理解正确你想要一个

的功能

1)你打电话一次然后重置计数器 2)你连续打电话告诉你经过了多少时间 3)你有时可以重置

如果是这样,你必须问自己&#34;我该如何重置计时器?&#34;。恕我直言,最好的解决方案是使用传递给函数的标志。

并且......避免两次使用millis函数;)

而且,顺便说一句,我认为你想在收到串口数据时只执行一次动作,所以将开关移到测试中......

以下是一个示例:

void time(bool reset){
    unsigned long currMillis = millis();
    if (reset){
        sec_aux = 0;
        min_aux = 0;
        UtlTime = currMillis;
    }   
    while ((currMillis - UtlTime) > 1000)
    {
        UtlTime += 1000;
        sec_aux++;
    }
    while(sec_aux > 59){
        sec_aux -= 60;
        min_aux++;
    }
    // Why do you duplicate the data?
    sec = sec_aux;
    min = min_aux;
    Serial.println("TIME");
    Serial.print(min); Serial.print(":"); Serial.println(sec);
}

void loop() {
    if (Serial.available()) {
        inChar = Serial.read();
        switch(inChar){
        case '1':
            // Show time measure
            time(false);
            clock();
            break;
        case '2':
            clock();
            // Start time measure
            time(true);
            break;
        default:
            clock();
        }
    }
}

编辑:

好的,那么你想要一个&#34;可停止的&#34;跑表。我建议你从串行接口分离更新,所以你总是有更新的值。或者至少那是我头脑的工作方式:P

我修改了一些东西。你应该

  1. lastMillis
  2. 中初始化millis()setup
  3. 初始化timeIsRunning为正确值
  4. resetTime()
  5. 中致电setup

    以下是代码:

    void resetTime()
    {
        msec = 0;
        sec = 0;
        min = 0;
    }
    
    void updateTime()
    {
        unsigned long currStep = millis() - lastMillis;
        lastMillis += currStep;
    
        if (timeIsRunning)
        {
            msec += currStep;
            while (msec > 1000)
            {
                msec -= 1000;
                sec++;
            }
            while(sec > 59){
                sec -= 60;
                min++;
            }
        }
    }
    
    void printTime()
    {
        Serial.println("TIME");
        Serial.print(min); Serial.print(":"); Serial.println(sec);
    }
    
    void loop()
    {
        updateTime();
    
        if (Serial.available())
        {
            inChar = Serial.read();
            switch(inChar)
            {
            case '1':
                // Show time measure
                timeIsRunning = false;
                printTime();
                clock();
                break;
            case '2':
                clock();
                // Start time measure
                timeIsRunning = true;
                break;
            default:
                clock();
            }
        }
    }