user52802: I am desperate need of help with my code. It is meant to be a biology project (a pcr machine) and I struggle with inplementing a time tracker. Everytime the cyclus goes to a function, I need it to save that exact time, and then lt it run for a certain amount of time (this variable is given in a parameter). So help is really really appreciated.
//variabelen

#include <Adafruit_MAX31855.h>

int maxSO =  4;
int maxCS = 5;
int maxSCK = 6;

Adafruit_MAX31855 thermocouple(maxSCK, maxCS, maxSO);

int fan = 9; //connected to transistor base  
int temp;
int tempMin = 18;   //variable to check if the thermocouple is connected
int tempMax = 100;   //never exceed this temperature
int fanSpeed;
int RelayP = 3; //still got to check if it is 3 or 4
int cyclusamount = 3; //still got to add a button

//cyclussen op één rij
float DENTEMP = 94;  
float ANTEMP = 62;
float EXTEMP = 72;

//tijden op een rij
unsigned int INITDENTIME = 53000;
unsigned int DENTIME = 33000;
unsigned int ANTIME = 33000;
unsigned int EXTIME = 33000;
unsigned int ENDEXTIME = 42000;

unsigned long timer1 = 0;
unsigned long timer2 = 0;
double temp;
double MaxTempIncrease = 2;

//int cycles = 0;
int phase = 0;
int a = 0;
int g = -1;
int phaseOfCyclus = 0;
int timesArray[] = [33000, 33000, 33000];
int tempsArray[] = [94, 62, 72];
int cycluscounter = 0;

const unsigned long startTime;
unsigned long startMillis;  

void setup() {
  Serial.begin(9600);
  delay(500);
  pinMode(fan, OUTPUT); 
  digitalWrite(fan, LOW);
  pinMode(RelayP, OUTPUT);
  digitalWrite(RelayP, LOW);
  delay(5500); 
}

void loop() {
  //eerst is er een delay, na de delay zal a springen op a=1
if(a == 0) {
    delay(1000);
    a++;
  }

//wanneer a=1 geldt dan zal de temperatuur stijgen naar 94 graden, wanneer dit is bereikt wordt  a=2 en phaseOfCyclus=1
else if(a == 1){
     raiseTemp(DENTEMP);
  }

//wanneer a=2 geldt dan zal de temperatuur stabiel worden gehouden (dus 94 graden) voor de initiatie-stap duur, dat is ongeveer rond de 4minuten
//wanneer deze tijd is verstreken dan wordt a=3 (en phaseOfCyclus=1 (nog steeds))
else if(a == 2) {
    holdTemp(DENTEMP, INITDENTIME);
  }

else if(a == 3) {

//De eerste fase van één cyclus in de PCR machine begint met 94 graden voor 30 seconden.
//de functie raiseTemp heeft 1 parameter en die wordt verkregen door het eerste getal uit de tempsArray
//Is dit volbracht, dan wordt phaseOfCyclus=2
if(phaseOfCycles = 1) {
  raiseTemp(tempsArray[1];
}

//de temperatuur wordt dan weer stabiel gehouden, de twee parameters geven de tijdsduur en de temperatuur van de fase waarin de cyclus van de pcr machine zich bevind
//is dit volbracht en was phaseOfCyclus=2, dan wordt phaseofcyclus=3
else if (phaseOfCyclus = 2) {
  holdTemp(tempsArray[1], timesArray[1]; //hoort 0

}

//dan zal de temperatuur afkoelen tot een bepaalde temperatuur, als dit is volbracht -> als phaseofcyclus=3 dan wordt phaseofcyclus=4
else if (phaseOfCyclus = 3) {
  cooldown(tempsArray[2]; //hoort 1
}

//de temperatuur wordt weer stabiel gehouden, voor 30 seconden en als phaseofcyclus is 4 dan phaseofcyclus=5
else if (phaseOfCyclus = 4) {
  holdTemp(tempsArray[2], timesArray[2]; //hoort 1

}

//dan zal de temperatuur verder afkoelen tot een bepaalde temperatuur, als dit is volbracht -> als phaseofcyclus=5 dan wordt phaseofcyclus=6
else if (phaseOfCyclus = 5) {
  cooldown(tempsArray[3]; //hoort 2
}

//de temperatuur wordt weer stabiel gehouden, voor 30 seconden en als phaseofcyclus is 5 dan phaseofcyclus=6
//bij één hele cyclus zal holdtemp 3x worden aangeroepen, elke keer als dit dus 3x gebeurt dan zal de cyclusamount +1 in hoeveelheid toenemen
//als de cyclusamount niet gelijk is aan het aantal cyclussen dat iemand wil uitvoeren dan zal -> phaseofCyclus = 1
//is dit wel groter of gelijk aan het aantal cyclussen dat iemand wil uitvoeren dan zal -> a =4  (als a = 3 en phaseofcyclus = 6)
else if (phaseOfCyclus = 6) {
  holdTemp(tempsArray[3], timesArray[3]; //hoort 2
}}

//dan zal de extending temperatuur stabiel worden gehouden en als de tijd is verstreken dan zal a = 5 worden en zal de lcd zeggen dat de cyclus is volbracht
else if (a == 4) {
   holdTemp(EXTEMP, 42000);
  }
else if(a == 5) {
  digitalWrite(fan, LOW);
  digitalWrite(RelayP, LOW);
  Serial.println("Cyclus completed");
}
}

void raiseTemp(double y) {
  double prevTemp = thermocouple.readCelsius();
  temp = thermocouple.readCelsius();

if (temp < tempMin) {
   Serial.println("is the thermocouple connected???");
  }

while (temp < y) {
    int waittime = min(650, ((650*(y-temp)))); 
    digitalWrite(RelayP, HIGH);
    delay(waittime);
    digitalWrite(RelayP, LOW);
    temp=thermocouple.readCelsius();

if(temp >= y) {
    if(phaseOfCyclus = 1) {
      phaseOfCyclus = 2;
      a = 3;
    }
    else if (phaseOfCyclus = 0){
      phaseOfCyclus++;
      a = 2;
    }
      // break; //wat doet dit precies?
    }

if((y-temp) < 1) {
      do  {
        prevTemp = temp;
        delay(250); 
        temp = thermocouple.readCelsius();
      }      
      while(temp > prevTemp);
    }

if(temp >= TempMax)
     break;

else {   
      prevTemp = temp;
   }

   while ((temp-prevTemp) >= MaxHeatIncrease) {
     prevTemp = temp;
     Serial.print("HEATING UP TOO FAST! ");
     delay(1000);
     temp = thermocouple.readCelsius();
     Serial.println(temp);
   }

   while(temp >= y) {
     delay(1000);
     Serial.print("DANGER DANGER DANGER");
     Serial.println(temp);
   }
}}

void holdTemp(double phaseTemp, double duration) {
  g++;
  z = phaseTemp;

  startMillis = millis(); 
  unsigned long whatitneedstobe = startTime + duration;
  //startMillis < whatitneedstobe

  if(timegone < duration){
        temp = thermocouple.readCelsius();
      if(temp < z) {  
        digitalWrite(RelayP, HIGH);
        delay(90);
        digitalWrite(RelayP, LOW);
      } 
      else if (temp > (z+0.5)) {
        digitalWrite(fan, HIGH);
        delay(90);
        digitalWrite(fan, LOW);
        //or
        //fanSpeed = map(temp, tempMin, y, 32, 255); 
        //analogWrite(fan, fanSpeed);
      }
     delay(210);
     timegone = millis() - startTime; 
     }

  else {
    if(phaseOfClus = 1) {
      a = 3;
    }
    else if(phaseOfCyclus = 2) {
      phaseOfCyclus = 3;
    }
    else if(phaseOfCyclus = 4) {
      phaseOfCyclus = 5;
    }
    else if(g == 3) {
    g = 0;
    cycluscounter++;
    if(cycluscounter < cyclusamount) {
      a = 3;
      phaseOfCyclus = 1;
    }
    else(cycluscounter >= cyclusamount {
      a = 4;
    }
  }
  else if(a = 4) {
    a = 5;
  }
    }
  }

void cooldown(double c) {
  unsigned long startTime = millis(); 
while ((temp = thermocouple.readCelsius()) > (minTemp+0.75)) {
    digitalWrite(fanPin, HIGH);
    delay(300);
   } 
   digitalWrite(fanPin, LOW);
if(thermocouple.readCelsius() == c){
  if(phaseOfCyclus = 3) {
    phaseOfCyclus = 4;
  }
  else if(phaseOfCyclus = 5) {
    phaseOfCyclus = 6;
  }
}
}


user7508: If you want the holdTemp() function to run for a specified duration,
you can write it like this:
void holdTemp(double phaseTemp, unsigned long duration) {
    unsigned long start_time = millis();
    while (millis() - start_time < duration) {
        // whatever...
    }
}

Note that if you use delay() inside the function, the time spent in it
may get longer than the requested duration, by as much as the duration
of the delay.

52802: <p>I am desperate need of help with my code. It is meant to be a biology project (a pcr machine) and I struggle with inplementing a time tracker. Everytime the cyclus goes to a function, I need it to save that exact time, and then lt it run for a certain amount of time (this variable is given in a parameter). So help is really really appreciated.</p>

<pre><code>//variabelen

#include &lt;Adafruit_MAX31855.h&gt;

int maxSO =  4;
int maxCS = 5;
int maxSCK = 6;

Adafruit_MAX31855 thermocouple(maxSCK, maxCS, maxSO);

int fan = 9; //connected to transistor base  
int temp;
int tempMin = 18;   //variable to check if the thermocouple is connected
int tempMax = 100;   //never exceed this temperature
int fanSpeed;
int RelayP = 3; //still got to check if it is 3 or 4
int cyclusamount = 3; //still got to add a button

//cyclussen op één rij
float DENTEMP = 94;  
float ANTEMP = 62;
float EXTEMP = 72;

//tijden op een rij
unsigned int INITDENTIME = 53000;
unsigned int DENTIME = 33000;
unsigned int ANTIME = 33000;
unsigned int EXTIME = 33000;
unsigned int ENDEXTIME = 42000;

unsigned long timer1 = 0;
unsigned long timer2 = 0;
double temp;
double MaxTempIncrease = 2;

//int cycles = 0;
int phase = 0;
int a = 0;
int g = -1;
int phaseOfCyclus = 0;
int timesArray[] = [33000, 33000, 33000];
int tempsArray[] = [94, 62, 72];
int cycluscounter = 0;

const unsigned long startTime;
unsigned long startMillis;  

void setup() {
  Serial.begin(9600);
  delay(500);
  pinMode(fan, OUTPUT); 
  digitalWrite(fan, LOW);
  pinMode(RelayP, OUTPUT);
  digitalWrite(RelayP, LOW);
  delay(5500); 
}

void loop() {
  //eerst is er een delay, na de delay zal a springen op a=1
if(a == 0) {
    delay(1000);
    a++;
  }

//wanneer a=1 geldt dan zal de temperatuur stijgen naar 94 graden, wanneer dit is bereikt wordt  a=2 en phaseOfCyclus=1
else if(a == 1){
     raiseTemp(DENTEMP);
  }

//wanneer a=2 geldt dan zal de temperatuur stabiel worden gehouden (dus 94 graden) voor de initiatie-stap duur, dat is ongeveer rond de 4minuten
//wanneer deze tijd is verstreken dan wordt a=3 (en phaseOfCyclus=1 (nog steeds))
else if(a == 2) {
    holdTemp(DENTEMP, INITDENTIME);
  }

else if(a == 3) {

//De eerste fase van één cyclus in de PCR machine begint met 94 graden voor 30 seconden.
//de functie raiseTemp heeft 1 parameter en die wordt verkregen door het eerste getal uit de tempsArray
//Is dit volbracht, dan wordt phaseOfCyclus=2
if(phaseOfCycles = 1) {
  raiseTemp(tempsArray[1];
}

//de temperatuur wordt dan weer stabiel gehouden, de twee parameters geven de tijdsduur en de temperatuur van de fase waarin de cyclus van de pcr machine zich bevind
//is dit volbracht en was phaseOfCyclus=2, dan wordt phaseofcyclus=3
else if (phaseOfCyclus = 2) {
  holdTemp(tempsArray[1], timesArray[1]; //hoort 0

}

//dan zal de temperatuur afkoelen tot een bepaalde temperatuur, als dit is volbracht -&gt; als phaseofcyclus=3 dan wordt phaseofcyclus=4
else if (phaseOfCyclus = 3) {
  cooldown(tempsArray[2]; //hoort 1
}

//de temperatuur wordt weer stabiel gehouden, voor 30 seconden en als phaseofcyclus is 4 dan phaseofcyclus=5
else if (phaseOfCyclus = 4) {
  holdTemp(tempsArray[2], timesArray[2]; //hoort 1

}

//dan zal de temperatuur verder afkoelen tot een bepaalde temperatuur, als dit is volbracht -&gt; als phaseofcyclus=5 dan wordt phaseofcyclus=6
else if (phaseOfCyclus = 5) {
  cooldown(tempsArray[3]; //hoort 2
}

//de temperatuur wordt weer stabiel gehouden, voor 30 seconden en als phaseofcyclus is 5 dan phaseofcyclus=6
//bij één hele cyclus zal holdtemp 3x worden aangeroepen, elke keer als dit dus 3x gebeurt dan zal de cyclusamount +1 in hoeveelheid toenemen
//als de cyclusamount niet gelijk is aan het aantal cyclussen dat iemand wil uitvoeren dan zal -&gt; phaseofCyclus = 1
//is dit wel groter of gelijk aan het aantal cyclussen dat iemand wil uitvoeren dan zal -&gt; a =4  (als a = 3 en phaseofcyclus = 6)
else if (phaseOfCyclus = 6) {
  holdTemp(tempsArray[3], timesArray[3]; //hoort 2
}}

//dan zal de extending temperatuur stabiel worden gehouden en als de tijd is verstreken dan zal a = 5 worden en zal de lcd zeggen dat de cyclus is volbracht
else if (a == 4) {
   holdTemp(EXTEMP, 42000);
  }
else if(a == 5) {
  digitalWrite(fan, LOW);
  digitalWrite(RelayP, LOW);
  Serial.println("Cyclus completed");
}
}

void raiseTemp(double y) {
  double prevTemp = thermocouple.readCelsius();
  temp = thermocouple.readCelsius();

if (temp &lt; tempMin) {
   Serial.println("is the thermocouple connected???");
  }

while (temp &lt; y) {
    int waittime = min(650, ((650*(y-temp)))); 
    digitalWrite(RelayP, HIGH);
    delay(waittime);
    digitalWrite(RelayP, LOW);
    temp=thermocouple.readCelsius();

if(temp &gt;= y) {
    if(phaseOfCyclus = 1) {
      phaseOfCyclus = 2;
      a = 3;
    }
    else if (phaseOfCyclus = 0){
      phaseOfCyclus++;
      a = 2;
    }
      // break; //wat doet dit precies?
    }

if((y-temp) &lt; 1) {
      do  {
        prevTemp = temp;
        delay(250); 
        temp = thermocouple.readCelsius();
      }      
      while(temp &gt; prevTemp);
    }

if(temp &gt;= TempMax)
     break;

else {   
      prevTemp = temp;
   }

   while ((temp-prevTemp) &gt;= MaxHeatIncrease) {
     prevTemp = temp;
     Serial.print("HEATING UP TOO FAST! ");
     delay(1000);
     temp = thermocouple.readCelsius();
     Serial.println(temp);
   }

   while(temp &gt;= y) {
     delay(1000);
     Serial.print("DANGER DANGER DANGER");
     Serial.println(temp);
   }
}}

void holdTemp(double phaseTemp, double duration) {
  g++;
  z = phaseTemp;

  startMillis = millis(); 
  unsigned long whatitneedstobe = startTime + duration;
  //startMillis &lt; whatitneedstobe

  if(timegone &lt; duration){
        temp = thermocouple.readCelsius();
      if(temp &lt; z) {  
        digitalWrite(RelayP, HIGH);
        delay(90);
        digitalWrite(RelayP, LOW);
      } 
      else if (temp &gt; (z+0.5)) {
        digitalWrite(fan, HIGH);
        delay(90);
        digitalWrite(fan, LOW);
        //or
        //fanSpeed = map(temp, tempMin, y, 32, 255); 
        //analogWrite(fan, fanSpeed);
      }
     delay(210);
     timegone = millis() - startTime; 
     }

  else {
    if(phaseOfClus = 1) {
      a = 3;
    }
    else if(phaseOfCyclus = 2) {
      phaseOfCyclus = 3;
    }
    else if(phaseOfCyclus = 4) {
      phaseOfCyclus = 5;
    }
    else if(g == 3) {
    g = 0;
    cycluscounter++;
    if(cycluscounter &lt; cyclusamount) {
      a = 3;
      phaseOfCyclus = 1;
    }
    else(cycluscounter &gt;= cyclusamount {
      a = 4;
    }
  }
  else if(a = 4) {
    a = 5;
  }
    }
  }

void cooldown(double c) {
  unsigned long startTime = millis(); 
while ((temp = thermocouple.readCelsius()) &gt; (minTemp+0.75)) {
    digitalWrite(fanPin, HIGH);
    delay(300);
   } 
   digitalWrite(fanPin, LOW);
if(thermocouple.readCelsius() == c){
  if(phaseOfCyclus = 3) {
    phaseOfCyclus = 4;
  }
  else if(phaseOfCyclus = 5) {
    phaseOfCyclus = 6;
  }
}
}
</code></pre>
 7508: <p>If you want the <code>holdTemp()</code> function to run for a specified duration,
you can write it like this:</p>

<pre><code>void holdTemp(double phaseTemp, unsigned long duration) {
    unsigned long start_time = millis();
    while (millis() - start_time &lt; duration) {
        // whatever...
    }
}
</code></pre>

<p>Note that if you use <code>delay()</code> inside the function, the time spent in it
may get longer than the requested duration, by as much as the duration
of the delay.</p>
