vorrei realizzare un piccolo progetto per una vasca del vivo; per questo progetto abbiamo utilizzato: un arduino Nano, una pompa, una valvola a due vie con due bobine (una per il reintegro della vasca ed una per una manichetta), due pulsanti che abilitano le due diverse condizioni, un galleggiante ed un potenziometro per ritardare il tempo del reintegro.
Ora il punto dolente: non riesco ad inserire il ritardo dato dal potenziometro cioè ho provato con un "delay(minuti)", ma questo mi blocca la lettura del programma per i secondi impostati e se dovessi utilizzare la manichetta non si abilita; ho provato ad inserire un "voip ritardo()" ed richiamarlo quando mi serviva ma avrò fatto un caos e non lo richiama correttamente; ho letto tra i diversi post della funzione "millis()" che non mi è molto chiara e non ci ho prova. Vi allego in mio lavoro... grazie in anticipo per l'aiuto.
int pot = A0;
const int gall = 2;
const int pulV = 3;
const int pulM = 4;
const int pompa = 5;
const int bobinaA = 6;
const int bobinaB = 7;
const int ledV = 8;
const int ledM =9;
const int Timer=10;
int statoPV = LOW;
int statoPM = LOW;
int statoLV = LOW;
int statoLM = LOW;
int let;
int temp;
unsigned long minuti;
int ritardo;
void setup (){
pinMode(gall, INPUT);
pinMode(pulV, INPUT);
pinMode(pulM, INPUT);
pinMode(pompa, OUTPUT);
pinMode(bobinaA, OUTPUT);
pinMode(bobinaB, OUTPUT);
pinMode(ledV, OUTPUT);
pinMode(ledM, OUTPUT);
pinMode(Timer, OUTPUT);
digitalWrite(ledV, statoLV);
digitalWrite(ledM, statoLM);
}
void loop() {
int GG =digitalRead(gall);
int pulvasca =digitalRead(pulV);
if (pulvasca!=statoPV && pulvasca==HIGH){
statoLV=!statoLV;
digitalWrite(ledV,statoLV);
}
statoPV = pulvasca;
switch (statoLV &&GG){
case (LOW):
digitalWrite(bobinaA,HIGH);
break;
case (HIGH):
digitalWrite(bobinaA,LOW);
break;
default: break;
}
delay(10);
int val =digitalRead(pulM);
if (val!=statoPM and val == HIGH){
statoLM =!statoLM;
digitalWrite(ledM,statoLM);
}
statoPM = val;
switch (statoLM){
case (LOW):
digitalWrite(bobinaB,HIGH);
break;
case (HIGH):
digitalWrite(bobinaB,LOW);
break;
default: break;
}
delay (10);
switch ((statoLV && GG)||statoLM){
case (LOW):
digitalWrite(pompa,HIGH);
break;
case(HIGH):
digitalWrite(pompa,LOW);
break;
default: break;
}
delay (10);
if (digitalRead(GG == LOW)){
let = analogRead(pot);
temp = map(let, 0, 1023, 1, 180);
minuti=temp*1000;
digitalWrite (VA, LOW);
digitalWrite (Timer, LOW);
delay(minuti);
digitalWrite (VA, HIGH);
digitalWrite (Timer, HIGH);
}
delay (10);
}
Buonasera ,
ti è già stato richiesto in passato, ma non lo hai fatto, pertanto di nuovo, nel rispetto del regolamento della sezione italiana del forum (… punto 13, primo capoverso), ti chiedo di presentartiIN 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 tutto il su citato REGOLAMENTO ...
... poi, in conformità al suddetto 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.
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto.
Il tuo problema e' l'uso del "delay", che mentre aspetta, aspetta e basta, cioe' blocca qualsiasi altra cosa ... dovresti riscrivere il programma usando la funzione millis() al posto dei delay con degli if per controllare se i vari tempi sono trascorsi (e mi sa che si fa prima a riscrivere tutto da capo, perche' la logica di funzionamento cambia un po) ... i vari delay(10) potrebbero anche rimanere, 10 millisecondi alla volta non credo causino problemi, ma dove sono minuti ovviamente andrebbero eliminati ...
Piu che fare questo, non mi sembra esistano altri sistemi ...
>domy: ... come suggersice Etem qui sopra, l'unica è che ... ti studi come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che ti sarà tutto più chiaro sul come evitare certi problemi
..e per evitare di spaventare l'OP con i tanti link "QUI e QUI" di Guglielmo vorrei aggiungere: non spaventarti, puoi anche non leggerli proprio tutti ma poi una volta compreso il meccanismo ti sarà tutto più chiaro!
E soprattutto considera che l'uso di millis() è un meccanismo basilare per tutti i programmi che devono fare più cose "contemporaneamente" (non sono contemporanee ovviamente ma dato che le fa molto velocemente è come se lo fossero), che sono la stragrande maggioranza delle implementazioni dato che che riguardano la gestione di più elementi e/o di più "stati" del sistema.
Quindi armati di un poco di pazienza, e vedrai che sarà tutto più semplice, anche in fase di progettazione.
Buongiorno, io ci ho provato all'infinito con la funzione millis() ho provato anche a fare ricerche di progetti simili al mio per capire la sintassi corretta ma con esito negativo la funzione millis() non mi entra in testa, ho capito che è un registro esterno che restituisce un numero in millisecondi. vi chiedo gentilmente di spiegarmi come posso farlo fare a contare al tempo che mi da il potenziometro per creare il ritardo da me desiderato. Vi ringrazio in anticipo. non voglio la soluzione ma voglio capire >:(.
if(digitalRead(GG==LOW)){
let = analogRead(pot);
temp = map(let, 0, 1023, 1, 180);
minuti=temp*1000;
ritardo=millis();
digitalWrite(Timer,HIGH);
if (millis()>ritardo+minuti){
digitalWrite(Timer,LOW);
}
Beh ... da quello che hai scritto, deduco che hai prestato poca attenzione hai primi link che ti ho dato e, in particolare a QUESTO ... visto che ti sei inventato un tuo IF che non può funzionare correttamente ... :
millis() è come un cronometro che parte da 0 all'accensione e va avanti fino alla fine dell'unsigned long int (uint32_t) che esprime in millisecondi il tempo trascorso. Raggiunto il limite dei 32 bit (oltre 4 miliardi, pari a circa 50 giorni) ricomincia da zero. Per usarlo, quindi, devi solo prendere il tempo all'inizio di qualcosa e poi verifichi ciclicamente se è trascorso il tempo prefissato con la forma:
if(millis()-t_iniziale > DURATA) {};
Supponi di infornare una torta, accendere il fuoco al caffè e mettere a lievitare l'impasto per il pane: ogni volta che compi una di queste tre azioni ti segni il tempo: t_in_torta, t_in_caffe, t_in_lievi, poi nel loop scrivi (60000 sono i millisecondi in un minuto):
Fai attenzione a usare sempre la forma if (millis()-t_iniziale > DURATA) {} per scongiurare problemi qualora il circuito resti acceso più di 50 giorni e millis() si azzeri proprio durante una temporizzazione. Se usi quella forma, le temporizzazioni funzioneranno comunque.
Perché secondo me tu hai "durata" che è una unsigned long (il valore 4294947688 è sicuramente a 32 bit ed unsigned) mentre "temp" deve essere int per cui quando fai "temp*100" essendo una operazione tra due interi lui te la fa come intero e va in overflow (180.000 non può intrare in un "int", peraltro signed quindi diventa ngativo).
Devi mettere:
durata = temp * 1000UL
per forzare il caolo su unsigned long ("UL") e vedrai che funziona.