1

所以我正在尝试在 arduino 中编写一个程序,该程序执行一个任务 2 分钟,然后执行另一个任务 5 分钟。第一个,然后另一个循环,直到满足不同的条件。

我一直在尝试使用 if 语句和 while 循环来做到这一点,但我在我认为的时间部分迷路了

//Pneumatic feed system

    double minute = 1000*60;
    double vibTime = 2 * minute;   //2 mins
    //double vibTime = 5000;
    double execTime = millis();
    double waitTime = 5 * minute; //time waits between vibrating 
    //double waitTime = 10000;

void DoPneuFeed() {
    //Serial.print("Delta:");
    //Serial.println(millis()-execTime);

    if(Temp_Data[T_9] < 500)
    {

          if(execTime + vibTime < millis())
          {
              //turn on vibration for 2 mins
              execTime = millis();
              Serial.println("VIBRATING");
          }

          if(execTime + waitTime < millis())
          {
                //turn off vibration for 5 mins
                execTime = millis();
                Serial.println("WAITING");
          }

}

    if(Temp_Data[T_9] > 500)
    {
          relayOff(3);
          relayOff(7);

    }
}

void PneuFeed()
{
  if(execTime + vibTime > millis())
  {
    //air pressure open
    relayOn(3);
    //vibrator on
    relayOn(7); 
  }
  else if(execTime + waitTime > millis())
  {
    relayOff(3);
    relayOff(7);
  }
}

我想打开振动模式2分钟,然后关闭5分钟。只要 Temp_Data(T_9) < 500。如果它大于 500,它应该保持关闭。

4

1 回答 1

4

无需详细说明您的代码(因为我无法构建它来测试。)我只有一个快速建议:

与其使用一系列if-then-else(或其变体),不如考虑使用状态机。实现通常包括使用switch()内部while(expression){...}循环。以下是一个非常简单的示例,说明您如何能够在此构造中执行所需的步骤:(
注意这是用于说明的 C 和伪代码的混合。它接近可编译,但包含一些未定义的项目.)

typedef enum {
    START,      
    SET_VIB,
    CHECK_TEMP,
    GET_TIME,
    CLEANUP,
    SLEEP,
    MAX_STATE
}STATE;

enum {
    IN_WORK,
    FAILED,
    SUCCESS
};

enum {// durations in minutes
    MIN_2,
    MIN_5,
    MIN_10,
    MAX_DUR// change/add durations as profile needs
};
const int dur[MAX_DUR]  = {120, 300, 600};

int RunProcess(STATE state);

int main(void)
{
    STATE state = START;

    RunProcess(state);

    return 0;
}

int RunProcess(STATE state)//Add arguments here for temperature, 
{                          //Sleep duration, Cycles, etc. so they are not hardcoded.
    int status;
    time_t elapsed = 0; //s
    BOOL running = TRUE;
    double temp, setpoint;
    int duration;
    time_t someMsValue;


    while(running)
    switch (state) {
        case START:
            //Power to oven
            //Power to vibe
            //initialize state and status variables
            duration = dur[MIN_2];
            state = SLEEP;
            status = IN_WORK;
            break;
        case SET_VIB:
            //test and control vibe
            if(duration == dur[MIN_2]) 
            {
                duration = dur[MIN_5];
                //& turn off vibe
            }
            else
            {
                duration = dur[MIN_2];
                //& turn on vibe
            }
            //init elapsed
            elapsed = 0;           
            status = IN_WORK;            
            state = CHECK_TEMP;
            break;
        case CHECK_TEMP:
            //read temperature
            if(temp < setpoint) 
            {
                state = SLEEP;
                status = IN_WORK;
            }
            else 
            {
                state = CLEANUP;
                status = SUCCESS;            
            }
            break;
        case GET_TIME:
            elapsed = getTime();
            if(elapsed > duration) state = SET_VIB;
            else state = SLEEP;
            status = IN_WORK;            
            break;
        case CLEANUP:
            //turn off heat
            //turn off vibe
            running = FALSE;
            break;
        case SLEEP:
            Sleep(someMsValue);
            state = GET_TIME;
            status = IN_WORK;
            break;
        default:
            // called with incorrect state value
            // error message and exit
            status = FAILED;
            state = CLEANUP;
            break;
    }
    return status;
}

对此插图的改进建议: 扩展此代码以读入“配置文件”文件。它可能包括诸如温度曲线、振动曲线、循环次数等过程的典型参数值等内容。有了这些信息,这里用作说明的所有硬编码都可以替换为运行时可配置参数,允许系统使用许多不同的配置文件,而不必每次都重新编译可执行文件。

另一个状态机示例

于 2019-10-02T18:21:42.447 回答