Inviare stringa da arduino tramite porta seriale

Buongiorno, devo inviare i dati di diversi sensori da arduino a processing.

Ho immagazzinato il valore di ogni sensore in una stringa, poi ho sommato tutte le stringhe dei diversi sensori in un'unica stringa.

Se stampo quest'ultima stringa sul monitor seriale di Arduino va tutto bene; ma se provo a inviare la stringa con la porta seriale mi da errore.

Sto impazzendo, se avete la soluzione al problema o sapete qualche altro metodo per inviare più dati via seriale proponete
Grazie Enrico

enricocirignaco:
ma se provo a inviare la stringa con la porta seriale mi da errore.

Che errore? Chi lo restituisce?

Si la stringa non è sicuramente il contenitore migliore per inviare informazioni da un software ad un altro, sarebbe meglio inviare i dati in singoli byte, senza la formattazione di una stringa.
Definisci una struttura di dati, la riempi con i tuoi dati e dopo di che la invii serialmente come un array di byte.

enricocirignaco:
Se stampo quest'ultima stringa sul monitor seriale di Arduino va tutto bene; ma se provo a inviare la stringa con la porta seriale mi da errore.

?? che ?!?
Il monitor seriale legga da usb e quindi da seriale (infatti si chiama Monitor SERIALE)
Arduino quale ? La Uno ha 1 seriale, Leonardo ha 2 seriali, la Mega 4 seriali

Ho un Arduino uno rev. 3; se scrivo "Serial.println(stringa);" Arduino esegue il programma senza nessun problema.
Se scrivo "Serial.write(stringa);" mi da questo errore:
"dht22:24: error: no matching function for call to 'HardwareSerial::write(String&)'"

Per forza, la write() invia un byte o una stringa (classica del C non un oggetto String)

Evita le String e usa le stringhe classiche del C (ovvero array di char terminati da null '\0')

se può servire questo è lo sketch:

#include "DHT.h"
 
#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
 DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  Serial.begin(9600); 
  dht.begin();
}
 
void loop() {
  
  //leggi il valore dell'umidita dal sensore
 String h =String(dht.readHumidity());
  //leggi il valore della temperatura dal sensore
 String t =String(dht.readTemperature());

 
String T = String("temperatura" + t);
String H = String("humidita" + h);
String data = String(T + H);
 
Serial.write(data);

  delay(1000);
 
}

immagazzinare i valori in dati char lo so fare, ma come devo fare a inviarli con gli array?

Usa un array di char adeguato come dimensione a contenere il msg.
Poi usa snprintf() per scriverci dentro e poi fai la write() di quel array, ma non accetta i float, quindi anche necessario usare dtostr(): http://dotnetside.org/blogs/pixel/archive/2013/03/12/arduino-utilizzo-di-dtostrf-e-sprintf.aspx

Oppure prima della write() converti la String in array di char con la funzione .getBytes()

char str[30];
...
data.getBytes(str,30);
Serial.write(str);

Io (come molti altri) consiglio di creare una union (su entrambi i software, Arduino e Processing) contenente una struttura e una matrice delle stesse dimensioni, cosi facendo in fase di manipolazione dati inserisci questi nella struttura e in fase di invio basta passare la matrice al metodo write, una volta ricevuti, i dati vengono salvati nel'array cosi la struttura acquisirà i valori dei dati passati, senza tanti giri di parsing. Ci si semplifica non di poco la vita.

E' tutto il giorno che sto impazzendo per questo problema, c'è chi dice di creare delle stringhe, chi degli array char, ecc.. ma comunque non sono riuscito ancora a mandare i due dati da arduino e leggerli da processing.

se c'è qualcuno che mi può aiutare scrivendomi il codice commentato mi farebbe un gran favore;
non ha importanza quale metodo usi, importante che funzioni!

Ps. allego il codice arduino che ho scritto, mi sono bloccato perchè non so come inviare un array e come riceverlo su processing.
grazie

#include "DHT.h"
 
#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
 DHT dht(DHTPIN, DHTTYPE);
 int data [10];
void setup() {
  Serial.begin(9600); 
  dht.begin();
}
 
void loop() {
  
  //leggi il valore dell'umidita dal sensore
 float h = dht.readHumidity();
  //leggi il valore della temperatura dal sensore
 float t = dht.readTemperature();
 
 //converti il valore del'umidita da float a int
 int H = h*10;
  //converti il valore della temperatura da float a int
 int T = t*10;

 //inserisci i valori nell'array
 data[0] = H;
 data[1] = T;

 Serial.write(data[0]);

delay(1000);
}

Giuro che creerò un pdf con una guida sull'argomento, credo che sia la domanda piu posta in assoluto dopo quelle sulla domotica.
Allora creai una union

union {
  struct{
    byte a1;
    int b2;
    byte c3;
    unsigned int d4;
  } str;
  byte arr[6];
} frame;

Cosa vuol dire union, te lo spiego subito. Vuol dire che tutto quello che viene dichiarato al suo interno viene allocato nella stessa area di memoria, infatti la struct str deve essere della stessa dimensione dell'array arr. quando io scrivo

frame.str.a1 = 5;

ritroverò lo stesso dato non solo in frame.str.a1 ma anche in frame.arr[0].
Cosa comporta questo? Comporta il fatto che io posso andare a compilare i campi nella struttura e all'occorrenza avrò una versione serializzata di byte disponibile nell'array arr.
Detto questo continuiamo

frame.str.a1 = 15;
  frame.str.b2 = 1600;
  frame.str.c3 = 1;
  frame.str.d4 = 64;

Vado ad inserire i dati nella struttura

Serial.write(frame.arr, 6);

e la invio sfruttano l'array arr.
Dall'altra parte avrò una union identica, quindi mi basterà ricevere i dati ed inserirli in arr per ritrovare nella struct i dati inviati.
Capito? Semplice no? Le stringhe dimenticatele per inviare le informazioni, non lo dico spesso ma chi usa stringhe per inviare dati a questi livelli vuol dire che non ha capito nulla di macchine.

Edit:
Modificato l'esempio come consigliato da nid per renderlo di piu facile comprensione.