Arduino millis不起作用

时间:2014-07-17 10:21:16

标签: c arduino

我为Arduino编写了一个庞大的程序。 我已经单独测试了每个函数,除了我需要millis()的函数外,一切都很顺利。

现在携带我遇到任何困难的代码块。

变量T包含以秒为单位的数字乘以1000

void onResistance(){
  Input = sensors.getTempC(tempSensor);
  sensors.requestTemperatures(); // prime the pump for the next one - but don't wait

  digitalWrite(RelayPin, HIGH);
  //more code
  Input = sensors.getTempC(tempSensor);
  sensors.requestTemperatures(); // prime the pump for the next one - but don't wait

  if(Input<Setpoint){ onResistance(); }
  else{ digitalWrite(RelayPin, LOW); istru++; return ; }

  return ;
}

void statTemp(){
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > ttemp){

      previousMillis = currentMillis;

      Input = sensors.getTempC(tempSensor);
      sensors.requestTemperatures();
      lcd.setCursor(0,1);
      lcd.print(F("T. Att.:"));
      lcd.print(Input);
      lcd.write(1);
      lcd.print(F("C"));

      if (Input<Setpoint) {
        digitalWrite(RelayPin, HIGH);
        statTemp();
      } else if(Input>Setpoint || Input == Setpoint) {
        digitalWrite(RelayPin, LOW);
        statTemp(); }

    } else if(currentMillis - previousMillis < ttemp) { playShortBeep(); istru++; return; }
    return ;
}

void startFan(){
  Input = sensors.getTempC(tempSensor);
  sensors.requestTemperatures(); // prime the pump for the next one - but don't wait

  digitalWrite(FAN_PIN, HIGH);
  //more code
  Input = sensors.getTempC(tempSensor);
  sensors.requestTemperatures(); // prime the pump for the next one - but don't wait

  if(Input>Tm){ startFan(); }
  else{ digitalWrite(FAN_PIN, LOW); istru++; return ; }

  return ;
}

void controll(){


  if(!start)
    return ;

  if(start){
    if(istru==0){
      onResistance();
    }
    if(istru==1){
      ttemp = (T * 1000) + millis() ;
      statTemp();
    }
    if(istru==2){
      startFan();
    }
    if(istru==3){
      start =false;
      opState = OFF;
      playShortBeep();
      playShortBeep();
      playShortBeep();
      istru=0;
    }
  }
  delay(100);
  return ;
} 

我需要时间T函数statTemp如果写入则继续运行进行检查。 抱歉我的英文不好

1 个答案:

答案 0 :(得分:0)

所以你想留在函数statTemp()直到时间T过去了? 那么类似的东西可能会起作用

void statTemp(){
    unsigned long currentMillis;
    unsigned long enteringMillis = millis();
    while (((currentMillis = millis()) -enteringMillis) < T)
    {
        if(currentMillis - previousMillis > ttemp){
        etc etc etc....
    }
    return ;
}

注意可能。我不知道millis是在每个定时器中断还是仅在循环函数中更新;在后一种情况下,你将永远陷入这个功能。

因此我建议你不要这样做,而是考虑另一种方法:处理要执行的功能的FSM。这是一种更清洁的方式,更容易出错。

再见

编辑: 这是一个完整的工作示例。在此示例中,函数myfunc执行10秒;在此期间,电路板执行一些操作(在此示例中为串行输出)。当10秒过去时,程序继续,从而重复循环功能。

unsigned long previousTime;
void myfunc();

void setup() {                
  Serial.begin(9600);     
}

void loop() {
  Serial.println("I'm in the loop function");
  myfunc();
}

void myfunc()
{
  unsigned long currentTime;
  unsigned long enteringTime = millis();
  while(((currentTime = millis()) - enteringTime) < 10000)
  {
    if(currentTime - previousTime > 1000)
    {
      previousTime = currentTime;
      Serial.println("I'm in the custom function");
    }
  }
}

然而我的建议仍然是相同的:不是阻止函数内部的执行,而是使用有限状态机;它更灵活,更易于理解,实施和编辑。