contatore

tuxduino:
sto leggendo Code Complete 2 e sono un tantino invasato :wink:

:sweat_smile:

@tuxduino

Infine è "semanticamente" più corretto scrivere if (digitalRead(pin) == HIGH) invece di if (digitalRead(pin)).

perchè dici che è semanticamete più corretto? forse rende il codice più leggibile ma sia sintatticamente che semanticamente a me sembra corretissimo. L'if controlla se la clausola è vera o falsa. Nel primo modo si controlla che il valore di ritorno di una funzione (che in questo caso può essere o vero o falso), sia vero. Nel secondo faccio valutare all'if direttamente il valore di ritorno della funzione. Non credo sia vero che sia più o meno corretto...a meno che non mi linkate un qualcosa tipo "regole della buona programmazione di Ritchie" o qualcosa di simile e mi smentite alla grande! Penso anche alla forma contratta dell'if con l'utilizzo dell'operatore ternario "?". E' semplicemente un altro modo di scriverlo. Che ne dite?
N.

Concordo. Alla fine un if è un test per verificare se una condizione è vera o falsa. Un test di uguaglianza con un valore 1 o 0 altro non è che un test di verifica se la variabile o la risorsa è vera o falsa, è a 1 o è a 0.
HIGH è una define che viene sostituita con 1. Quindi digitalRead(pin)==HIGH equivale a chiedere se digitalRead(pin)==1 che non è altro che controllare se il bit rappresentante lo stato del pin è su alto o basso, cioè 1 o 0.
E' come quando si fanno confronti con i booleani, if(boolVariabile): anche in questo caso è un confronto implicito con 1, o true che dir si voglia: if(boolVariabile == true)

(C'è stato recentemente un thread nel forum in inglese in cui gente molto più preparata di me ha letteralmente "spaccato il capello in 4" (o 8, 16, ecc.))

if (boolean) è semanticamente corretto perché if si chiede se la condizione è vera o falsa. Il fatto che true e false vengano o meno risolte in 1 o 0 è irrilevante.
if (digitalRead(pin)) è semanticamente scorretto perché è come chiedersi if (int). Un interno è vero o falso ? Non ha senso. E' una domanda che evidentemente non ha senso. Mentre ha senso chiedersi se un intero vale 1 oppure no.

All'atto pratica la mia osservazione era legata solamente ad una maggiore leggiblità del codice (IMHO, ovviamente).

Mi scuso per aver sollevato questo vespaio, chiudiamola qui prima di scannarci per un nonnulla :smiley:

Non è vero che non ha senso. Nel C++ solo lo 0 è considerato false, tutti i numeri con valore pari ad 1 o superiore, sono considerati true.
Quindi considerare e comparare il valore di un pin, che nel digitalRead viene restituito come byte con valore 0 o 1, come 0 o 1 è corretto.

we we we we..nessuno vuole scannare nessuno! :fearful: era solo per discutere, ognuno ha espresso le proprie opinioni in maniera più che civile, mi sembra. Hai detto bene tu, è un nonnulla ed argomento di scarsissima rilevanza. Capisco la posizione che hai espressso e mi sembra coerente e solida. Solo che io sono di quelli che fa fatica a perdere le abitudini (sopratutto quelle cattive ]:)) e mi sa che continuerò ad usare questa forma, che, non ci crederete a me sembra anche più elegante. :smiley:

Ma anche da parte mia c'è solo una discussione fra amici. :wink:
Solo spiego alcune mie idee e dico la mia sulle idee degli altri.

Anch'io sono per la forma contratta, difatti ad esempio io una bool la testo falsa con if(!variabile), la preferisco a if(variabile == false).

Ehi, c'era una faccina di fianco a "scannarci" :slight_smile:

tuxduino:
Ehi, c'era una faccina di fianco a "scannarci" :slight_smile:

Ma difatti così dev'essere. A me piace discutere e confrontare le idee. :wink:

Anch'io sono per la forma contratta, difatti ad esempio io una bool la testo falsa con if(!variabile), la preferisco a if(variabile == false).

:astonished:

Forse intendevi dire che preferisci if (!variable) ?

bene bene :slight_smile: vedo che questo topic vi ha dato lo spunto per scambiare due chiacchiere :smiley: top

mi è venuto un piccolo dubbio... è possibile che ogni volta che premo il bottono non c'è incremento o decremento finchè non lascio e non ripremo il pulsante?

penso si altamente fattibile ma devo aggiungere una variabile stato e old_stato per ogni pulsante??

grazie

devo aggiungere una variabile stato e old_stato per ogni pulsante?

Certamente.

tuxduino:

Anch'io sono per la forma contratta, difatti ad esempio io una bool la testo falsa con if(!variabile), la preferisco a if(variabile == false).

:astonished:

Forse intendevi dire che preferisci if (!variable) ?

E' quello che ho scritto. :stuck_out_tongue:

Ah, hai ragione. E dire che l'ho letta e riletta :roll_eyes:

Ciao

il problema è: non cambiare il numero del contatore se il pulsante resta premuto
soluzione ( secondo me ) : conservare lo stato del pulsante.

ok, ma come?

potete darmi qualche dritta su come evolvere lo sketch? ( NO SOLUZIONE )

sono entrato in confusione.

Devi usare una variabile per memorizzare lo stato del pulsante nel precedente ciclo di campionamento:

int prevButtonState;

Poi all'interno di loop, ma sottoposto al controllo di millis() per non campionare lo stato del pulsante troppo spesso (vedi il più volte citato blink without delay), usi una logica tipo questa:

currButtonState = digitalRead(buttonPin);

if (currButtonState != prevButtonState) {    // il pulsante ha cambiato stato
    if (currButtonState == HIGH) {
        // il pulsante è passato da LOW a HIGH
    }
    else {
        // il pulsante è passato da HIGH a LOW
    }
    prevButtonState = currButtonState;    // aggiorna per il prossimo ciclo
}

Cosa scrivere al posto dei commenti lo decidi tu in base a come vuoi che il sistema si comporti. Ad esempio se il pulsante è attivo basso (LOW quando premuto) e vuoi incrementare il contatore al suo rilascio, scriverari contatore++ al posto del commento "da LOW a HIGH".

Grazieeeeeeeeeeeeeee :slight_smile:

Stavo facendo una cosa del genere però non avevo messo prevButtonState = currButtonState; // aggiorna per il prossimo ciclo e quindi non mi veniva

grazie a tutti

:slight_smile:

Ciao ragazzi

sicuramente dovrei aprire un nuovo topic ma poichè quello che sto per chiedere è quasi collegato al mio contatore posto qui ( in caso apro un nuovo topic ) :stuck_out_tongue:

è possibile misurare la variazione di un angolo con Arduino? se sì con quale oggetto?

Io stavo pensado a questa fantastica follia. Poichè si tratta di misurare l'angolo di un oggetto fisso al centro ma che ruota per brevi archi in senso orario o antiorario pensavo di collegarci un potenziometro e leggere i vari valori di tensione ( ovviamente opportunamente mappati ) ... ripeto è una mia fantastica follia.

voi che pensate?