Aggiornare un dato numerico su processing

Salve ragazzi.
Sto realizzando per scuola un programma di lettura di un sensore con arduino e trasmissione in seriale a processing,
Processing poi prende il dato e lo mette su un grafico ed inoltre lo visualizza in numero.
Ora:
Come si fa a cancellare il dato vecchio e sovrascrivere quello nuovo su processing?
Il grafico funziona ma il dato numerico continua ad essere scritto sopra il dato vecchio e non riesco a cancellarlo.

Vi ringrazio per l'aiuto

Devi "cancellare" la zona in cui lo stampi, usando degli spazi, credo. Stampi nella stessa zona una frase con tanti spazi " "

Senza codice ti si può dare solo una soluzione generica che può non valere nulla.

un rect(x,x,x,x) dello stesso fill() del fondo con noStroke() sopra il vecchio numero? ::slight_smile:

No, basta cambiare il valore della scritta nel draw.

Ripeto, senza codice non ti possiamo aiutare nemmeno con tutta la buona volontà del mondo.

da quel che capisco penso che capitankevin per il grafico non utilizzi il background (la successiva passata cancella la precedente), se è così la finestra non si riaggiorna quindi il numero precedente resta impresso anche se nel draw() cambi valore del numero.

Scusate ma vi sto scrivendo con il tablet e quindi non posso caricare il codice. Comunque il problema e che ad ogni aggiornamento anziche cancellare il dato vecchio sovrascrive sopra e dopo un po non si legge piu niente. Io ho risolto scrivendo prima il dato co il bianco e dopo sovrascrivendo con il nero. E un soluzione direi poco "tecnica" ma funzia.
Ho provato di tutto: lasciando uno spazio mettendo un rettangolo bianco funzione "redraw" tutto inutile. Cercavo una soluzione piu da programmatore di quella che ho trovato. Comunque domani vi posto il codice intanto grazie.

camperos, scusa, ti ho confuso con l'autore del topic.

Comunque ad ogni inizio draw andrebbe resettata la schermata per coerenza, se no basterebbe avere il solo setup.

Lo so che andrebbe resettata la schermata ma la schermata carica una foto e quindi non credo sia possibile resettarla.
In più acquisisce dati con un ciclo "if" per gestire più sensori.
Comunque ecco il codice cosi diventa più chiaro.
C'è anche lo script per pulire la seriale e sembra che funzioni

Scusate per il copia incolla ma non mi ricordo come si pubblica. (non uccidetemi)

import processing.serial.*;
PImage img; // Dichiaro la variabile per caricare lo sfondo
PFont f; // Dichiaro la variabile per i caratteri di scrittura
Serial myPort; // Dichiaro la variabile per la porta seriale
int xPos1 = 1; // Dichiaro le variabili per il cursore del grafico
float yPosOld1 =1;
int xPos2 = 1; // Dichiaro le variabili per il cursore del grafico
float yPosOld2 =1;

int d = 30;
int p1 = d;
int p2 = p1+d;
int p3 = p2+d;
int p4 = 950;
float inByte1;
float inByte2;
int T_mandata;
int T_esterna;

void setup() {
size(1100, 700); // grandezza del display

img = loadImage("sfondo grafico caldaia.JPG"); // Carico l'immagine nel display
printArray(PFont.list()); // carico il font per il titolo
f = createFont("Calibri", 20);
textFont(f);
println (Serial. list());
myPort = new Serial (this, "COM8",9600); // dichiaro la porta di comunicazione dati
image(img,0, 0,img.width2.2, img.height2.2);
textAlign(CENTER);
drawType(width * 0.02);

}

void draw()
{

}
void drawType(float x)
{
fill(0);
text("GRAFICO DELLE TEMPERATURE", 500, 30);
text("-10°C", 1031,640);
text(" 0°C", 1030,580);
text("10°C", 1030,520);
text("20°C", 1030,460);
text("30°C", 1030,400);
text("40°C", 1030,340);
text("50°C", 1030,280);
text("60°C", 1030,220);
text("70°C", 1030,160);
text("Temperatura mandata impianto",800,100);
text("°C",980,100);
text("Temperatura esterna",845,80);
text("°C",980,80);

line(x, 0, x, 800);
line(p1, 640, p4, 640);
line(p1, 580, p4, 580);
line(p1, 520, p4, 520);
line(p1, 460, p4, 460);
line(p1, 400, p4, 400);
line(p1, 340, p4, 340);
line(p1, 280, p4, 280);
line(p1, 220, p4, 220);
line(p1, 160, p4, 160);
strokeWeight(1);

}
void serialEvent (Serial myPort)
{
String inString = myPort.readStringUntil('\n');
if (inString != null)
{
inString = trim(inString);
float inByte = float (inString);
int temperatura = int(inString);

if(inByte>500)
{
fill(200);
text(T_esterna,960,80);
T_esterna = (temperatura-1000);
fill(0);
text(T_esterna,960,80);

inByte1=(inByte-982)*10;
inByte1 = map (inByte1,0,1023,0, height);
stroke (255,0,0);
strokeWeight(2);
line(xPos1, height - yPosOld1, xPos1, height - inByte1);
}
else
{
fill(200);
text(T_mandata,960,100);
T_mandata = temperatura;
fill(0);
text(T_mandata,960,100);

inByte2=(inByte+14)*10;
inByte2 = map (inByte2,0,1023,0, height);
stroke (0,0,0);
strokeWeight(2);
line(xPos2, height - yPosOld2, xPos2, height - inByte2);
}

if (xPos1 >= 1000 && xPos2 >= 1000)
{
xPos1 = 0;
xPos2 = 0;
myPort.clear(); // pulizia del buffer seriale
image(img,0, 0,img.width2.2, img.height2.2);
textAlign(CENTER);
drawType(width * 0.02);

}
else
xPos1++;
xPos2++;
yPosOld1 = inByte1;
yPosOld2 = inByte2;
}

}

il problema èlo sketch che non dovrebbe stare nel serialEvent ma in un thread separato.
inByte e temperatura variabile globale, e poi il rettangolo

 void serialEvent (Serial myPort)
{
  String inString = myPort.readStringUntil('\n');
  if (inString != null)  
 {
  inString = trim(inString);
 inByte = float (inString);
 temperatura = int(inString);
}

capitankevin:
Scusate per il copia incolla ma non mi ricordo come si pubblica. (non uccidetemi)

Pulsante tag code </>
Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Ho provato a spostare il valore della temperatura fuori dal "serial event" ma in questo caso lampeggia e visto che arduino usa un millis di 30 minuti non si legge nulla.

ciao,
nel SerialEvent ci devono stare solo i dati in arrivo che cambiano,
lo sketch lo devi spostare, ad esempio

void draw() 
{
temp();
}
void temp(){
  noStroke(); 
  fill(255);
  rect(934,53,35,50);
   if(inByte>500)
 {
  fill(200);
  text(T_esterna,960,80);
  T_esterna = (temperatura-1000);
  fill(0);
  text(T_esterna,960,80);
  
  inByte1=(inByte-982)*10;
  inByte1 = map (inByte1,0,1023,0, height);
  stroke (255,0,0);
  strokeWeight(2);
  line(xPos1, height - yPosOld1, xPos1, height - inByte1);
 }
  else
 {
  fill(200);
  text(T_mandata,960,100);
  T_mandata = temperatura;
  fill(0);
  text(T_mandata,960,100);
   
  inByte2=(inByte+14)*10;
  inByte2 = map (inByte2,0,1023,0, height);
  stroke (0,0,0);
  strokeWeight(2);
  line(xPos2, height - yPosOld2, xPos2, height - inByte2);
 }
 
 if (xPos1 >= 1000 && xPos2 >= 1000)
 {
   xPos1 = 0; 
   xPos2 = 0;
   myPort.clear(); // pulizia del buffer seriale
  image(img,0, 0,img.width*2.2, img.height*2.2); 
  textAlign(CENTER);
  drawType(width * 0.02);
  
 }
 else
 xPos1++;
 xPos2++;
 yPosOld1 = inByte1;
 yPosOld2 = inByte2;
 }

è il tuo sketch con l'aggiunta del rettangolo e a me funziona come credo tu voglia.

Ok domani lo modifico. Intanto grazie dell'aiuto

Se metto la parte di schetch che hai scritto dopo le linee del grafico non mi prende il "voidTemp()"
Se invece la metto subito dopo il "draw" non mi accetta più la parte delle linee.
Puoi per cortesia farmi vedere come l'hai inserito?

eventualmente si può usare PGraphics()
prova così, modifica eventualmente la dimensione del rettangolo:

import processing.serial.*;
PImage img;       // Dichiaro la variabile per caricare lo sfondo
PFont f;          // Dichiaro la variabile per i caratteri di scrittura
Serial myPort;    // Dichiaro la variabile per la porta seriale
int xPos1 = 1;     // Dichiaro le variabili per il cursore del grafico
float yPosOld1 =1;
int xPos2 = 1;     // Dichiaro le variabili per il cursore del grafico
float yPosOld2 =1;

int d = 30;
int p1 = d;
int p2 = p1+d;
int p3 = p2+d;
int p4 = 950;
float inByte1;
float inByte2;
int T_mandata;
int T_esterna;
float inByte = 0;
int temperatura = 0;
int stato;
void setup() {
  size(1100, 700); // grandezza del display 
  img = loadImage("sfondo grafico caldaia.JPG");  // Carico l'immagine nel display  
  printArray(PFont.list());            // carico il font per il titolo
  f = createFont("Calibri", 20);
  textFont(f);
  println (Serial. list());
  myPort = new Serial (this, "COM8", 9600);  // dichiaro la porta di comunicazione dati
  image(img, 0, 0, img.width*2.2, img.height*2.2); 
  textAlign(CENTER);
  drawType(width * 0.02);
}
void draw() {
  temp();
}
void temp() {
  if (stato==1) {
    image(img, 0, 0, img.width*2.2, img.height*2.2); 
    drawType(width * 0.02);
    stato=0;
  } 
  fill(255);
  noStroke();
  rect(947, 84, 25, 25);  
  if (inByte>500)
  {
    fill(200);
    text(T_esterna, 960, 80);
    T_esterna = (temperatura-1000);
    fill(0);
    text(T_esterna, 960, 80);
    inByte1=(inByte-982)*10;
    inByte1 = map (inByte1, 0, 1023, 0, height);
    stroke (255, 0, 0);
    strokeWeight(2);
    line(xPos1, height - yPosOld1, xPos1, height - inByte1);
  } else
  {
    fill(200);
    text(T_mandata, 960, 100);
    T_mandata = temperatura;
    fill(0);
    text(T_mandata, 960, 100);

    inByte2=(inByte+14)*10;
    inByte2 = map (inByte2, 0, 1023, 0, height);
    stroke (0, 0, 0);
    strokeWeight(2);
    line(xPos2, height - yPosOld2, xPos2, height - inByte2);
  }
} 
void drawType(float x) 
{  
  strokeWeight(1);
  fill(0);
  text("GRAFICO DELLE TEMPERATURE", 500, 30); 
  text("-10°C", 1031, 640);
  text(" 0°C", 1030, 580);
  text("10°C", 1030, 520);
  text("20°C", 1030, 460);
  text("30°C", 1030, 400);
  text("40°C", 1030, 340);
  text("50°C", 1030, 280);
  text("60°C", 1030, 220);
  text("70°C", 1030, 160);
  text("Temperatura mandata impianto", 800, 100);
  text("°C", 980, 100);
  text("Temperatura esterna", 845, 80);
  text("°C", 980, 80);

  line(x, 0, x, 800);
  line(p1, 640, p4, 640);
  line(p1, 580, p4, 580);
  line(p1, 520, p4, 520);
  line(p1, 460, p4, 460);
  line(p1, 400, p4, 400);
  line(p1, 340, p4, 340);
  line(p1, 280, p4, 280);
  line(p1, 220, p4, 220);
  line(p1, 160, p4, 160);
}
void serialEvent (Serial myPort)
{
  String inString = myPort.readStringUntil('\n');
  if (inString != null)  
  {
    inString = trim(inString);
    inByte = float (inString);
    temperatura = int(inString);
    if (xPos1 >= 1000 && xPos2 >= 1000)
    {
      xPos1 = 0; 
      xPos2 = 0;
      myPort.clear(); // pulizia del buffer seriale
      stato = 1;
    } else {
      xPos1++;
      xPos2++;
      yPosOld1 = inByte1;
      yPosOld2 = inByte2;
    }
  }
}

dato che a me funziona e uso Processing 3, mi viene il dubbio che magari utilizzi una versione precedente e qualcosa cambia