Gestione Tempi elettrovalvole sistema idroponica

Buonasera a Tutti,
come da presentazione la mia passione è l'agricoltura idroponica,alla quale sto cercando di applicare un pò di tecnologia per la gestione.
Il mio sistema, già installato e funzionante, ha 4 elettrovalvole che gestiscoin apertura chiusura per alimentare le varie sezione di idroponica.
Ho già installato il modulo relè con tutti gli opportuni accorgimenti elettronici per evitare interferenze, ho applicato gli snubber e i condensatori al display e installato arduino UNO rev3 in una scatola stagna con schermatura connessa alla terra, e il sistema funziona da vari giorni senza alcun problema.
Le elettrovalvole devono accendersi nella seguente sequenza:

elettrovalvola 1 accesa cinque minuti e spenta fino alla fine del ciclo di accensione e spegnimento delle altre

elettrovalvola 2 accesa cinque minuti e spenta fino alla fine del ciclo di accensione e spegnimento delle altre

elettrovalvola 3 accesa cinque minuti e spenta fino alla fine del ciclo di accensione e spegnimento delle altre

elettrovalvola 4 accesa cinque minuti e spenta fino alla fine del ciclo di accensione e spegnimento delle altre

Per spiegarmi meglio ciascuna deve accendersi 5 minuti e poi spegnersi appena si accende la successiva e cosi via fino a riaccendersi una volta terminato tutto il ciclo di accensione e spegnimenti delle altre.

ho realizzato il seguente sketch con delay,

// includere la libreria:  
#include <LiquidCrystal.h> 
#include <dht11.h>
  
/* 
   Viene creata l'istanza dell'oggetto LiquidCrystal chiamata lcd in cui 
   sono indicati i pin dell'LCD collegati alle uscite digitali di Arduino 
*/  
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
int DHT11_PIN = 10;
float tempo = 300000 ;
float timer = tempo/1000;

dht11 DHT;

void setup(){
  Serial.begin(9600);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);
  Serial.println();
  
 //impostiamo il numero di colonne ed il numero di righe di lcd  
  lcd.begin(16, 2);  
  // Visualizzo il messaggio sul display  
  lcd.print("----Vertical----");
  lcd.setCursor(0, 1);
  lcd.print("------Farm------");
  delay(3000);
  lcd.clear();
  lcd.print("----Gestione----");
  lcd.setCursor(0, 1);
  lcd.print("-Elettrovalvole-");
  delay(3000);
  lcd.clear();  
  pinMode(6,OUTPUT); 
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
}
void loop(){
  
  int chk;
  Serial.print("DHT11, \t");
  chk = DHT.read(DHT11_PIN);    // READ DATA
  switch (chk){
    case DHTLIB_OK:  
                Serial.print("OK,\t"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
 // DISPLAY SERIAL DATA
  Serial.print(DHT.humidity);
  //Serial.print(",\t\t");
  
  lcd.clear();
  //lcd.print("T=");
  lcd.setCursor(0, 0);
  lcd.print(timer); 
  lcd.setCursor(6, 0);
  lcd.print("s");
  lcd.setCursor(8,0);
  lcd.print(DHT.temperature,1);
  lcd.setCursor(10,0);
  lcd.print((char)223);                // Conversione stampa seriale carattere "°" 
  lcd.print("C");
  lcd.setCursor(13,0);
  lcd.print(DHT.humidity,1);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("1=A 2=S 3=S 4=S");
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
  digitalWrite(9,HIGH);
  delay(tempo);
  lcd.clear();
  //lcd.print("T=");
  lcd.setCursor(0, 0);
  lcd.print(timer); 
  lcd.setCursor(6, 0);
  lcd.print("s");
  lcd.setCursor(8,0);
  lcd.print(DHT.temperature,1);
  lcd.setCursor(10,0);
  lcd.print((char)223);                // Conversione stampa seriale carattere "°" 
  lcd.print("C");
  lcd.setCursor(13,0);
  lcd.print(DHT.humidity,1);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("1=S 2=A 3=S 4=S");
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,HIGH);
  delay(tempo);
  lcd.clear();
  //lcd.print("T=");
  lcd.setCursor(0, 0);
  lcd.print(timer); 
  lcd.setCursor(6, 0);
  lcd.print("s");
  lcd.setCursor(8,0);
  lcd.print(DHT.temperature,1);
  lcd.setCursor(10,0);
  lcd.print((char)223);                // Conversione stampa seriale carattere "°" 
  lcd.print("C");
  lcd.setCursor(13,0);
  lcd.print(DHT.humidity,1);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("1=S 2=S 3=A 4=S"); 
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(tempo);
  lcd.clear();
  //lcd.print("T=");
  lcd.setCursor(0, 0);
  lcd.print(timer); 
  lcd.setCursor(6, 0);
  lcd.print("s");
  lcd.setCursor(8,0);
  lcd.print(DHT.temperature,1);
  lcd.setCursor(10,0);
  lcd.print((char)223);                // Conversione stampa seriale carattere "°" 
  lcd.print("C");
  lcd.setCursor(13,0);
  lcd.print(DHT.humidity,1);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("1=S 2=S 3=S 4=A"); 
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(tempo); 
  
}

Che funziona bene, ma ho altre esigenze quale la verifica in tempo reale della temperatura e dell'umidità, e il delay impegna il processore a contare senza poter permettere operazioni contestuali.
Ho fatto veramente mille prove con millis ma non riesco a creare un ciclo di ritardo sequenziale per rispettare la sequenza delle accensioni e degli spegnimenti delle elettrovalvole.

Vi ringrazio anticipatamente e sono nelle vostre mani :slight_smile:

Stai riggirando la frittata, ma mi sembra la stessa identica domanda che hai già posto QUI ... li, in Inglese, con dei LED, qui, in Italiano, con delle elettrovalvole, ma il succo è lo stesso ... come fare quelle temporizzazioni con millis().

Ora, in conformità al REGOLAMENTO (che ti conisglio di leggere con molta attenzione), punto 13, il cross-posting è proibito (anche tra lingue diverse) e, dato che in quel thread ti stanno già rispondendo (ed è veramente poco cortese abbandonare una discussione e chi ti stava aiutando, per venire di qua a porre la stessa domanda), chiudo qui questo tuo thread e ti prego di continuare dove avevi iniziato.

Guglielmo