延迟功能后计时器停止

时间:2018-08-03 06:22:32

标签: c++ timer nodemcu

我使用带有多个计时器的NodeMCU。 此代码运行正常。共有3种计时器功能,其计数取决于Firebase的输入,每个功能都有延迟。但是当延迟到来时,另一个计时器会停止一会儿,直到延迟完成。代码如下所示:

//timerrak1
void t2Callback() {
        if (start[0] == milis[0]) {
          Serial.println("TIMER1");
          digitalWrite(selenoid[0], LOW);
          digitalWrite(pompa, LOW);
          delay(durasi[0]);
          digitalWrite(pompa, HIGH);
          digitalWrite(selenoid[0], HIGH);
          t2.disable();
          start[0] = 0;

     }


     start[0] = start[0] + 1000;
}

//timerrak2
void t4Callback() {
  if (start[1] == milis[1]) {
          Serial.println("TIMER2");
          digitalWrite(selenoid[1], LOW);
          digitalWrite(pompa, LOW);
          delay(durasi[1]);
          digitalWrite(pompa, HIGH);
          digitalWrite(selenoid[1], HIGH);
          t4.disable();
          start[1] = 0; 

     }
     start[1] = start[1] + 1000;
}
//timerrak3
void t5Callback() {
        if (start[2] == milis[2]) {
          Serial.println("TIMER3");
          digitalWrite(selenoid[2], LOW);
          digitalWrite(pompa, LOW);
          delay(durasi[2]);
          digitalWrite(pompa, HIGH);
          digitalWrite(selenoid[2], HIGH);
          t5.disable();
          start[2] = 0;

     }


     start[2] = start[2] + 1000;
}

我的问题是如何使每个计时器的延迟不影响另一个计时器的功能。

1 个答案:

答案 0 :(得分:0)

听起来好像(嗯,我不知道nodeMCU,所以回答一般来说...)回调只是在主循环中一个接一个地调用。

如果是这样,自然每个回调延迟都会阻止其他回调。您可以重新启动计时器并退出该函数,而不是通过忙等待(delay函数来延迟),这将取消阻止其他回调。

它看起来类似于以下模式:

#define INTERVAL 1000
#define INTERMEDIATE_DELAY 100

void callback()
{
    static bool isDelay = false;

    if(!isDelay)
    {
        restartTimer(INTERMEDIATE_DELAY);

        // part of code BEFORE delay
    }
    else
    {
        restartTimer(INTERVAL - INTERMEDIATE_DELAY);

        // part of code AFTER delay
    }
    isDelay = !isDelay;
}

在执行代码之前重新启动计时器不会将执行时间添加到间隔中,因此您可以获得更高的精度...

旁注:如注释中所述,避免代码重复:

void callbackHandler(unsigned int index)
{
    Serial.print("rak ");
    Serial.print(index + 1);
    Serial.println(millis[index];
    {
        //logselenoid[2 * index] = logselenoid[2 * index] + 1;
        // simpler:
        ++logselenoid[2 * index];
    }
}

// just a shortened sample, add further parameters as needed

void t2Callback()
{
    callbackHandler(0, t2); // tx as additional parameter?
}

使用此中间功能,要执行的代码仅存在一次(除非您使其内联),并通过附加的函数调用购买。模板函数不是内联中间函数,而是更优雅的方法:

template <unsigned int Index, WhatEver& Tx>
//                            ^^^^^^^^^ can be done since one of the
//                                      recent standards, C++14 or 17(?)
void callbackHandler()
{
    // just as the handler above
}