我为 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/