Go Down

Topic: [Risolto] Mantenere relè acceso con millis(). (Read 613 times) previous topic - next topic

daft5555

Dec 17, 2018, 12:50 pm Last Edit: Dec 17, 2018, 10:20 pm by daft5555
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);
         
        }
    }

gpb01

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 (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 ... 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. ;)
Search is Your friend ... or I am Your enemy !

daft5555

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 (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 ... 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 :)

Standardoil

Sposta la Startmillis= nel primo if
E dichiarala globale
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

Silente

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)
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

Datman

#5
Dec 17, 2018, 07:03 pm Last Edit: Dec 17, 2018, 07:14 pm by Datman
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.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Silente

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.
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

daft5555

Grazie mille a tutti, ho provato a fare come dice Datman e adesso funziona tutto.

Go Up