ciao
sto programmando un arduino che riceve dati di un sensore di temperatura normale (non seriale) , e una fotoresistenza.
con un altro arduino voglio leggere i dati di questi sensori.
quindi il primo invia in seriale al secondo , e dal secondo lo leggo dal pc (dal serial monitor)
A1 --s--> A2 --s--> PC (serial monitor dell'ide)
ho istallato la libreria NewSoftSerial per ottenere due seriali sul ricevente A2
PROBLEMA: come invio i dati che ricevo dai sensori?
posso spedire un array? un elenco in cui conosco io l'ordine dei dati?
ho fatto delle prove ma ricevo sempre dati sballati, ho cercato ma non riesco a capire dagli esempi dove sbaglio.
come lavora la seriale ? con i byte
grazie mille
S.
Cmq, secondo me puoi fare così. Sul 1° Arduino (il "sensore"), metti una SoftSerial con cui mandare i dati al 2° Arduino (il "trasmettitore") metti un'altra SoftSerial per poter comunicare col Sensore.
Il Trasmettitore è poi collegato al PC tramite cavetto USB, quindi seriale "fisica".
Ricordati che devi incrociare i collegamenti, ovvero TX e RX del 1° Arduino rispettivamente su RX e TX del 2° Arduino.
il sensore di temperatura non è seriale , giusto un analog pin
mi sembra che hai descritto quello che ho montato io.
A1 --seriale–> || <(softSerial1) A2 (Serial)> || — ser.–> PC
La seriale trasmette byte in formato binario. Puoi inviare più byte, certo.
Qui trovi la spiegazione di come opera e dei comandi che accetta:
http://arduino.cc/en/Reference/Serial
Dipende cosa e come invii.
Se invii 1 byte alla volta, devi leggere 1 byte. Se invii 5 byte ne devi leggere 5. Va visto il protocollo di trasmissione che stai usando.
Serial.available ti dà il n° di byte in arrivo, che poi leggi con Serial.read.
Dopo devi ricomporre i valori.
Ricordati anche di usare la stessa velocità altrimenti vedrai caratteri senza senso.
quando invii numeri, essi vengono trasformati in char se non espressamente detto alla print di non farlo. Quindi quello che devi fare è una riconversione char a numero.
Se anche decidessi di inviare il valore numerico puro, sappi cheun intero è più grosso di un byte (mi pare due byte), quindi devi leggerlo tutto prima di poterlo usare
Serial.print(10,DEC);
stai inviando 2 interi, ovvero 4 byte.
leggo (preso da un esempio)
Serial.print((char)mySerial.read());
prindi il primo byte, (che sarà tipo 00000000), lo trasformi in char (guarda la tabella ascii in posizione 0) e lo stampi. Risultato? bel casino
Serial.print( mySerial.read(), DEC);
quì ci stiamo avvicinando, ma stai usando sempre un byte quando l’integer è fatto di 2, prima devi leggere entrambi i byte!
quindi in lettura sarebbe
if ( Serial.avaiable() >= sizeof(int) )
int i=0;
byte lettura[sizeof(int)];
for (i=0;i<sizeof(int);i++){
lettura*=Serial.read();* } a questo punto devy prendere i BIT che hai raccolto nell’array di byte e sbatterli in un int
ho fatto altre prove e penso che non si sincronizza per via di alcuni delay messi nel A1, e non riesco a allineare.
ma se non uso delay nei due Arduino, la sincronizzazione è sicura ? (a stesse velocità baud)