bloccare una sequenza di loop

ciao a tutti mi sto costruendo una centralina per l'irrigazione gestita da arduino, ho visto che sul forum ci sono molte discussioni in merito che mi sono state molto utili. Ho scritto una parte di codice che imposta un ciclo di irrigazione temporizzato tra i vari relè con un certo tempo, però mi sono reso conto che se volessi interrompere il ciclo in un momento qualsiasi momento non riesco, premetto che attualmente gestisco i comandi da monitor seriale attraverso la tastiera vi metto qui di seguito la parte di codice interessata.
GRAZIE

// *************inizio PROGRAMMA 2 ORE A ROTAZIONE ********************//
   if (rx == '2') 
   { lcd.setCursor(0, 1); lcd.print("PR. 2 h ON"); Serial.println("PROGRAMMA 2 ORE A ROTAZIONE ATTIVO");
     digitalWrite(pompa, LOW);
     {// 1° turno
      digitalWrite(v1, LOW); //apertura valvola 1
      digitalWrite(v2, LOW); //apertura valvola 2
      delay(7200000);          //tempo di irrigazione 2 ore
      
      // 2° turno
      digitalWrite(v3, LOW); //apertura valvola 3
      digitalWrite(v4, LOW); //apertura valvola 4
      {delay(10000);digitalWrite(v1, HIGH); digitalWrite(v2, HIGH);}; // ritardo di 10 sec chiusura valvole 1° turno
      delay(7200000); //tempo di irrigazione 2 ore
      
      // 3° turno
      digitalWrite(v5, LOW);  //apertura valvola 5
      digitalWrite(v6, LOW);  //apertura valvola 6
      digitalWrite(v7, LOW);  //apertura valvola 7
      {delay(10000);digitalWrite(v3, HIGH); digitalWrite(v4, HIGH);}; // ritardo di 10 sec chiusura valvole 2° turno
      delay(7200000); //tempo di irrigazione 2 ore
     
      // spegni tutto
      digitalWrite(pompa, HIGH); {delay(10000);digitalWrite(v5, HIGH); digitalWrite(v6, HIGH); digitalWrite(v7, HIGH);}
     }
     // scrivi sul monitor che il programma è stato completato
     lcd.setCursor(0, 1); lcd.print("PR. 2 h COMPL."); Serial.println("PROGRAMMA 2 ORE COMPLETO");
   }  
   // ************* fine PROGRAMMA 2 ORE A ROTAZIONE ********************//

>spe_: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie. :slight_smile:

Guglielmo

Le temporizzazioni non li devi fare con delay() ma con un codice non bloccante con millis().
vedi esempio blink without delay
Ciao Uwe

E perché non ci riesci? Basta aggiungere un pulsante dal quale interrompere ip ciclo, e fare si che esso interrompa l'alimentazione di Arduino. É soluzione brutta, ma é soluzione

Silente:
E perché non ci riesci? Basta aggiungere un pulsante dal quale interrompere ip ciclo, e fare si che esso interrompa l'alimentazione di Arduino. É soluzione brutta, ma é soluzione

Non solo è brutta ma non è una soluzione, che senso ha un suggerimento del genere? mha...

>Silente: … per favore, rispondi quando hai soluzioni “sensate” e non sciochezze come questa! Ovvio che spegnere Arduino ferma qualsiasi cosa … ma NON è certo la risposta da dare !!! >:(

>spe_: sto sempre aspettando la sistemazione del codice come richiesto nel mio post #1. Grazie.

Guglielmo

Se ho interpretato bene il tuo listato, questo è lo schema di funzionamento che vuoi impostare tu.

a----2 ore----b-c <-10 s
|             b-|--2 ore----d-e <- 10 s
|             | |           d-|--2 ore----f
a--valvola 1--b-c           | |           | 
a--valvola 2--b-c           | |           | 
              b--valvola 3--d-e           |
              b--valvola 4--d-e           |
                            d--valvola 5--f
                            d--valvola 6--f
                            d--valvola 7--f

Dove a-f sono marche temporali così definite:
-a = inizio processo, apertura valvole 1 e 2
-b = apertura valvole 3 e 4
-c = chiusura valvole 1 e 2
-d = apertura valvole 5, 6 e 7
-e = chiusura valvole 3 e 4
-f = chiusura valvole 5, 6 e 7

Come ti è stato giustamente suggerito da uwefed devi utilizzare la funzione milli(), Devi memorizzare un tempo iniziale con millis() e poi controllare le marche temporali a-f con una serie di if.

a-inizio = millis()
  apertura valvola 1
  apertura valvola 2
b-millis() - inizio >= 7200000 && millis() - inizio < 7210000
  apertura valvola 3
  apertuta valvola 4
c- millis() - inizio >= 7210000 && millis() - inizio < 14400000
  chiusura valvola 1
  chiusura valvola 2
d-millis() - inizio >= 14400000 && millis() - inizio < 14410000
  apertura valvola 5
  apertura valvola 6
  apertura valvola 7
e-millis() - inizio >= 14410000 && millis() - inizio < 21600000
  chiusura valvola 3
  chiusura valvola 4
f-millis() - inizio >= 21600000
  chiusura valvola 5
  chiusura valvola 6
  chiusura valvola 7

In questo modo il tuo programma per la maggior parte del tempo girerà a vuoto, oppure testerà continuamente un pulsante per fermare il ciclo.

Ciao,
P.