Arduino Forum

International => Italiano => Software => Topic started by: daft5555 on Dec 17, 2018, 12:50 pm

Title: [Risolto] Mantenere relè acceso con millis().
Post by: daft5555 on Dec 17, 2018, 12:50 pm
Salve a tutti, sto cercando di fare un programma per poter svuotare in automatico un serbatoio quando si riempie. Il progetto prevede una pompa comandata da un relè ed un sensore di livello dell'acqua. Quando il livello supera una certa soglia il relè dovrebbe restare acceso per un tempo predefinito e poi tornare a spegnersi.
Poiché la scheda di Arduino esegue anche altre operazioni nel frattempo, e l'intervallo temporale durante in quale vorrei lasciare il relè acceso è abbastanza grande (dell'ordine dei minuti), ho deciso di usare millis(). Ho provato a scrivere queste due righe di codice basandomi sull'esempio "blink without delay", ma non funzionano correttamente: quando il livello supera la soglia il relè si accende, ma poi non si spegne più. Qualcuno sa darmi qualche suggerimento? Grazie in anticipo per la vostra disponibilità.
Code: [Select]
  if(analogRead(livello > 50))
  {
    x=1;
  }

  if(x == 1)
    {
      unsigned long startMillis = millis();
      digitalWrite(rele, HIGH);
      digitalWrite(led, HIGH);
     
      if((millis()-startMillis) > 3000)
        {
          x=0;
          startMillis = 0;
          digitalWrite(rele, LOW);
          digitalWrite(led, LOW);
         
        }
    }
Title: Re: mantenere relè acceso con millis()
Post by: gpb01 on Dec 17, 2018, 12:53 pm
Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (http://forum.arduino.cc/index.php?topic=113640.0) (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO (http://forum.arduino.cc/index.php?topic=149082.0) ... Grazie. :)

Guglielmo

P.S.: Ti ricordo che, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)
Title: Re: mantenere relè acceso con millis()
Post by: daft5555 on Dec 17, 2018, 03:19 pm
Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (http://forum.arduino.cc/index.php?topic=113640.0) (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO (http://forum.arduino.cc/index.php?topic=149082.0) ... Grazie. :)

Guglielmo

P.S.: Ti ricordo che, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)
Fatto :)
Title: Re: mantenere relè acceso con millis()
Post by: Standardoil on Dec 17, 2018, 03:32 pm
Sposta la Startmillis= nel primo if
E dichiarala globale
Title: Re: mantenere relè acceso con millis()
Post by: Silente on Dec 17, 2018, 03:45 pm
E sstema la tonda della analogRead. Adesso é analogRead (...>...)
Deve essere
analogRead (...)>50.
Come é adesso vuol dire
Agisci se (la lettura analogica di (questo numero é maggiore di cinquanta?(si=1 no=0)) é diversa da 0).
Mentre spostando le tonde diventa
Agisci se (la lettura analogica di (questo nunero) é maggiore di 50)
Title: Re: mantenere relè acceso con millis()
Post by: Datman on Dec 17, 2018, 07:03 pm
Puoi fare una cosa del genere:
Code: [Select]
if(analogRead(livello)>50) && x==0)
  {
  digitalWrite(rele,HIGH);
  x=1; t1=millis();
  }
if(x==1 && millis()-t1>2*60000) // 2 sono i minuti di accensione
  {
  digitalWrite(rele,LOW);
  x=0;
  }
Il LED puoi metterlo in parallelo alla bobina del relè, usando una sola uscita.
x potrà essere una variabile byte (una booleana occupa comunque 1 byte);
t1 dovrà essere unsigned long.
Title: Re: mantenere relè acceso con millis()
Post by: Silente on Dec 17, 2018, 09:54 pm
O anche potresti eliminare la variabile X ed utilizzare T1 al suo posto. Per farlo sarebbe sufficiente, a parte sostituire chiaramente T1 ovunque ci sia scritto X, eliminare quell' ==1. È una sottigliezza ovviamente in quanto consiste soltanto nell'eliminazione di una variabile però credo possa funzionare. Sottigliezza ulteriore è eliminare anche ==0, e sostituirlo con Not variabile. Questo perché, da ricordarsi, se io metto tra i controlli di un if il nome di una variabile senza specificare altro vuol dire che quella variabile deve essere diversa da zero, se io invece metto not il nome di una variabile vuol dire automaticamente che quella variabile deve essere Zero.
If di primo tipo if (variabile){...} se la variabile NON vale Zero
If di secondo tipo if (!variabile) {..} se vale zero.
Title: Re: mantenere relè acceso con millis()
Post by: daft5555 on Dec 17, 2018, 10:19 pm
Grazie mille a tutti, ho provato a fare come dice Datman e adesso funziona tutto.