c - Arduino millis不工作

标签 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 保持运行状态以进行检查(如果写入其中)。 抱歉我的英语不好

最佳答案

所以您想留在函数 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");
    }
  }
}

但是我的建议仍然是一样的:不要阻塞函数内部的执行,而是使用有限状态机;它更加灵活,更容易理解、实现和编辑。

关于c - Arduino millis不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24800937/

相关文章:

c - Linux设备描述符读取/64,错误18

function - 使用Arduino淡入多个LED

c++ - 伺服驱动程序代码使伺服行为异常

javascript - arduino + 串口 + chrome + 发送 - 无法通过串口发送数据

ubuntu - 从 ubuntu 中的 C++ 代码向 arduino 发送命令

c - 稍微复杂的线程同步

c - 在 C 中处理 POSIX - 错误消息 : Segmentation Fault (core dumped)

c - 需要接受用户输入并在最后全部输出

c - 在 Linux 上使用套接字发出 https 请求

arduino - 如何在 Arduino 中获取 RFID 的 UID?