Pages: [1]   Go Down
Author Topic: Unire e spedire dati su seriale  (Read 1274 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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 smiley... Bye bye e grazie.
Logged

Firenze, Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 104
Dislessia portami via
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

http://www.gioblu.com/tutorials/programmazione/157-arduino-string-finalmente
Logged

The brightest flame burns quickest

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se non vado errato basta che cri una stringa vuota e poi "appendi" i vari valori:
Code:
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 smiley-lol)
« Last Edit: April 15, 2012, 10:26:48 am by Francesco94 aka J.T.Kirk » Logged

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://arduino.cc/en/Tutorial/StringConstructors
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per le risposte tempestive  smiley, ho provato questo codice:
Code:
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 è:
Code:
,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:
Code:
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
« Last Edit: April 15, 2012, 11:56:49 am by aleale97 » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, ci sono riuscito. Ho leggermente riadattato il codice di Francesco94 sino a farlo diventare questo:
Code:
//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 è
Code:
286,288,290,289,290,291
ripetuto all'infinito.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Domandina:
Come faccio a leggere una stringa da processing?  smiley-cry
Mi fa leggere solo un int  smiley-cry
Logged

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
// 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
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho provato a eseguire il codice di Francesco94 (che sinceramente non capisco) in questo modo:
Code:
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-twist smiley-twist smiley-twist 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.
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20218
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, ho finito di scrivere il codice come avevo idea che dovesse essere... ma non funziona   smiley-grin smiley-grin 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 smiley-lol
Code:
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
Logged

Firenze, Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 104
Dislessia portami via
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

The brightest flame burns quickest

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ragazzi pensavo di aver risolto con:
Code:
//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:
Code:
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!!!  smiley
Logged

Pages: [1]   Go Up
Jump to: