Unire e spedire dati su seriale

Ciao a tutti, sto cercando di interfacciare vari sensori collegati all'arduino con il mio computer per poi fare l'output di dati su processing. Volevo chiedervi una cosa:
Io ho queste variabili sull'arduino:

int a1 = 235;
int a2 = 865;
int a3 = 457;
int a4 = 1;
int a5 = 687;
int a0 = 1023;

come faccio a spedirli tutti in una sola volta permettendo così a processing di dividerli con la funzione split()? Come creo una stringa che contenga tutti questi valori per poi mandarli sulla seriale in una sola stringa?

Spero che mi sono fatto intendere :)... Bye bye e grazie.

Se stai cercando di creare una stringa con dei numeri dentro dai un'occhiata a questo

Se non vado errato basta che cri una stringa vuota e poi "appendi" i vari valori:

String stringa="";
for (int i=0,i=5,i++){
char sensore='a'+char(i);
stringa += char(sensore);
}
Serial.println(stringa);

Spero serva(ma soprattutto spero sia giusto XD)

Grazie per le risposte tempestive :), ho provato questo codice:

int a0;
int a1;
int a2;
int a3;
int a4;
int a5;

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

void loop() {
  a0 = analogRead(A0);
  a1 = analogRead(A1);
  a2 = analogRead(A2);
  a3 = analogRead(A3);
  a4 = analogRead(A4);
  a5 = analogRead(A5);
  
  String stringOne = String(a0 + "," + a1);
  stringOne = String(stringOne + "," + a2);
  stringOne = String(stringOne + "," + a3);
  stringOne = String(stringOne + "," + a4);
  stringOne = String(stringOne + "," + a5);
  
  Serial.println(stringOne);
}

Le mie aspettative erano che avrebbe continuato a stampare su seriale la stringa, ma l'unica cosa che ottengo dalla seriale è:

,45Ïí,43þ

neanche ripetuto.
Proverò con il codice di Francesco94 ora.

EDIT:
Ho provato a eseguire il codice di Francesco94 (che sinceramente non capisco) in questo modo:

int i;

void setup() {
  Serial.begin(9600);
}
void loop() 
{
  String stringa="";
  while (i < 5){
    char sensore='a'+char(i);
    stringa += char(sensore);
    i++;
  }
  Serial.println(stringa);
}

ma la seriale mi stampa il nulla, ovviamente ripetuto all'infinito. Come se la variabile fosse vuota, nell'attesa di vostre risposte leggo il link che mi ha passatoIngHooch
EDIT: che dice le stesse cose dell'arduino Learning. In attesa di vostre risposte farò altre prove

Ok, ci sono riuscito. Ho leggermente riadattato il codice di Francesco94 sino a farlo diventare questo:

//Inizializzo le variabili per lo store dei valori analogici
int a0;
int a1;
int a2;
int a3;
int a4;
int a5;

void setup() {
  
//Inizializzo la porta Seriale
Serial.begin(9600);

}
void loop() 
{
  
  //Inizializzo la stringa
  String stringa="";
  //Leggo i valori dalle porte analogiche
  a0 = analogRead(A0);
  a1 = analogRead(A1);
  a2 = analogRead(A2);
  a3 = analogRead(A3);
  a4 = analogRead(A4);
  a5 = analogRead(A5);
  //Aggiungo alla stringa tutti i valori separati da virgole
    stringa += int(a0);
    stringa += char(',');
    stringa += int(a1);
    stringa += char(',');
    stringa += int(a2);
    stringa += char(',');
    stringa += int(a3);
    stringa += char(',');
    stringa += int(a4);
    stringa += char(',');
    stringa += int(a5);
  //Stampo la stringa a Seriale
  Serial.println(stringa);
  
}

Il codice è ben commentato e si spiega da solo, l'output è

286,288,290,289,290,291

ripetuto all'infinito.

Domandina:
Come faccio a leggere una stringa da processing? =(
Mi fa leggere solo un int =(

Forse questo mio esempio ti può servire anche se non del tutto pertinente, legge una stringa da Arduino e la scrive su un file:

// Scrittura su file da Arduino
import processing.serial.*;
Serial mySerial;
PrintWriter output;

void setup() {
  mySerial = new Serial( this, Serial.list()[1], 9600 );  // seleziona la porta seriale di Arduino e la velocità
  mySerial.bufferUntil('\n'); // Buffer seriale fino a new line
  output = createWriter( "dati.txt" );  // Nome file dati (lo scrive dove risiede il programma)
}

void draw() {
  // Imposta dati con data e tempo
  int gi = day();    // giorno
  int me = month();  // mese
  int an = year();   // anno
  int se = second(); // secondi 
  int mn = minute(); // minuti 
  int or = hour();   // ore 

  if (mySerial.available() > 0 ) {
    String value = mySerial.readStringUntil('\n');   // legge dati da seriale fino a new line 
    if ( value != null ) {
      // scrive dato tempo oppure aggiungere anche data
      String s = String.valueOf(or)+":"+String.valueOf(mn)+"."+String.valueOf(se)+" ";  
      output.print( s );

      output.print( value );   // scrive su file lettura da seriale da Arduino

    }
  }
}

// Esce dal programma alla pressione di qualsiasi tasto
void keyPressed() {
  output.flush(); // Scrive i dati rimanenti su file
  output.close(); // Chiude il file
  exit(); // Esce dal programma
}

aleale97:
Ho provato a eseguire il codice di Francesco94 (che sinceramente non capisco) in questo modo:

int i;

void setup() {
 Serial.begin(9600);
}
void loop()
{
 String stringa="";
 while (i < 5){
   char sensore='a'+char(i);
   stringa += char(sensore);
   i++;
 }
 Serial.println(stringa);
}



ma la seriale mi stampa il nulla, ovviamente ripetuto all'infinito. Come se la variabile fosse vuota, nell'attesa di vostre risposte leggo il link che mi ha passatoIngHooch 
EDIT: che dice le stesse cose dell'arduino Learning. In attesa di vostre risposte farò altre prove

Forse la prossima volta è meglio che commento il codice ]:smiley: ]:smiley: ]:smiley: comunque la mia idea comprendeva che tu all'interno del loop inserissi anche le variabili, non ho scritto tutto il codice completo ma intendevo di inserire il mio nel loop con prima le variabili.
adesso sto scrivendo il codice come lo pensavo poi te lo posto.

non capisco il problema; mandi i valori uno dopo l'altro sulla seriale con altretanti Serial.print();
Ciao Uwe

Ok, ho finito di scrivere il codice come avevo idea che dovesse essere... ma non funziona :smiley: :smiley: tuttavia dal momento che non vedo errori gravi (almeno credo,come ho già detto altrove vengo da python, in c scrivo da pochissimo(tre giorni fa)) posto comunque il codice nella speranza che qualcuno possa sistemarlo, che mi piace proprio XD

void setup() {
  Serial.begin(9600);
}
void loop() {
  String sommaValori = "";
  int valori[6]={analogRead(A0),analogRead(A1),analogRead(A2),analogRead(A3),analogRead(A4),analogRead(A5)}; //Raccoglie i vari valori dei sensori e li infila in una lista
  byte i=0;      //Indice xD
  while (i<6){                
    sommaValori += String(valori[i]);      //Appendo alla stringa somma il valore del sensore all posizione i dell'array
    Serial.println(sommaValori);           //Stampo la stringa
    i=i++;                          //aumento indice
  }
}

comunque concordo con uwe, ha più senso che usi più volte il Serial.print piuttosto che fare un'unica grande variabile da spedire...ma il codice ormai l'ho scritto

Francesco

Questo dovrebbe andare. Caricare l'array con le analogRead a bomba non dará problemi?

IngHooch:
Caricare l'array con le analogRead a bomba non dará problemi?

È vero... mi ero dimenticatp del delay tra le letture, basta farli separati... appena a casa provo nuovo codice. A meno che qualcuno nn ci pensi prima.
Francesco

non è che dovresti convertire i numeri in ascii prima di usarli ? (la funzione itoa ti dice niente?)

ragazzi pensavo di aver risolto con:

//Inizializzo le variabili per lo store dei valori analogici
int a0;
int a1;
int a2;
int a3;
int a4;
int a5;

void setup() {
  
//Inizializzo la porta Seriale
Serial.begin(9600);

}
void loop() 
{
  
  //Inizializzo la stringa
  String stringa="";
  //Leggo i valori dalle porte analogiche
  a0 = analogRead(A0);
  a1 = analogRead(A1);
  a2 = analogRead(A2);
  a3 = analogRead(A3);
  a4 = analogRead(A4);
  a5 = analogRead(A5);
  //Aggiungo alla stringa tutti i valori separati da virgole
    stringa += int(a0);
    stringa += char(',');
    stringa += int(a1);
    stringa += char(',');
    stringa += int(a2);
    stringa += char(',');
    stringa += int(a3);
    stringa += char(',');
    stringa += int(a4);
    stringa += char(',');
    stringa += int(a5);
  //Stampo la stringa a Seriale
  Serial.println(stringa);
  
}

invece processing mi da questo output:

215,213


309,315,318,316,322,324

38
9,386,384,384,381,379
241,
241,239,232,
233,230
256,259,261,266

Cosa mi sta a significare?

Inoltre, la funzione myPort.available() restituisce il numero di dati ancora da leggere sulla seriale? Perchè altrimenti aspetto che arduino invia i 6 valori e poi li leggo da processing...
Grazie ancora per tutte le risposte!!! :slight_smile: