Как отслеживать время, прошедшее в этом коде? (Машина для ПЦР)

Я отчаянно нуждаюсь в помощи с моим кодом. Это должен быть биологический проект (машина для ПЦР), и я борюсь с внедрением системы отслеживания времени. Каждый раз, когда цикл переходит к функции, мне нужно, чтобы он сохранял это точное время, а затем выполнял его в течение определенного промежутка времени (эта переменная указана в параметре). Так что помощь действительно очень ценится.

//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;
  }
}
}

, 👍0

Обсуждение

Сейчас я вошел в систему, но не могу изменить то, что я вложил в вопрос. Я имел в виду: я отчаянно нуждаюсь в помощи с моим кодом. Это проект по биологии/электронике (ПЦР-машина), и я борюсь с внедрением тайм-трекера в код. Я хочу, чтобы каждый раз, когда cyclus переходит к holdtemp (), время, когда он достигает кода, сохраняется, а затем позволяет коду работать в течение определенного количества времени (это определенное количество времени дает параметр). Помощь и советы очень ценятся., @f.pythonlover

Пожалуйста, запросите слияние ваших учетных записей. Это даст вам доступ к вашему первоначальному сообщению. См.: https://stackoverflow.com/help/merging-accounts, @Majenko

Строки типа holdTemp(tempsArray[1], timesArray[1]; //hoort 0 имеют плохой синтаксис/отсутствующие круглые скобки. /// В holdTemp () в чем разница/намерение между startMillis и startTime?, @Dave X


1 ответ


2

Если вы хотите, чтобы функция holdTemp() выполнялась в течение определенного времени, вы можете написать ее следующим образом:

void holdTemp(double phaseTemp, unsigned long duration) {
    unsigned long start_time = millis();
    while (millis() - start_time < duration) {
        // неважно...
    }
}

Обратите внимание, что если вы используете функцию delay() внутри функции, время, проведенное в ней , может оказаться больше, чем запрошенная продолжительность, на столько же, сколько продолжительность задержки.

,