Domanda su Serial.read

Salve a tutti avrei una domanda forse banale ma di cui non ho trovato risposta...

Se utilizzo un arduino + Xbee per inviare alla seriale il valore di un pot (convertito in un valore compreso tra 0 e 255) Nell'Xbee ricevente (con annesso arduino) ottengo un valore utilizzabile come int? e magari per il valore di un PWM?

per esempio se nel ricevente scrivo:

int data = 0;

void setup() { Serial.begin (9600); }

void loop() { data=Serial.read();

}

data avrà un valore utilizzabile? è necessaria una conversione? (da ascii o da altro?) grazie

si, ma attento: l'xbee invia char, quindi byte, quindi valori tra 0 e 254. se ti servono altri valori, ti tocca lavorare un poco con conversioni, o da stringa (facile e inefficiente), o laorando di bitshift

che differenza c'è tra un valore come char ed un come int? per ora mi sta benissimo un valore tra 0 e 254 sto facendo solo delle prove di apprendimento

un char (byte) sono 8bit, quindi i valori massimi che può assumere sono 2^8 = 256 (-1 perchè anche lo 0 è un valore, quindi il range è da 0 a 255, oppure -128 +127 se è usa i numeri negativi)
l’int invece sono 16bit, quindi 2^16=65536 valori massimi, da 0 a 65535 per gli unsigned (senza segno), e -32768 a 32767 se signed. Int di base è signed, quindi se si vuole unsigned devi scrivere “unsigned int nomeVariabile”. Per esempio, la millis e la micro usano un unsigned long, perchè il tempo è sempre positivo…

come puoi notare, per inviare un int come byte, ne servono 2… oppure trasformi il numero intero in una stringa, dove ogni numero è un carattere + il carattere di fine stringa ‘/0’.
se invii un int come byte con lo bitshift, impieghi sempre 2 byte.
se lo invii come stringa impieghi dai 2 byte (numero ad una cifra quindi 0<=x<=9 + ‘/0’) ad un massimo di 6 byte (un byte per ogni cifra, che al massimo sono 5, + ‘/0’)

ps. scusami, prima ho scritto 254 per errore, il valore massimo è 255 come spiegato nella prima riga di questo messaggio.

Ok adesso ho finalmente capito la differenza tra char e int.
però allora non capisco perchè non mi funziona
posto gli sketch che ho utilizzato.
Li ho riscritti adesso ma non potendo controllare forse potrebbero esserci degli errori di sintassi

TRASMITTENTE

int value = 0;
int incremento = 0;

void setup()
{Serial.begin. (9600);
}

void loop ()
{
if (value >= 255 || value <= 0) {
incremento = - incremento;}
value = value + incremento; //con questo mi genero questo valore che sale e scende

Serial.println (value); //lo invio al seriale
delay(50)
}

RICEVENTE

int data = 0;
int ledPin = 10;

void setup()
{
Serial.begin(9600);
pinMode (10, OUTPUT);
}

if (Serial.available() > 0) {
data = Serial.read();
}
analogWrite (10, data);

}

il mio scopo sarebbe semplicemente quello di ricreare lo sketch di esempio del fade trasmettendolo tramite xbee

EDIT:
mi sa che ho sbagliato ad usare Serial.print piuttosto che Serial.write giusto?

no, lo sbaglio è che usi println al posto di print. print stampa solo il tuo valore, println stampa il tuo valore + il carattere "a capo" '\n', che ha un certo valore numerico secondo l tabella ascii. Quindi se invii 100, per esempio, in realtà invii 100\n, la ricevente al primo loop esegue 100 (corretto) e quello dopo esegue il \n(sbagliato). Un loop dura al qualche decina di microsecondi, quindi è invisibile ad occhio umano l'esecuzione del valore corretto, ma rimane visibile sono quello errato.

credo che write e print siano due nomi per la stessa funzione.

finalmente sono riuscito ad ottenere quello che cercavo però ci sono delle stranezze che non capisco....

ho usato il codice postato sopra sostituendo Serial.println con Serial.print nel monitor del trasmittente e nel terminale X-CTU del ricevente ottengo il valore numerico ma se lo assegno ad un pin pwm non funziona

allora ho sostituito Serial.print con Serial.write e: nel monitor del trasmittente ottengo praticamente la tebella ascii (tutti i caratteri e agli estremi solo dei puntini) nel terminale X-CTU del ricevente ottengo la stessa cosa (quindi lettere e tutti i vari caratteri) ma stavolta se lo assegno ad un pwm mi funziona perfettamente.

è una cosa normale? perchè non ne capisco il senso.