Termometro con display TFT 128x160

Salve a tutti,

Da qualche giorno mi sto dedicando ad un progetto che prevede di indicare la temperatura su un display grafico (1.8 SPI 128x160).

Per poter rappresentare graficamente la temperatura, ho pensato di disegnare dei rettangolini orizzontali via via più lunghi e sovrapposti di qualche pixel man mano che la temperatura aumenta. Per ottenere ciò, ho scritto questo tipo di codice con una serie infinita di "IF":

  // stanghetta #1
  if (lettura_dec > 1) {

  TFTscreen.stroke(0, 0, 0); 
  TFTscreen.fill(0, 255, 0);
  TFTscreen.rect(5, 110, 15, 5);
  }
  else {
  TFTscreen.stroke(0, 0, 0);
  TFTscreen.fill(0, 0, 0);
  TFTscreen.rect(5, 110, 15, 5);
    }
    
  // stanghetta #2
  if (lettura_dec > 1.1) {

  TFTscreen.stroke(0, 0, 0);
  TFTscreen.fill(21, 235, 0);
  TFTscreen.rect(5, 104, 17, 5);
  }
  else {
  TFTscreen.stroke(0, 0, 0);
  TFTscreen.fill(0, 0, 0);
  TFTscreen.rect(5, 104, 17, 5);
    }

  // stanghetta #3
  if (lettura_dec > 1.2) {

  TFTscreen.stroke(0, 0, 0);
  TFTscreen.fill(54, 201, 0);
  TFTscreen.rect(5, 98, 19, 5);
  }
  else {
  TFTscreen.stroke(0, 0, 0);
  TFTscreen.fill(0, 0, 0);
  TFTscreen.rect(5, 98, 19, 5);
    }

e così via...

Potete per favore indicarmi se esiste un modo più "sintetico" per far disegnare questi rettangolini?

Grazie e buona serata a tutti

TFTscreen.stroke(0, 0, 0); è sempre uguale per tutti gli if, quindi mettilo solo una volta. E anche il rect tra if ed else è uguale, quello che ti cambia è solo il fill.

  // stanghetta #3
  TFTscreen.stroke(0, 0, 0);
  if (lettura_dec > 1.2) 
  { TFTscreen.fill(54, 201, 0);
  }
  else 
  { TFTscreen.fill(0, 0, 0);
  }
  TFTscreen.rect(5, 98, 19, 5);

Inoltre noterai che l’unica cosa che cambia per i tre rect è il secondo parametro e terzo parametro
Con un ciclo for con I da 0 a 2 puoi farlo “ragionare” (valori in funzione di I)

for(I=0;I<=2;I++)
{ TFTscreen.stroke(0, 0, 0); 
  if (lettura_dec > (1 + I/10.0) )  // 0=1.0 1=1.1 2=1.2
  { TFTscreen.fill(0, 255, 0);
  }
  else 
  { TFTscreen.fill(0, 0, 0);
  } 
  TFTscreen.rect(5, 110-I*6, 15+I*2, 5);   // 0=110 1=104 2=98   0=15 1=17 2=19
}

P.S. da provare, non testato

Grazie Nid, è molto più pulito!

Prego. Tieni solo conto che è un pò più complicato da capire se lo riguardi tra un pò di tempo. :)

Visto che ho faticato non poco, per chi ne avesse necessità, il display che sto testando è questo:

E' un cinese di basso costo con driver Samsung S6D02A1.

Dopo innumerevoli tentativi, ho trovato qui il modo giusto per connetterlo ad Arduino UNO e poterlo utilizzare con gli esempi presenti nella IDE di arduino (TFT).

|500x374

Funziona alla grande! Con un solo ciclo FOR e gli IF al suo interno, riesco non solo a variare automaticamente posizione e lunghezza, ma anche il colore delle righe, risparmiando moltissimo codice e riuscendo eventualmente a modificarle velocemente senza doverle “ritoccare” una ad una! Grazie ancora!

// inizio disegno segmenti temperatura entrata:

for (byte I = 0; I < 16; I++)
{ TFTscreen.stroke(0, 0, 0); 
  if (lettura_dec / 10  > (1 + I/10.0) )  // 0=1.0 1=1.1 2=1.2
  { TFTscreen.fill(0+I*17, 255-I*17, 0);
  }
  else 
  { TFTscreen.fill(0, 0, 50);
  } 
  TFTscreen.rect(5, 105-I*6, 15+I*2, 5);   // 0=110 1=104 2=98   0=15 1=17 2=19
}

Bello graficamente. :)

nid69ita: Bello graficamente. :)

;)