Communication série Arduino/Processing

Il est très facile d'envoyer une valeur avec la communication série, mais il souvent utile d'envoyer un paquet de valeurs. Par exemple envoyer les valeurs de deux ou plus capteurs.

Code Arduino

// Send serial data to Processing
// Data are separated by a ",", so you could send any number of data
 
int firstSensor = 0;    // first analog sensor
int secondSensor = 255;   // second analog sensor
 
void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
}
 
void loop() {
 
    // Update Data with linear values
    firstSensor += 1; 
    secondSensor -= 1;
    if (secondSensor < 0)  secondSensor = 255;
    if (firstSensor > 255)  firstSensor = 0;
 
    // Send Data
    Serial.print(firstSensor);
    Serial.print(","); // séparateur
    // Avec println on ferme le paquet de valeur, car "ln"
    Serial.println(secondSensor); 
 
    // Sampling rate
    delay(5);
}

Code Processing

// Get Serial Data from an Arduino
// Parse it with a separator caracter ","
 
// import the Processing serial library
import processing.serial.*;    
Serial myPort; // The serial port
 
// Test values
int v1 =0;
int v2 = 255;
int x;
 
void setup() {
  size(640,480);
  // Open serial port
  //printArray(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600);
 
  // Read bytes into a buffer until you get a linefeed (ASCII 10):
  myPort.bufferUntil('\n');
 
  //draw with smooth edges:
  //smooth();
  background(255);
}
 
void draw() {
 
  // Draw circles
  fill(#ff0000);
  ellipse(x, v1, 5, 5);
  fill(#00ff00);
  ellipse(x, v2, 5, 5);
 
  // Update x position
  x++;
 
  // Refresh screen
  if (x > 600) {
    background(255);
    x = 0;
  }
}
 
// serialEvent  method is run automatically by the Processing applet
// whenever the buffer reaches the byte value set in the bufferUntil()
// method in the setup():
void serialEvent(Serial myPort) {
 
  // read the serial buffer:
  String myString = myPort.readStringUntil('\n');
 
  // if you got any bytes other than the linefeed:
  myString = trim(myString);
 
  // split the string at the commas
  // and convert the sections into integers:
  int values[] = int(split(myString, ','));
 
  if (values.length > 0) {
    v1 = values[0];
    v2 = values[1];
    //println(v2);
  }
}