Arduini u. Processing

Moin :slight_smile: ,
momentan lese ich mich in Processing ein und finde es ehr interessant.
Gerade programmiere ich eine Kommunikation mit dem Arduino und Processing.
Die Kommunikation habe ich hinbekommen aber wenn ich mir den Potiwert von Processing anzeigen lassen m√∂chte, wird der Wert √ľberlagert.
Ich sitze schon fast drei Tage an diesem Fehler :frowning:

ich habe folgendes Problem:

Arduino code:

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

void loop()
{
 int sensorValue = analogRead(A0);
 Serial.println(sensorValue);
 delay(500);


}

Processing code:

import processing.serial.*;
Serial myPort;
String val="";
PFont comic;

void setup()
{ 
size(600,600);
String portName = Serial.list()[4];
myPort = new Serial(this,portName,9600);
comic = createFont("Comic Sans MS", 16, true);
background(255);
}

void draw()
{
   if (myPort.available() > 0) // √úberpr√ľft, ob Daten empfangen wurden
 {
   val = myPort.readStringUntil('\n');
 }

    
fill(0);
 textFont(comic, 16);
 textAlign(CENTER);
 text("Wert: " + val, width-300, 200);

}

Wie bekomme ich diese √úberlagerung der Werte(Schriften) weg?

Liegen Gruß
Alex

Das ist hier zwar das Arduino-Forum... :slight_smile:
Und ich kenne mich mit Processing nur ein wenig aus, aber das Problem ist zu lösen.
So √§hnlich, wie bei manchen LCD-Displays werden auch bei Processing nur "die neuen" Bereiche des Ausgabe-Fensters beschrieben, die alten bleiben stehen. Deshalb erscheinen die Wert √ľbereinander.

Es gibt (mindestens) 2 Möglichkeiten das zu umgehen.

  1. den Bildschirm jedesmal komplett löschen:
    Dein Fenster-Hintergrund ist weiß, mit dem Befehl
background(255);

kannst du das Fenster jedesmal löschen, wenn neue Daten empfangen wurden

...
void draw()
{
¬†  if (myPort.available() > 0) // √úberpr√ľft, ob Daten empfangen wurden
 {
   background(255);     // gesamtes Fenster löschen
   val = myPort.readStringUntil('\n');
 }
...
  1. nur jenen Berich löschen, wo die Zahlen stehen:
    zum Beispiel indem du mit weißer Schrift auf weißem Hintergrund schreibst - jeweils auch wieder nur dann, wenn neue Daten empfangen wurden
...
void draw()
{
¬†  if (myPort.available() > 0) // √úberpr√ľft, ob Daten empfangen wurden
 {
   val = myPort.readStringUntil('\n');
   fill(255);          // schreib mit weiß (auf weißem Hintergrund)...
   text("Wert: " + val, width-300, 200);    // den alten Wert und löscht ihn dadurch
   fill(0);
 }
...

Mir fällt sonst noch auf, dass deine Abfrage des seriellen Ports recht fehleranfällig sein könnte.
Du fragst nur ab ob es mehr als Null Zeichen im seriellen Buffer gibt, danach liest du gleich bis zum Zeilenende ein. Ob das in jedem Fall funktioniert? Es wäre ja auch möglich dass erst z.B. 1 Zeichen im Buffer liegt und das Zeilenende noch nicht gesendet wurde (serielle Übertragung braucht ja seine Zeit).
Aber das ist vielleicht eher ein zuk√ľnftiges Problem. :slight_smile: Edit: gestrichen - dazu reicht mein Wissen √ľber Processing nicht tief genug :slight_smile:

Auf dem Arduino ist readStringUntil() blockierend mit Timeout. Wird da wahrscheinlich auch so sein

Hm, könnte sein.
Allerdings ist die Syntax von readStringUntil() bei Processing etwas anders als bei der Arduino IDE und so was wie Timeout wird da nicht erwähnt - aber ich bin kein Processing-Experte...
...und ziehe meine Bedenken deshalb zur√ľck :slight_smile:

Moin Jungs :slight_smile: ,
großes Dank an euch... es funktioniert.
Ich w√ľnsche euch ein sch√∂nes Wochenende.

Lieben Gruß
Alex

In Processing w√ľrde ich die Eingabe etwas anders l√∂sen.
Ein Beispiel das empfangene nicht leere Zeilen sind in eine Datei schreibt

import processing.serial.*;
Serial mySerial;
PrintWriter output;
int lf = 10;    // Linefeed in ASCII

String fName = "rxdata.txt";

void setup() {
  printArray(Serial.list());
  mySerial = new Serial( this, Serial.list()[2], 9600 );
  output = createWriter( fName );
  mySerial.bufferUntil(lf);
  println("saving to '" + fName + "', key to stop");
}

void draw() {
}

void serialEvent(Serial p) {
  String rStr = p.readString();
  if ( rStr != null ) {
    if (rStr.length() > 2) { // more than empty line
      output.print(rStr);
    }
  }
}

void keyPressed() {
  output.flush();  // Writes the remaining data to the file
  output.close();  // Finishes the file
  exit();  // Stops the program
}