serial invio dati sbagliati

ciao, sono newbie con arduino..l'ho collegato a processing tramite serial, però c'è qualcosa che non funziona. questo è il mio codice

arduino

void setup(){
 Serial.begin(9600); 
}
int val = 10;
  
void loop(){
  Serial.println(val);
  delay(100);
}

processing

import processing.serial.*;

Serial myPort; 
int val; 

void setup() 
{
  size(200, 200);
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}

void draw()
{
  if ( myPort.available() > 0) {
    val = myPort.read();  
  }
println("myval: "+val);
}

quello che ricevo in processing è questo:

myval: 49
myval: 48
myval: 13
myval: 10
myval: 10
myval: 10
myval: 49
myval: 48
myval: 13
myval: 10
myval: 10
myval: 10
myval: 49
myval: 48
myval: 13
myval: 10
myval: 10
myval: 10
myval: 10

da dove saltano fuori 49,48 e 13?

uso arduino 2009 atmega328

grazie

La Serial.println() trasmette in modalità testo. Quando spedisci 10 quindi spedisci 2 caratteri '1' e '0' che equivalgono a 49 e 48 ascii. Poi usi ln che aggiunge NewLine e Andata a capo che sono i caratteri 13 e 10

Capisci che tu semplifichi int val=10; ma un int comunque sono 2 byte, se scrivi 1000 superi 1 byte quindi come potevi pensare di spedire un byte e leggere un byte se chiedi ad Arduino di lavorare con un int che sono 2 byte ? Spero di essere stato esplicativo.

Poi, anche la println("myval: "+val); in processing DEVE stare nell'if, altrimenti per problemi di sincronismo se per un ciclo di draw() non ci sono dati, ristampa il valore precedente.

ok ma se spedisce in modalità testo..allora com'è che se spedisco una stringa e in proscessing utilizzo readString() mi stampa interi?

usa Serial.write(“ciao”);

leech: ok ma se spedisce in modalità testo..allora com'è che se spedisco una stringa e in proscessing utilizzo readString() mi stampa interi?

cioè ? readString() legge e ti stampa quello che vuoi !! Logico che se spedisci "1234" ricevi una parola con "1234" e buttato a video "pare" un numero. Facci dei calcoli però se riesci. "1234"+"5" NON fa "1239" perchè non sono numeri. Ma puoi anche spedire "PIPPO" e comunque ricevi in Processing. E otterrai "PIPPO" che è una parola.

ok..non ci sono..se io uso questo codice

arduino

void setup(){
 Serial.begin(9600); 
}
  
void loop(){
  Serial.write("ciao");
  delay(100);
}

processing

import processing.serial.*;

Serial myPort; 
String val; 

void setup() 
{
  size(200, 200);
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}

void draw()
{
  if ( myPort.available() > 0) {
    val = myPort.readString();  
    println("myval: "+val);
  }

}

ricevo questo

myval: ciao
myval: ciao
myval: c
myval: iao
myval: ciao
myval: ciao
myval: ciao
myval: ciao
myval: ciao
myval: ciao
myval: ciao
myval: ciao
myval: ciao
myval: ciao
myval: cia
myval: o
myval: ciao
myval: ciao
myval: ciao
myval: cia
myval: o
myval: ciao

se passo un int invece ricevo tutt'altro..ma devo fare una conversione da ascii a decimale quando ricevo un valore in processing? mi spiace ma non ho ancora capito cosa devo fare di preciso per risolvere. A me interessa inviare un intero e ricevere un intero (entrambi in base decimale)

grazie

semplificando devi fare cosi, oppure usare il serialEvent

void setup() 
{
  size(200, 200);
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600)
}

void draw()
{ 
   String val = myPort.readStringUntil('\n');
   if (val != null) {
   println("myval: "+ val );
  }
}

l'esempio processing che ti serve sta negli esempi di arduino, esempi-->communication--> virtualColorMixer, fai scorrere c'è lo sketch processing ciao

grazie…avevo provato con readStringUntil e mi dice che quella funzione non esiste (the function readStringUntil(char) does not exist)

unj paio di anni fa processing ha avuto quel problema,
che versione hai? io uso la 2.1.1 e non da problemi,
alternativamente prova con readString()

@leech il problema è come hai fatto in Processing. E qui esperti di Processing c'e' ne sono pochi (forum di Arduino mica di Processing). Io non lo conosco molto. Però è errato usare la lettura da seriale nella DRAW !! Cerca degli esempi di Processing che utilizzano il serialevent, come detto da @camperos

mah..non so come mai ma ora funziona (senza stampare ascii o cose del genere)..questo è il codice processing..

import processing.serial.*;

Serial myPort;
int val;

void setup() 
{
  size(200, 200);
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}

void draw()
{
  if ( myPort.available() > 0) {
    val = myPort.read();
    println(val);
  }

grazie a tutti ;)

bene :) comunque ti consiglio di riuscire anche a inviare e ricevere stringhe, perchè con il write (binary) con valori oltre i 255 diventa un pò complesso

certamente lo farò..grazie!