seriale o non seriale

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.

Perché non puoi fare tutto con un unico Arduino?

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.

qualche chiarimento

  • l’A1 è un arduino autocostruito
  • 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

grazie, ho capito come inviare , ma penso mi dia errore nella lettura avete qualche esempio? thanks

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

invio Serial.print(10,DEC);

leggo (preso da un esempio) Serial.print((char)mySerial.read());

255

leggo (modificato da me) Serial.print( mySerial.read(), DEC);

numeri che cambiano

non capisco . mi manca qualcosa nella teoria ad esempio ename = string.char(0x20) .. ename .. string.char(0x43, 0x41, 0x00) che significa? grazie

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 :slight_smile:

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

ah grazie mille lesto

lesto:
Serial.print(10,DEC);
stai inviando 2 interi, ovvero 4 byte.

2 interi ?? 1 e 0 ?

lesto:
if ( Serial.avaiable() >= sizeof(int) )

sizeof(int) ci metto 2 , oppure lo fa da solo ? o è un numero che so io a priori?

ma se devo inviare piu valori insieme, tipo 4 numeri diversi, posso inviare e ricevere un array?

stasera provo a ricevere i dati con questa libreria http://arduino.cc/playground/Code/Messenger

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)

stefanosky: ah grazie mille lesto

lesto: Serial.print(10,DEC); stai inviando 2 interi, ovvero 4 byte.

2 interi ?? 1 e 0 ?

mia confusione, 1 intero

stefanosky:

lesto: if ( Serial.avaiable() >= sizeof(int) )

sizeof(int) ci metto 2 , oppure lo fa da solo ? o è un numero che so io a priori?

sizeof() è una funzione che ti ritorna la grandezza in byte di un TIPO di variabile

stefanosky: ma se devo inviare piu valori insieme, tipo 4 numeri diversi, posso inviare e ricevere un array?

si, semplicemente i byte inviati saranno sizeof(int)*grandezza array

comuqnue se usi la libreria, già che ci sei dai un'occhiata al codice così vedi che soluzione ha scelto, e magari ti chiarisci anche le idee :-)