Salve
Ho un problema con una routine di lettura di pulsanti analogici. Ho creato questa funzione che mi restituisce il numero del pulsante premuto per poi fare lo scroll in un vettore.
int lettura_pulsante()
{
int Value = analogRead(A0);
if (Value > 896) return 0;
if (Value < 896 && Value > 768) return 1;
if (Value < 768 && Value > 640) return 2;
if (Value < 640 && Value > 512) return 3;
if (Value < 512 && Value > 384) return 4;
if (Value < 384 && Value > 256) return 5;
if (Value < 256 && Value > 128) return 6;
if (Value < 128 && Value > 64) return 7;
if (Value < 64) return 9;
}
Tuttavia mi sono accorto di alcuni errori. Per esempio, se rimuovo la dichiarazione if(Value < 64) la funzione continua a restituirmi 0 come valore e di conseguenza la funzione che legge l'array non funziona correttamente. Probabilmente il mio è un errore banale, ma se qualcuno volesse aiutarmi ne sarei grato.
Se non premi nessun pulsante immagino tu abbia una resistenza verso +5V, quindi leggerai un valore alto (1023) per cui quella funzione se restituisce 0 per te significa "nessun pulsante premuto".
Se hai messo 8 pulsanti, quando premi l'ottavo avrai un valore molto basso, generalmente zero se mandi a GND, per cui a che ti serve quell'ultimo "if" (e tra l'altro perché 9 e non 8?)?
Ti dovrebbe bastare fare così:
int lettura_pulsante()
{
int Value = analogRead(A0);
if (Value > 896) return 0;
if (Value < 896 && Value > 768) return 1;
if (Value < 768 && Value > 640) return 2;
if (Value < 640 && Value > 512) return 3;
if (Value < 512 && Value > 384) return 4;
if (Value < 384 && Value > 256) return 5;
if (Value < 256 && Value > 128) return 6;
if (Value < 128 && Value > 64) return 7;
return 8;
}
Beh si, era un controllo inutile, ma a funzionare funziona lo stesso (quindi "ma anche si" ), in ogni caso era per chiarire all'amico quale fosse il "problema"...
Anzitutto grazie per le risposte chiare e tempestive.
C1P8:
Ma anche no
int lettura_pulsante()
{
int Value = analogRead(A0);
if (Value > 896) return 0;
if (Value > 768) return 1;
if (Value > 640) return 2;
if (Value > 512) return 3;
if (Value > 384) return 4;
if (Value > 256) return 5;
if (Value > 128) return 6;
if (Value > 64) return 7;
return 8;
}
il caso prima di ogni and in realtà è già escluso dallo if precedente
Questa cosa dell'if effettivamente non mi era passata per la mente, però essendoci il return ha senso e dovrebbe anche essere più leggero il codice.
docdoc:
Se non premi nessun pulsante immagino tu abbia una resistenza verso +5V, quindi leggerai un valore alto (1023) per cui quella funzione se restituisce 0 per te significa "nessun pulsante premuto".
Se hai messo 8 pulsanti, quando premi l'ottavo avrai un valore molto basso, generalmente zero se mandi a GND, per cui a che ti serve quell'ultimo "if" (e tra l'altro perché 9 e non 8?)?
Ti dovrebbe bastare fare così:
int lettura_pulsante()
{
int Value = analogRead(A0);
if (Value > 896) return 0;
if (Value < 896 && Value > 768) return 1;
if (Value < 768 && Value > 640) return 2;
if (Value < 640 && Value > 512) return 3;
if (Value < 512 && Value > 384) return 4;
if (Value < 384 && Value > 256) return 5;
if (Value < 256 && Value > 128) return 6;
if (Value < 128 && Value > 64) return 7;
return 8;
}
In realtà con l'ultimo pulsante ho un valore di 120, perchè tra quello e GND ho collegato una resistenza. Il valore 9 l'ho scelto a caso, era giusto per vedere se funzionasse o meno.
Il circuito ha una resistenza di pulldown per il pin analogico, quindi con 0,1,2... ecc intendo proprio il numero del pulsante premuto.
Il codice funziona perfettamente, grazie. +1 karma ad entrambi
Curiosità: una funzione di tipo int, se non viene specificato un valore di return, che valore restituisce? Uno casuale o 0?
Mattia9914:
Questa cosa dell'if effettivamente non mi era passata per la mente, però essendoci il return ha senso e dovrebbe anche essere più leggero il codice.
Si, pochi byte comunque...
In realtà con l'ultimo pulsante ho un valore di 120, perchè tra quello e GND ho collegato una resistenza.
E per qual motivo? (cit. Aldo, Giovanni e Giacomo)
Non succede mica nulla se lo mandi a GND, leggi sicuramente zero....
Mattia9914:
Curiosità: una funzione di tipo int, se non viene specificato un valore di return, che valore restituisce? Uno casuale o 0?
In generale, le funzioni devono sempre restituire un valore "noto" per poterlo gestire correttamente nella procedura chiamante.
Nello specifico di Arduino, onestamente, non so come si comporta il compilatore (adesso non riesco a provare), ma in altri ambienti, se la funzione non restituisce un valore, non compila o fornisce un warning.
Mattia9914:
Curiosità: una funzione di tipo int, se non viene specificato un valore di return, che valore restituisce? Uno casuale o 0?
Se dichiari che una funzione deve ritornare qulche cosa e poi non effettui il return di un valore, normalmente il compilatore da un errore. Ad esempio se dichiari una funzione 'int' e poi fai solo 'return' senza valore, su Arduino avrai:
error: return-statement with no value, in function returning 'int' [-fpermissive]
return;
^
exit status 1
return-statement with no value, in function returning 'int' [-fpermissive]
gpb01:
Se dichiari che una funzione deve ritornare qulche cosa e poi non effettui il return di un valore, normalmente il compilatore da un errore. Ad esempio se dichiari una funzione 'int' e poi fai solo 'return' senza valore, su Arduino avrai:
Si, perché è un errore evidente, ma se la funzione la fai "morire sotto al tram" (ossia chiudi la graffa senza fare alcun "return") credo che il compilatore non se ne accorga e restituirà un valore random come se non avessi inizializzato una variabile. O sbaglio?
... NO, se ometti del tutto il 'return', non viene generato un errore, ma un warning ...
warning: no return statement in function returning non-void [-Wreturn-type]
}
... ed il valore di ritorno NON è garantito (il valore di ritorno normalmente è un registro e quindi ... probabilmente viene preso il valore che si trovava l'ultima volta in quel registro che, può essere 0, ma può essere anche altro valore).