Ciao a tutti, dopo varie ferie e vari lavoretti di casa e vicinato sto riprendendo in mano lo sketch dell'anemometro. Ho deciso di creare uno sketch per ogni parte del programma per poi
funzionano. Ora sono ai pulsanti, sto facendo in modo che se premo il pulsante per
me ne fa un'altra. Il tutto funziona ma ci sono i rimbalzi che incasinano tutto, ora pensavo di usare l'istruzione if in modo che attivi l'uscita solo se il
Bisognerebbe vedere il codice ma supponiamo che l'esecuzione del loop sia abbastanza veloce, e quell'istruzione "if" venga eseguita molto spesso. Se il valore di t cade nell'intervallo nel momento sbagliato
l'intenzione. Per questo occorre sempre o un debounce efficiente via hardware oppure tutte le varie precauzioni che "giassai" ^_^
lo saranno negli effetti del tuo programma ma non sono la stessa cosa, andando a naso, MOLTO a naso il tuo problema e' come gestisci t: per capirci, non e' che quel codice, una volta che T ha raggiunto il valore richiesto viene eseguito piu volte ?
esempio:
premo il bottone, T inizia a incrementare: T arriva al valore soglia di 100, il mio codice che prima non eseguiva "digitalWrite(12, HIGH)" esegue, T sta continuando ad aumentare, e il mio codice diligentemente attiva nuovamente digitalWrite(12, HIGH) per tutte le volte che esegue il blocco di istruzioni.
imo devi metter un "antirimblazo" anche nel software, che valuti T SOLO quando t e' stato rilasciato e SOLO se nessun altro controllo su T e' stato fatto:
premo il pulsante: inizio ad incrementare T e contemporaneamente XY. (T e XY hanno lo stesso valore a pulsante premuto), quando rilascio il pulsante, azzero SOLO T, eseguo il controllo del valore di XY SOLO quando T e' a 0 e una volta fatto il controllo azzero anche XY.
tipo:
if (pulsante premuto) { t++ xy++ }
if (pulsante NON premuto) { t = 0 }
if (t = 0 && xy != 0) { // esegui il controllo solo dopo il rilascio if (xy > 100) { // solo se superiore a 100 if (xy < 1000) { digitalWrite(12, HIGH); // meno di un secondo } else { digitalWrite(12, HIGH); // piu di un secondo } } // in ogni caso, avendo fatto il controllo // si deve azzerare l' "antirimbalzo" software xy xy = 0 }
implicazioni che al momento non vedo. Con i float io sono
della variabile abbia una qualche imprecisione per cui definisco un TOL tipicamente dieci alla meno qualcosa, formulo la condizione in termini di differenza e tutti i miei confronti sono tipo if( fabs(x-xo)
Nel suo scritto precedente, Archaeopteryx ha sostenuto :
Se fossimo ancora ai tempi dello z80 significherebbe anche qualche preziosissimo ciclo macchina in meno ma come ho detto e' "solo" piu pulito da leggere e non fa vera differenza; ciononostante evitare istruzioni ridondanti o superflue e' sempre buona pratica.
Da quello che vedo nel codice hai questo comportamento:
- appena premi il tasto il pin 12 va' HIGH;
"protetta" dal debouncing)
12 a HIGH nel primo if; dentro all'if compreso fra 100 e 1000 reimposti di nuovo il pin 12 a HIGH, quindi in pratica l'if fra 100 e 1000 non ha effetto;
appena rilasci il pulsante, sempre per effetto del bouncing, ti viene reimpostato a HIGH nel primo if
int stato; int conteggio;
const int PREMUTO = 1; const int RILASCIATO = 0; const int ON = HIGH; const int OFF = LOW;
Ciao e grazie per l'interessamento, il mio sketch funziona bene, solamente qualche volta, in base ai rimbalzi del pulsante, prende il tempo basso e di conseguenza lascia attiva l'uscita 12. Praticamente se il pulsante non avesse rimbalzi, il tutto sarebbe
Ho provato anche in questa maniera ma quando avviene il rimbalzo lo
rimbalza in apertura legge sempre meno di 1000 e lascia attiva l'uscita.
pulsante, esegue quello che deve fare, e lo fa bene, chiaramente il loop legge sempre lo stato del pulsante e durante i rimbalzi il loop riesce a fare anche qualche ciclo quindi se legge un valore basso (tipicamente un rimbalzo l'ho sempre letto da 1 a 10mS) esegue quello che deve fare col valore basso.
L'istruzione if scritta in quella maniera non delimita la lettura tra
tutto fino a zero. Questo ho capito, speravo esistesse una funzione che permettesse realmente di utilizzare un valore ben delimitato.
semplice) altrimenti sto provando a costruire con la stampante 3D un pulsante con sensore hall, vediamo come viene :-)
apertura non cambia nulla ma come ho detto non sono in grado di valutarlo, mi ci vuole ancora un po di tempo e di esperimenti :-)
A pulsante non premuto contatore =0 B pulsante premuto contatore ++1
rischi di non poter distinguere se il pulsante sta rimbalzando o e' una singola pressione continua, ma se consideri:
A pulsante premuto X msec fa e ancora premuto
C pulsante non piu premuto
dovresti "intrappolare" sia l'evento "premo il pulsante" che l'evento "ho rilasciato il pulsante", nell'esempio che ti ho fatto se consideri T e XY come eventi le combinazioni possibili sono le 4 sopra descritte.
t !=1 e xy !=1 ? --> condizione A t =0 ma xy !=1 ? --> condizione B t =0 e xy = 0 ? --> condizione C
ho visto il tuo codice ora e forse ho identificato un errore di logica legato al non azzerare mai i contatori, ora devo mettere letto il pupo ma ci do un'occhiata stanotte, tempo permettendo che ho un po' di lavoro da fare.
Dopo dura riflessione, Drizzt do'Urden ha scritto :
const int PREMUTO = 1; const int RILASCIATO = 0;
quindi PREMUTO ha valore' 1 e RILASCIATO ha valore zero, qua tutto ok ma poi prosegui con:
const int ON = HIGH; const int OFF = LOW;
cos'e' HIGH ? se non gli hai dato valore prima allora HIGH e' uguale a zero o peggio void (non conosco cosi bene il dialetto di arduino) quindi come per OFF e' come se scrivessimo
funzioni/istruzioni come fosse un valore, non mi stupirei di scoprire che se il risultato non e' zero e' il risultato di un confronto logico tra l'ultima lettura del pin e l'implicito true/false del tipo:
--> ultima lettura del pin ritorna HIGH
const int ON = HIGH //stato del pin = high quindi TRUE quindi ON = true
--> ultima lettura del pin ritorna LOW
const int ON = HIGH //stato del pin = low quindi FALSE quindi ON = false
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.