Как отслеживать время, прошедшее в этом коде? (Машина для ПЦР)
Я отчаянно нуждаюсь в помощи с моим кодом. Это должен быть биологический проект (машина для ПЦР), и я борюсь с внедрением системы отслеживания времени. Каждый раз, когда цикл переходит к функции, мне нужно, чтобы он сохранял это точное время, а затем выполнял его в течение определенного промежутка времени (эта переменная указана в параметре). Так что помощь действительно очень ценится.
//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;
}
}
}
@user52802, 👍0
Обсуждение1 ответ
▲ 2
Если вы хотите,
чтобы функция holdTemp() выполнялась в течение определенного времени,
вы можете написать ее следующим образом:
void holdTemp(double phaseTemp, unsigned long duration) {
unsigned long start_time = millis();
while (millis() - start_time < duration) {
// неважно...
}
}
Обратите внимание, что если вы используете функцию delay()
внутри функции, время, проведенное в ней
, может оказаться больше, чем запрошенная продолжительность, на столько же, сколько продолжительность
задержки.
,
@Edgar Bonet
Смотрите также:
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Сейчас я вошел в систему, но не могу изменить то, что я вложил в вопрос. Я имел в виду: я отчаянно нуждаюсь в помощи с моим кодом. Это проект по биологии/электронике (ПЦР-машина), и я борюсь с внедрением тайм-трекера в код. Я хочу, чтобы каждый раз, когда cyclus переходит к holdtemp (), время, когда он достигает кода, сохраняется, а затем позволяет коду работать в течение определенного количества времени (это определенное количество времени дает параметр). Помощь и советы очень ценятся., @f.pythonlover
Пожалуйста, запросите слияние ваших учетных записей. Это даст вам доступ к вашему первоначальному сообщению. См.: https://stackoverflow.com/help/merging-accounts, @Majenko
Строки типа
holdTemp(tempsArray[1], timesArray[1]; //hoort 0
имеют плохой синтаксис/отсутствующие круглые скобки. /// ВholdTemp ()
в чем разница/намерение междуstartMillis
иstartTime
?, @Dave X