problemi sketch con ciclo switch

Buongiorno a tutti,
Mi sono avvicinato da poco al mondo Arduino, per necessità di creare automazioni piuttosto semplici nel mio lavoro, ma che mi permetterebbero di diminuire di un bel pò la manodopera.
Ho creato lo sketch per un ciclo di fertirrigazione e irrigazione di settori diversi per le mie serre (per ora solo due, poi li aumenterò a 8).
Il problema che ho incontrato è dato dallo switch: quando premo il pulsante non mantiene lo stato e non switcha, ma rimane nel case 1 se non premo e nel case 0 se tengo premuto il pulsante.
Ovviamente l’obiettivo sarebbe quello di switchare trai vari case, e che una volta premuto il pulsante BUTTONf ritorni allo switch.
non riesco a capire dove ho commesso un errore.
Arduino UNO

#include <LiquidCrystal.h>
#define BUTTONf 8
#define BUTTONs 7
#define Pompabase  6 //definisco relè per pompa
#define Fertipump  10 //definisco relè per fertirrigazione
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
unsigned long tempo_trascorso = millis();
unsigned long tempo_pressione_pulsante = millis();
unsigned long durata_pressione;

void setup() {
  lcd.begin(20, 4);
  Serial.begin(9600);
  pinMode(Pompabase,OUTPUT);//imposto Pompa come output
  pinMode(Fertipump,OUTPUT);//imposto il relè fertirrigazione come output
  pinMode(BUTTONf,INPUT);//imposto il pulsante come input
  pinMode(BUTTONs,INPUT);// imposto il pulsante di stop come input
  digitalWrite(Pompabase, LOW); // mi assicuro che la pompa principale sia spenta
  digitalWrite(Fertipump, LOW); // mi assicuro che la pompa principale sia spent
  lcd.setCursor(0,0);
  lcd.print("FERTIRRIGAZIONE");
  lcd.setCursor(0,1);
  lcd.print("Az.Agr.Ricotti");
  delay(5000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Accensione pompa");
  delay(2000);
  digitalWrite(Pompabase, HIGH);// faccio alimentare la pompa principale

  }    
void loop()
{
  
int ContatorePulsantePremuto = 0;   // conta il numero di volte che il pulsante è premuto buttonPushCounter   
int StatoPulsante = 0;              // stato corrente del pulsante  
int StatoPulsantePrecedente = 0;   // stato precedente del pulsante

    if (digitalRead(BUTTONf)) // controlla se il pulsante fertirrigazione è stato premuto
    {
    tempo_pressione_pulsante = millis();
    durata_pressione = (tempo_pressione_pulsante - tempo_trascorso); //durata pressione salva il tempo per cui il pulsante è rimasto premuto
     if (durata_pressione > 500 ); //si accerta che il tasto sia premuto per almeno mezzo secondo e non più di 2 secondi
       {
       fertirrigazione(); // attiva il ciclo di fertirrigazione
       tempo_trascorso = millis(); // per far ripartire il conto della pressione del pulsante
       }  
    }      
 
 StatoPulsante = digitalRead(BUTTONs);              // legge il valore dell'input e lo conserva  
  
  if (StatoPulsante != StatoPulsantePrecedente)    // compara lo stato del pulsante attuale con il precedente  
    if (StatoPulsante == HIGH) 
       {                    // se lo stato è cambiato incrementa il contatore  
      // se lo stato corrente è alto, il pulsante è passato da off a on  
      ContatorePulsantePremuto++;  
       }  
  
  // In base allo stato del bottone scelgo l'azione del led  
  switch (ContatorePulsantePremuto)  
  {  
 //pompa principale accesa, fertirrigazione spenta e settori spenti 
  case 1:  
  lcd.clear();
    digitalWrite(Pompabase, HIGH);// accende la pompa principale
    lcd.setCursor(0,0);
    lcd.print("Pompa Principale:ON");
    lcd.setCursor(0, 1);
    lcd.print("Fertirrigazione:OFF");
    lcd.setCursor(0, 2);
    lcd.print("Per attivare:premi");
    lcd.setCursor(0,3);
    lcd.print("il pulsante fert");
    delay(500);              // aspetta mezzo secondo  
    break;  
  
    // accende pompa base, fertirrigazione spenta e settore1 acceso
  case 2:  
  lcd.clear();
    digitalWrite(Pompabase, HIGH);  // accende 
     lcd.setCursor(0,0);
     lcd.print("Pompa Principale:ON");
     lcd.setCursor(0, 1);
     lcd.print("Fertirrigazione:OFF");
     lcd.setCursor(0, 2);
     lcd.print("Settore1:ON");
     lcd.setCursor(0,3);
     lcd.print("Settore2:OFF");
     delay(500);              // aspetta un secondo  
    //digitalWrite(settore1, HIGH);   // accende eventuale settore 1 
    //delay(1000);              // aspettaun secondo  
    break;  
  
    // accende pompa base, fertirrigazione spenta e settore 2 acceso 
  case 3:  
  lcd.clear();
    digitalWrite(Pompabase, HIGH);  // accende il LED 
     lcd.setCursor(0,0);
     lcd.print("Pompa Principale:ON");
     lcd.setCursor(0, 1);
     lcd.print("Fertirrigazione:OFF");
     lcd.setCursor(0, 2);
     lcd.print("Settore1:OFF");
     lcd.setCursor(0,3);
     lcd.print("Settore2:ON");
     delay(500);              // aspetta un secondo  
    //digitalWrite(settore1, LOW);   // spegne eventuale settore 1
    //digitalWrite(settore2, HIGH);  // accende eventuale settore2
    //delay(1000);              // aspetta un secondo  
    break;  
  
    // sistema spento 
  case 0:  
    lcd.clear();
    delay(15);  
    digitalWrite(Pompabase, LOW);
    lcd.setCursor(0,0);
    lcd.print("Pompa Principale:OFF");
    lcd.setCursor(0, 1);
    lcd.print("Fertirrigazione:OFF");
    lcd.setCursor(0, 2);
    lcd.print("Settore1:OFF");
    lcd.setCursor(0,3);
    lcd.print("Settore2:OFF");
    delay(500);              // aspetta un secondo  
    break;  
  }}
 void fertirrigazione() 
    {
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("Fertirrigazione:ON");
    lcd.setCursor(0,2);
    lcd.print("Attendere,prego");
    delay(2000);
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("Fertirrigazione");
    lcd.setCursor(0,2);
    lcd.print("in corso");
    digitalWrite(Fertipump, HIGH);//accendo gruppo fert.
    delay(40000);
    lcd.clear();
    digitalWrite(Fertipump,LOW);
  
    }

Grazie

Fabio

Ciao, sono su telefonino e non riesco a seguire tutto il tuo programma,mi sono perso in quello che sembra un conteggio dei tempi
Comunque, una cosa certa è che se usi variabili locali alla loop ne perdi di continuo il valore.
Sposta la dichiarazione delle variabili che devono mantenere il valore all'inizio.
Potresti anche dichiararle static, ma per ora è prematuro

Perfetto!
mi rendo conto di aver fatto un errore piuttosto stupido.

Il passaggio tra i vari case è però piuttosto macchinoso, specialmente dal 3 allo 0, devo premere due volte il pulsante.

Piccole cose:

  1. if (digitalRead(BUTTONf))
    meglio se espliciti il confronto con HIGH, codice più chiaro quindi if(digitalRead(BUTTONf)==HIGH)

  2. hai creato una funzione fertirrigazione() che aiuta a leggere il programma.
    Siccome lo switch è grossino, sarebbe utile creare delle funzioni, una per ogni case, e quello che c'e' in un case (tranne break;) lo metti in quella funzione.

Potresti poi anche scoprire che molte cose in quelle funzioni sono "simili", e si potrebbero "accorpare", ma questo sarebbe un livello superiore di miglioramento del codice, non per forza necessario.

  1. per le define di quei pin, usa dei nomi chiari, BUTTON_FERT e BUTTON_STEP e anche gli altri due, POMPA_BASE e POMPA_FERT per esempio, con la prima parte che evidenzia cosa sono (bottoni o pompe) e la secondo a cosa serve, inoltre tutte e quattro scritte con lo stesso stile, in questo caso tutto maiuscolo. Ne migliora la leggibilità del codice.

Ti ringrazio!

lo miglioro, appena ho qualche minuto ho un'altra cosuccia da chiedervi!

Grazie ancora

Hai un bottone per accendere e spegnere il ciclo dico bene? Ed uno per selezionare il programma

La prima cosa che vedo è che il contatore delle pressioni del tasto non torna mai a zero e non hai il debounce attivato.
Ti consiglio di cercarti la libreria bounce2 e con quella gestire i pulsanti in entrata

Aggiungi :

  if (StatoPulsante != StatoPulsantePrecedente)    // compara lo stato del pulsante attuale con il precedente  
    if (StatoPulsante == HIGH) 
       {                    // se lo stato è cambiato incrementa il contatore  
      // se lo stato corrente è alto, il pulsante è passato da off a on  
      ContatorePulsantePremuto++;  

[b]If (ContatorePulsantePremuto <= 4){ // porto la mia variabile allo stato iniziale 
    ContatorePulsantePremuto = 0;
}
[/b]

       }

Con questa modifica ogni volta che premi il pulsante per la selezione del programma arriva fino al programma 3 e si riporta al programma zero.
Ogni variabile di selezione deve essere portata allo stato iniziale, ogni volta che accendo qualcosa nel programma deve essere spento.

rieccomi, dopo il WE ho fatto qualche modifica.

PROBLEMA 1:

Il problema è che senza il codice di Kurtzisa non azzera bene come detto, con mi dà questo errore:

Arduino:1.8.5 (Linux), Scheda:“Arduino/Genuino Uno”

capture of non-variable ‘class Bounce’

Questo report potrebbe essere più ricco di informazioni abilitando l’opzione
“Mostra un output dettagliato durante la compilazione”
in “File → Impostazioni”

PROBLEMA 2
il ciclo automatic entra ma non riesco più ad uscirne. avevo provato alla fine del void a rimandarmi al void funzione_base ma non ne vuole sapere.

PROBLEMA 3
Utilizzando la funzione millis() nel void automatic, non riesco a farle fare il ciclo come vorrei
ovvero
S1acceso (fino ad irrisettore)>s2acceso (fino ad irrisettore)> ritorno allo stato base
Ho poi messo un contatore di tempo che non ho potuto testare perche tutto il sistema non funziona.
Purtroppo ho già provato molte volte a modificare la funzione millis() ma non riesco proprio ad andarci su.

#include <Bounce2.h>
#include <LiquidCrystal.h>

#define BUTTON_FERT 8 //pulsante per fertirrigazione  
#define BUTTON_SWITCH 7 //pulsante per selezione switch
#define BUTTON_CHARGE 9 //pulsante caricamento vasca
#define POMPA_BASE  6 //definisco relè per pompa
#define POMPA_FERT  10 //definisco relè per fertirrigazione
#define RELAIS_CARICO  13 //definisco relè carico vasca
#define SETTORE_A 14 // definisco relè settore irrigazione A 
#define SETTORE_B 15 // definisco relè settore irrigazione B
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
unsigned long tempo_trascorso = millis();
unsigned long tempo_pressione_pulsante = millis();
unsigned long durata_pressione;
unsigned long irrisettori= 10000; //intervallo irrigazione settori
unsigned long previousMillis= 0 ;
unsigned long previousSAMillis= 0 ;//riferimento irrigazione settore 1
unsigned long previousSBMillis= 0 ;//riferimento irrigazione settore 2
unsigned long carico_vasca =5000; // intervallo carico vasca
int ContatorePulsantePremuto = 0;   // conta il numero di volte che il pulsante è premuto buttonPushCounter   
int StatoPulsante = 0;              // stato corrente del pulsante 
int StatoPulsantePrecedente = 0;   // stato precedente del pulsante
void setup() {
  lcd.begin(20, 4);
  pinMode(POMPA_BASE,OUTPUT);//imposto Pompa come output
  pinMode(POMPA_FERT,OUTPUT);//imposto il relè fertirrigazione come output
  pinMode(RELAIS_CARICO,OUTPUT); //imposto il relè del carico vasca come output
  pinMode(SETTORE_A,OUTPUT); // imposte il rele del settore A
  pinMode(SETTORE_B,OUTPUT); // imposto il rele del settore B
  pinMode(BUTTON_FERT,INPUT);//imposto il pulsante come input fertirrigazione come input
  pinMode(BUTTON_CHARGE,INPUT);//imposto il pulsante carico vasca come input
  pinMode(BUTTON_SWITCH,INPUT);// imposto il pulsante di stop come input
  digitalWrite(POMPA_BASE, LOW); // mi assicuro che la pompa principale sia spenta
  digitalWrite(POMPA_FERT, LOW); // mi assicuro che la pompa principale sia spent
  lcd.setCursor(0,0);
  lcd.print("FERTIRRIGAZIONE");
  lcd.setCursor(0,1);
  lcd.print("Az.Agr.Ricotti");
  lcd.setCursor(0,2);
  lcd.print("Avviamento ciclo");
  delay(5000);
  

  }   
void loop()
{
  
   if (digitalRead(BUTTON_CHARGE)==HIGH) // controlla se il pulsante fertirrigazione è stato premuto
    {
    tempo_pressione_pulsante = millis();
    durata_pressione = (tempo_pressione_pulsante - tempo_trascorso); //durata pressione salva il tempo per cui il pulsante è rimasto premuto
     if (durata_pressione > 500 ); //si accerta che il tasto sia premuto per almeno mezzo secondo e non più di 2 secondi
       {
       carico(); // attiva il ciclo di fertirrigazione
       tempo_trascorso = millis(); // per far ripartire il conto della pressione del pulsante
       } 
    }     
            
  if (digitalRead(BUTTON_FERT)==HIGH) // controlla se il pulsante fertirrigazione è stato premuto
    {
    tempo_pressione_pulsante = millis();
    durata_pressione = (tempo_pressione_pulsante - tempo_trascorso); //durata pressione salva il tempo per cui il pulsante è rimasto premuto
     if (durata_pressione > 500 ); //si accerta che il tasto sia premuto per almeno mezzo secondo e non più di 2 secondi
       {
       fertirrigazione(); // attiva il ciclo di fertirrigazione
       tempo_trascorso = millis(); // per far ripartire il conto della pressione del pulsante
       } 
    }     
 
 StatoPulsante = digitalRead(BUTTON_SWITCH);              // legge il valore dell'input e lo conserva 
 
  if (StatoPulsante != StatoPulsantePrecedente)    // compara lo stato del pulsante attuale con il precedente 
    if (StatoPulsante == HIGH)
       {                    // se lo stato è cambiato incrementa il contatore 
      // se lo stato corrente è alto, il pulsante è passato da off a on 
      ContatorePulsantePremuto++; 
        
       }
 
  // In base allo stato del bottone scelgo l'azione del led 
  switch (ContatorePulsantePremuto) 
  { 
 
  case 1: //pompa principale accesa, fertirrigazione spenta e settori spenti
    funzione_base();
    break; 

  case 2: //ciclo automatico
    automatic();
    break;  
 
  case 3: // accende pompa base, fertirrigazione spenta e settore1 acceso
    settore_1();
    break; 
 
  case 4: // accende pompa base, fertirrigazione spenta e settore 2 acceso
    settore_2();
    break; 
    
    // sistema spento
  case 0: 
    blocco();
    break; 
  }}
void fertirrigazione()
    {
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("Fertirrigazione:ON");
    lcd.setCursor(0,2);
    lcd.print("Attendere,prego");
    delay(2000);
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("Fertirrigazione");
    lcd.setCursor(0,2);
    lcd.print("in corso");
    digitalWrite(POMPA_FERT, HIGH);//accendo gruppo fert.
    delay(40000);
    lcd.clear();
    digitalWrite(POMPA_FERT,LOW);
 
    }
  void funzione_base()
      {
        lcd.clear();
        digitalWrite(POMPA_BASE, HIGH);// accende la pompa principale
        lcd.setCursor(0,0);
        lcd.print("Pompa Principale:ON");
        lcd.setCursor(0, 1);
        lcd.print("Per caricare vasca");
        lcd.setCursor(0, 2);
        lcd.print("fertirrigazione");
        lcd.setCursor(0,3);
        lcd.print("premi il pulsante 2");
        delay(500);              // aspetta mezzo secondo 

      }
   void settore_1 ()
      {
        lcd.clear();
        digitalWrite(POMPA_BASE, HIGH);  // accende
        lcd.setCursor(0,0);
        lcd.print("Pompa Principale:ON");
        lcd.setCursor(0, 1);
        lcd.print("Fert:OFF");
        lcd.setCursor(0, 2);
        lcd.print("S1:ON");
        lcd.setCursor(0,3);
        lcd.print("S2:OFF");
        delay(500);              // aspetta un secondo 
        digitalWrite(SETTORE_A, HIGH);   // accende eventuale settore 1
        delay(1000);              // aspettaun secondo
      }
    void settore_2 ()
       {
         lcd.clear();
         digitalWrite(POMPA_BASE, HIGH);  // accende il LED
         lcd.setCursor(0,0);
         lcd.print("Pompa Principale:ON");
         lcd.setCursor(0, 1);
         lcd.print("Fert:OFF");
         lcd.setCursor(0, 2);
         lcd.print("S1:OFF");
         lcd.setCursor(0,3);
         lcd.print("S2:ON");
         delay(500);              // aspetta un secondo 
         digitalWrite(SETTORE_A, LOW);   // spegne eventuale settore 1
         digitalWrite(SETTORE_B, HIGH);  // accende eventuale settore2
         delay(1000);              // aspetta un secondo 
       }
    void blocco ()
       {
         lcd.clear();
         delay(15); 
         digitalWrite(POMPA_BASE, LOW);
         lcd.setCursor(0,0);
         lcd.print("Pompa Principale:OFF");
         lcd.setCursor(0, 1);
         lcd.print("Fertirrigazione:OFF");
         lcd.setCursor(0, 2);
         lcd.print("S1:OFF");
         lcd.setCursor(0,3);
         lcd.print("S2:OFF");
         delay(500);              // aspetta un secondo 
        }
     void carico ()
          {
          lcd.clear();
          delay(15); 
          digitalWrite(POMPA_BASE, HIGH);
          digitalWrite(RELAIS_CARICO, HIGH);
          lcd.setCursor(0,0);
          lcd.print("Pompa Principale:ON");
          lcd.setCursor(0, 1);
          lcd.print("Riempimento big box:");
          lcd.setCursor(0, 2);
          lcd.print("in corso");
          lcd.setCursor(0,3);
          lcd.print("SA:OFF SB:OFF");
          delay (carico_vasca);
          digitalWrite(RELAIS_CARICO,LOW);
     
          }
       void automatic()
          {unsigned long autotime=millis();
          if (autotime-previousSAMillis>irrisettori)
           {
           unsigned long actime1 = autotime-previousSAMillis;
           previousSAMillis = autotime;
           int count1=actime1-autotime;
           lcd.clear();
           delay(15);
           digitalWrite(POMPA_BASE, HIGH);
           digitalWrite(SETTORE_A, HIGH);
           lcd.setCursor(0,0);
           lcd.print("Pompa Principale:ON");
           lcd.setCursor(0, 1);
           lcd.print("Ciclo Automatico");
           lcd.setCursor(0, 2);
           lcd.print("in corso");
           lcd.setCursor(9, 2);
           lcd.print(count1/1000);
           lcd.setCursor(0,3);
           lcd.print("S1:ON         S2:OFF");
           autotime=millis();
           }
          if (autotime-previousSBMillis>irrisettori)
           {unsigned long actime2 = autotime-previousSAMillis;
           previousSBMillis = autotime;
           int count2=actime2-autotime;
           lcd.clear();
           delay(15);
           digitalWrite(SETTORE_A, LOW);
           digitalWrite(POMPA_BASE, HIGH);
           digitalWrite(SETTORE_B, HIGH);
           lcd.setCursor(0,0);
           lcd.print("Pompa Principale:ON");
           lcd.setCursor(0, 1);
           lcd.print("Ciclo Automatico");
           lcd.setCursor(0, 2);
           lcd.print("in corso");
           lcd.setCursor(9, 2);
           lcd.print(count2/1000);
           lcd.setCursor(0,3);
           lcd.print("S1:OFF         S2:ON");
           delay(irrisettori);
           digitalWrite(SETTORE_B, LOW);
           }
          }

Domani sera ci do un occhio da pc e ti dico, scusa ma tra lavoro e resto sono già a letto :stuck_out_tongue:

  1. Senza avere visto la funzione automatic () dico che non può non uscire da tale funzione, a meno che
    A)Si blocchi il programma
    B)La funzione contenga una while () con condizione sempre vera
    per risolvere il problema ti consiglio di infarcire il tutto di debug seriali
  2. Nelle funzioni non si può usare millis() come nella loop(), non perché non vada, ma perché la loop() viene ripetuta continuamente, quindi arriverà sicuramente un momento in cui il timer scatta, mentre le funzioni fanno controlli in momenti determinati, che il timer sia scattato o meno, senza aspettarlo. Per usare milis() in una funzione bisogna :
    A)Usare una variabile di tempo precedente globale o passata
    B)Usare un tempo di timer globale, passato o interno alla funzione (quindi non locale altrove, lo dico, chissà mai)
    C)Usare una while (timer non passato);

Non ho capito bene tutto il programma, comunque secondo me alcune cose non vanno...

Per il PROBLEMA 2 forse basta che togli il delay() in fondo... con delay(10000) il programma sta fermo per 10 secondi e magari ti da l'impressione di bloccarsi.

Poi, in alcuni if dopo la parentesi tonda chiusa e prima della graffa metti un punto e virgola. Toglilo perché non ci va.

Poi la variabile ContatorePulsantePremuto mi sembra non venga mai azzerata... quando superi il valore 4 che succede?

Poi usi sia millis() che delay()... meglio fare una scelta.

Allora, il void Automatic() l'ho sistemato e funziona perfettamente.
@Silente, hai un link valido che faccia un focus sul come usare bene la funzione Millis() ? Ho già letto un bel po di articoli, ma molti sono confusionari e mi confondono.
@fratt , ho provato ad azzerarla dopo il Case 4, prima del break, ma non funziona del tutto. mentre tutte le altre imperfezioni che mi erano sfuggite le ho rimesse in ordine!

Invece di azzerarlo nel case 4 meglio se dopo l'incremento metti semplicemente un if che verifica se hai superato il 4 e lo riporti a 0.

Poi mi sembra che StatoPulsantePrecedente non lo aggiorni mai... O mi sono perso qualcosa?

Millis() é un timer. Restituisce il numero di millisecondi passati dalla accensione di Arduino.
Le dimensioni del numero restituito sono di un unsigned long, di conseguenza ogni mese circa il suo valore riparte da 0. Ecco quindi il “problema” di uverflow millis(), che é un problema se non si usa come si deve.
Come va usata millis()?

  1. all’avverarsi di una condizione si setta una variabile al valore attuale di millis() e si alza una flag timer
  2. nel programma si esegue un confronto if (millis()-quella variabile</> tempo di timer && timer==1){quello che deve fare allo scatto. Timer=0}
    Chiaro?

Scusa la mia immensa ignoranza, ma cosa intendi con "flag timer"?

e perchè ogni tanto mi dà errore di complilazione quando richiamo i void() ? mi dice ad esempio:
automatic () was not declared in this scope. nonostante funzionasse fino a poco prima

Rifabi:
... hai un link valido che faccia un focus sul come usare bene la funzione Millis() ?

Sempre gli stessi, vanno studiati (non letti) ... prima QUI, poi QUI ed infine leggi anche QUI e QUI.

Guglielmo

Rifabi:
Scusa la mia immensa ignoranza, ma cosa intendi con "flag timer"?

e perchè ogni tanto mi dà errore di complilazione quando richiamo i void() ? mi dice ad esempio:
automatic () was not declared in this scope. nonostante funzionasse fino a poco prima

Una flag é una variabile, in questo caso di nome timer (ma indica solo per cosa si usa, può chiamarsi anche maledizione_cruciatus) che indica il bisogno o meno di fare una determinata cosa (eseguire letture, controllare timer, lanciare maledizioni ...)

Quanto agli errori "vas nit declared" per le funzioni, stai attento alle parentesi graffe, perché toglierne una é un attimo, ma capire di averlo fatto, dove, e come rimetterla no. Può essere che ti sia dimenticato in giro nel codice una parentesi aperta e mai chiusa. Di conseguenza tutto il conto delle parentesi va a gambe all'aria, e il compilatore non riconosce più le funzioni. Un bel strumenti/formattazione automatica può aiutare

Siccome si parla di ignoranza non posso resistere nel dire la mia. 8) 8) :sunglasses: :sunglasses:

Siccome ti sei avvicinato da poco al mondo Arduino,Perche non provi prima qualkosa di piu semplice da elaborare successivamente???

Ad esempio,prova a far accendere due semplici led (le pompe ) usando 1 pulsante…il tutto senza librerie,cicli for,while,do while,delay ed utilizzando millis…

Molte cose dopo ti saranno più semplici.

Ciao :astonished: :astonished: :drooling_face: :drooling_face: :sob: :sob:

@guglielmo, ti ringrazio per i link. in realtà li avevo già visti tutti tranne l'ultimo, tramite il tasto cerca.
@silente, ti ringrazio! gentilissimo.
@Puso, hai ragione anche tu, e credo di farlo a breve. Purtroppo sto cercando di fare questo sketch in breve tempo perchè ne ho la necessità per il lavoro e devo accelerare il più possibile i miei tempi di apprendimento =(

Sono riuscito a superare la maggiorparte delle vicissitudini, ma i millis mi fanno impazzire.
So che può sembrare una cavolata, ma a furia di sbagliare ricontrollare gli esempi e correggere, ed ogni volta riveder sempre la stessa reazione è frustrante.
Qualche anima pia mi può dire dove sto sbagliando?
Vorrei che dopo una pausa di 3 secondi, di sicurezza, il settore A rimanga acceso per 10 minuti e subito dopo si spenga per far accendere il Settore B per altri 10 minuti. poi stop per 40 minuti.
ho messo Irrisettore A e irrisettore B a 10000, ma appena richiamo il void salta direttamente al passo successivo, in pratica discorrendo il loop molto velocemente.

    void automatic()
{     
    unsigned long tempo_attuale = millis();
      if (tempo_attuale - tempo_iniziale > pausa)
        {
        tempo_iniziale = tempo_attuale; 
        lcd.clear();
        delay(1);
        digitalWrite(POMPA_BASE, HIGH);
        digitalWrite(SETTORE_A, HIGH);
        digitalWrite(SETTORE_B, LOW);
        lcd.setCursor(0,0);
        lcd.print("Pompa Principale:ON");
        lcd.setCursor(0, 1);
        lcd.print("Ciclo Automatico");
        lcd.setCursor(0, 2);
        lcd.print("in corso");
        lcd.setCursor(10, 2);
        lcd.print(tempo_iniziale/1000);
        lcd.setCursor(0,3);
        lcd.print("S1:ON         S2:OFF");
        unsigned long timer1 = millis();
         if (millis()-timer1 > irrisettorea && irrisettorea == 1)
            {
             digitalWrite(SETTORE_A, LOW);
             digitalWrite(SETTORE_B, HIGH);
             digitalWrite(POMPA_BASE, HIGH);
             lcd.clear();
             delay(15);
             lcd.setCursor(0,0);
             lcd.print("Pompa Principale:ON");
             lcd.setCursor(0, 1);
             lcd.print("Ciclo Automatico");
             lcd.setCursor(0, 2);
             lcd.print("in corso");
             lcd.setCursor(10, 2);
             lcd.print((tempo_iniziale-irrisettorea)/1000);
             lcd.setCursor(0,3);
             lcd.print("S1:OFF         S2:ON");
             unsigned long timer2 =millis();
              if (millis()-timer2 > irrisettoreb && irrisettoreb ==1)
                 {digitalWrite(SETTORE_B, LOW);
                 lcd.setCursor(0,0);
                 lcd.print("Pompa Principale:ON");
                 lcd.setCursor(0, 1);
                 lcd.print("Ciclo Automatico");
                 lcd.setCursor(0, 2);
                 lcd.print("terminato");
                 lcd.setCursor(0,3);
                 lcd.print("S1:OFF         S2:OFF");
                 }
            }
          }
}