A livello concettuale sono d'accordo con te, ma il problema è inserire questo nel codice.
Infatti sono costretto a contare il tempo all'interno di diversi cicli concatenati.
Provo ad essere più chiaro. Il programma che vorrei scrivere lo utilizzerei per la produzione domestica della Birra. A livello pratico è sufficiente sapere che la produzione si articola in una prima parte in cui ci sono diversi step di infusione dei malti a diverse temperature (ad esempio STEP 1: 65°C per 60min, STEP2: 72°C per 45min, STEP3: 78°C per 15min), ed una seconda parte di bollitura con i luppoli (esempio: 120min con un luppolo + 25min con un secondo).
Concentrandoci per ora solo sulla prima parte, e sapendo che ogni ricetta prevede un numero di step diverso, per prima cosa inserisco da tastiera il numero di step e lo salvo in una variabile, ed in base a questa con un ciclo while(indice<numero step)
inserisco tempi e temperature di ognuno in un vettore.
(chiaramente ad ogni passaggio incremento una variabile flag per eseguire il codice "a stadi")
A questo punto in un altro ciclo while(altro indice<numero step)
devo far partire il timer (e visualizzarlo a schermo con il codice postato) e finchè il tempo trascorso DA QUEL MOMENTO è inferiore al tempo previsto per lo step, controllo con un relè collegato ad un'elettrovalvola sul fornellone a gas le temperature previste per quello step. Raggiunto il tempo aumento l'indice e passo allo step successivo.
In pratica, ad un certo punto del codice mi trovo qualcosa del genere:
if(flag==...){
while(indice < numero step){
INIZIA A MISURARE IL TEMPO
CONTROLLA LA TEMPERATURA DELLO step[indice]
if(tempo >= tempo dello step[indice]){
indice++;
}
}
}
In questa situazione come posso comportarmi per misurare il tempo?
Posto parte del codice reale, che provo a rendere comprensibile aggiungendo i commenti. (da immaginare inserito dopo un gran numero di cicli if(flag==...) per l'inserimento dei dati iniziali)
Ci tengo a sottolineare che il codice funziona: visualizzo a schermo le informazioni volute: numero di step, temperatura attuale, temperatura target, tempo target e tempo attuale, che però parte dall'accensione e non da questo if. Inoltre settando le temperature poco oltre quelle ambiente e toccando i sensori ho verificato che anche i relè si aprono e chiudono correttamente.
Quindi resta solo da far partire da zero il tempo.
Grazie dell'aiuto.
if (flag == 1001) { // utilizzo 1001 perchè da un certo punto del codice per passare allo step successivo dichiaro flag=1001;
while (n <= step_num) { // ripeto il codice per ogni step della ricetta
for (int i = 0; i < numberOfDevices; i++) { // sono costretto a "lavorare" all'interno di un ciclo for perchè i sensori di temperatura sono 2 e devo controllare contemporaneamente entrambi, l'infusione con le temperatire inserite a un altra pentola a temperatura costante
sensors.requestTemperatures();
temperature_sensori[i] = sensors.getTempCByIndex(i); // nelle righe successive in base alle temperature lette comando la fiamma con l'apertura e chiusura di relè
if (temperature_sensori[0] < variabili_mesh[ii - 1] * 0.98) {
digitalWrite(rele_mesh, HIGH);
}
if (temperature_sensori[0] > variabili_mesh[ii - 1]) {
digitalWrite(rele_mesh, LOW);
}
if (temperature_sensori[1] < sparge * 0.98) {
digitalWrite(rele_sparge, HIGH);
}
if (temperature_sensori[1] > sparge) {
digitalWrite(rele_sparge, LOW);
}
lcd.setCursor(0, 0); // nelle molte righe successive visualizzo sull'lcd lo step attuale, la temperatura ed il tempo target, la temperatura ed il tempo attuale
lcd.print(" - MESH -- STEP ");
lcd.print(n);
lcd.print(" -");
float temperatura_step = variabili_mesh[ii - 1];
int tempo_step = variabili_mesh[ii];
lcd.setCursor(0, 2);
lcd.print(temperatura_step);
lcd.print(" ");
lcd.print((char)223);
lcd.print("C");
if (tempo_step < 10) {
lcd.setCursor(12, 2);
lcd.print(tempo_step);
lcd.print(":00");
lcd.print(" min");
}
if (tempo_step < 100 && tempo_step >= 10) {
lcd.setCursor(11, 2);
lcd.print(tempo_step);
lcd.print(":00");
lcd.print(" min");
}
if (tempo_step >= 100) {
lcd.setCursor(10, 2);
lcd.print(tempo_step);
lcd.print(":00");
lcd.print(" min");
}
contatempo = (millis()) / 1000; // QUI C'E' IL PROBLEMA! NON SO COME CONTARE IL TEMPO! FACENDO COSI' PARTE DALL'ACCENSIONE
ContaTempo();
m = int(m) + int(h) * 60;
if (m < 10) { // le righe successive servono a visualizzare il tempo sul display
lcd.setCursor(12, 3);
lcd.print(int(m));
lcd.print(":");
}
if (m < 100 && m >= 10) {
lcd.setCursor(11, 3);
lcd.print(int(m));
lcd.print(":");
}
if (m >= 100) {
lcd.setCursor(10, 3);
lcd.print(int(m));
lcd.print(":");
}
if (s < 10) {
lcd.setCursor(14, 3);
lcd.print("0");
lcd.print(int(s));
}
if (s >= 10) {
lcd.setCursor(14, 3);
lcd.print(int(s));
}
lcd.setCursor(17, 3);
lcd.print("min");
lcd.setCursor(0, 3);
lcd.print(temperature_sensori[0]); // qui visualizzo la temperatura letta dal sensore
lcd.print(" ");
lcd.print((char)223);
lcd.print("C");
tastobattuto = keypad.getKey();
if (tastobattuto == '*') { // questa parte si può ignorare, serve solo per visualizzare la temperatura della seconda pentola
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("- SPARGE -");
float temperatura_sparge = sparge;
lcd.setCursor(1, 2);
lcd.print(temperatura_sparge);
lcd.print(" ");
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(11, 2);
lcd.print(temperature_sensori[1]);
lcd.print(" ");
lcd.print((char)223);
lcd.print("C");
delay(5000);
lcd.clear();
}
}
// if( ho raggiunto il tempo del primo step){ // questa parte di codice deve essere ancora scritta, ma non è difficile
// ii=ii+2; // in pratica, raggiuto il tempo previsto per il primo step passo al successivo nel while
// n++;
// }
// if (ho raggiunto l'ultimo step){ // raggiunto l'ultimo step flag++ così esco dall'if principale
// flag++;
// }
}
}