Ciao a tutti... mi sto un po' ingarbugliando coi casting e coi tipi di dati...
fondamentalmente voglio acquisire un valore da un ingresso analogico di arduino, convertirlo nel range 0...255 e inviarlo sotto forma di singolo byte (che è unsigned) tramite seriale.
prima domanda: che tipo di dato restituisce constrain? int? unsigned int? nella documentazione non c'è scritto
seconda domanda: funzionerà mai il casting a byte? constrain è come penso un int, non rischio che i numeri maggiori di 127 vengano convertiti "male" durante il casting a byte che è unsigned?
alla fine è stato più semplice provandolo (e analizzando i singoli bit con bitRead). risultato? funziona!
morale, il casting di un (signed) int che contiene numeri da 0 a 255 ad un (unsigned byte) si può fare direttamente
Il compilatore sotituisce l'espressione sopra, ogni volta che la richiami nello sketch. Sempre il compilatore, in ciascuino dei confronti fa delle conversioni implicite di tipo e quello che passi agli argomenti low e high viene convertito nello stesso tipo di dato di amt.
Nel tuo caso come argomento "amt" passi la funzione map che ritorna un long, quindi il confronto avverrà tra long.
Dato che constrain per come l'hai scritta ti garantisce di non sforare la dimensione massima di un byte, non hai bisogno di fare nessun cast esplicito
byte data = constrain(map(analogRead(photorPin), PHOTOR_MIN, PHOTOR_MAX, 0, 255), 0, 255)
È tutto chiaro tranne il punto in cui dici che constrain non è una funzione. Come fa il compilatore a sapere il valore della variabile se ancora deve essere letta da analogRead?
Edit:lascia stare tutto perfetto, ho capito dopo
Edit2: mi confermi però che con la tua soluzione c'è un casting implicito da long a byte? E in questo caso per me non era così ovvio che si potevano fare casting tra signed ed unsigned...