Orologio digitale su schermo LCD TFT

Ciao a tutti, come da titolo volevo visualizzare data e ora su uno schermo tft lcd. ho scritto il programma e penso ci siano degli errori abbastanza gravi :sweat_smile: :sweat_smile: in alcuni punti… (Non ho ancora capito molto bene la libreria dello schermo). Pensavo di visualizzare ora e minuti al centro e i secondi al centro sotto le ore e i minuti e nell’angolo in basso a destra la temperatura. Una volta caricato il programma il risultato è abbastanza strano.

#include <TFT.h>
#include <SPI.h>

#define cs   10
#define dc   9
#define rst  8  

TFT TFTscreen = TFT(cs, dc, rst);

char temperaturaPrintout[4];
char orabo[2];                          
char mibo[2];
char sebo[2];

int tempcels;

int ora=0, se=0, mi=0;

void setup() {
  TFTscreen.begin();
  TFTscreen.background(0, 0, 0);
  
  TFTscreen.stroke(255,255,255);
  TFTscreen.setTextSize(2);
  TFTscreen.text("C",145,105);
  
}

void loop() {
  
  tempcels=((analogRead(1)/1024.0)*5.0-0.5)*100;                      //Faccio il calcolo per convertire il valore letto dal pin analogico in gradi C
  
  String temperatura = String(tempcels);
 
  temperatura.toCharArray(temperaturaPrintout, 4);
  
  //*****************
                                                                          
  String oraschermo=String(ora);                                     
  oraschermo.toCharArray(orabo,2);
  
  String mischermo=String(mi);                                                      
  mischermo.toCharArray(mibo,2);
  
  String seschermo=String(se);
  seschermo.toCharArray(sebo,2);
  
  //*****************                                              //Visualizzo ora, minuti e secondi
  TFTscreen.setTextSize(2);
  
  TFTscreen.stroke(255,255,255);
  TFTscreen.text(temperaturaPrintout, 120, 105);
  
  TFTscreen.setTextSize(5);
  TFTscreen.stroke(255,255,255);
  if(ora<10){
    TFTscreen.text("0",15,45);
    TFTscreen.text(orabo,50,45);
    }
  else
    TFTscreen.text(orabo,15,45);
  
  TFTscreen.text(":",71,45);
  
  if(mi<10){
    TFTscreen.text("0",96,45);
    TFTscreen.text(mibo,130,45);
    }
  else
    TFTscreen.text(mibo,96,45);
  
  TFTscreen.setTextSize(2);  
  if(se<10){
    TFTscreen.text("0",65,85);
    TFTscreen.text(sebo,83,85);
    }
  else{
    TFTscreen.stroke(255,255,255);
    TFTscreen.text(sebo,65,85);
    }
    
  delay(1000);
  
  
  TFTscreen.setTextSize(2);
  TFTscreen.stroke(0,0,0);
  TFTscreen.text(temperaturaPrintout, 120, 105);
  TFTscreen.setTextSize(5);
  
  
  if(ora<10){                                              //Ripulisco lo schermo (PARTE CHE RITENGO SBAGLIATA)
    TFTscreen.text("0",15,45);
    TFTscreen.text(orabo,50,45);
    }
  else
    TFTscreen.text(orabo,15,45);
  
  TFTscreen.text(":",71,45);
  
  if(mi<10){
    TFTscreen.text("0",96,45);
    TFTscreen.text(mibo,130,45);
    }
  else
    TFTscreen.text(mibo,96,45);
  
  
  if(se<10){
    TFTscreen.text("0",65,85);
    TFTscreen.text(sebo,83,85);
    }
  else
    TFTscreen.text(sebo,65,85);
  
  if(se>=59){                                          //Aumento ore minuti e secondi 
    mi++;
    se=0;
    }
  
  if(mi>=59){
    ora++;
    mi=0;
    }
    
  se++;
}

. Teoricamente l’orologio non è nemmeno preciso, ma per il momento non mi interessa. Per impostare ora minuti e secondi non ho problemi. Quello che non quadra è il fatto che il programma pesa 10000 bytes per alla fine non fare granché e ci sono parti che forse sono inutili… Il punto è che non voglio che lo schermo lampeggi quando cambia ora o minuto o secondo e che il tutto sia più leggero. Magari potreste correggermi degli errori… :sweat_smile: :sweat_smile:

fatto che il programma pesa 10000 bytes per alla fine non fare granché

È colpa delle librerie usate e delle stringhe.
Per stampare un numero non servono stringhe ma stamparli semplicemente.
Ciao Uwe

La pesantezza dello sketch è dovuta principalmente alla complessità della libreria TFT che gestisce il display, anche compilando uno sketch ridotto all'osso, ti ritrovi con KB di flash occupata. Ottimizzando il codice qualcosa riesci a limare.

Sul problema del lampeggio non mi esprimo perché non ho il display e non so come rende. Generalmente i display grafici hanno un pò di effetto "fantasma" (nel senso che si vede come una specie di "eco") ma non so nel tuo caso cosa ottieni. Magari un video potrebbe aiutare a capire il problema e cercare una soluzione.

Ah, per l'orario impreciso: l'Arduino si basa su una fonte di clock (un risuonatore ceramico) che non è molto precisa. Se vuoi un orario più affidabile, devi usare un orologio hardware vero e proprio, un cosiddetto RTC (Real-Time Clock).

(ups accavallato con Uwe)

leo72:
(ups accavallato con Uwe)

ma ero piú stringato e percui piú veloce nel scrivere :wink: :wink: :wink:
Ciao Uwe

Ecco il video. :sweat_smile:

capturedvideo.MOV (1.1 MB)

Vediamo se interpreto correttamente.
L'effetto che hai deriva dal fatto che tu sovrascrivi tutte le volte tutte le cifre, anche quelle che non cambiano. Il display quindi aggiorna l'immagine.
Per evitare ciò, dovresti aggiornare solo ciò che è cambiato.

Per quanto riguarda i secondi, penso che dipenda dal fatto che scrivendo una stringa il controller del display la trasforma in una matrice di punti accesi/spenti: i punti accesi della nuova cifra si sovrappongono a quelli della cifra precedente, creando quell'effetto. Dovresti prima "cancellare" la cifra precedente, scrivendola in nero, e poi mettendo la cifra nuova.

PS:
non è detto che anche così poi non ti resti un pò di sfarfallamento, questo dipende anche dalla velocità con cui il display fa il refresh video. Forse poi c'è qualche altro sistema più veloce per scrivere a video, però non conosco la lib, come ti ho detto, perché non ho quel display.

Quando faccio partire il programma il risultato é decente i primi 10 secondi poi la 1ª cifra dei secondi aumenta correttamente mentre la seconda sparisce totalmente.

leo72:
non è detto che anche così poi non ti resti un pò di sfarfallamento, questo dipende anche dalla velocità con cui il display fa il refresh video. Forse poi c’è qualche altro sistema più veloce per scrivere a video, però non conosco la lib, come ti ho detto, perché non ho quel display.

Lo sfarfallamento non è possibile eliminarlo, il problema è nel 328 che è troppo lento per aggiornare il display, solo con micro molto più performanti, o dotati di display controller integrato, non si vede il cambio delle scritte.
Il problema sia nella grande quantità di dati da trasferire verso il dsplay TFT, due byte per ogni pixel, sia nel tempo necessario per calcolare tutti punti che vanno modificati, l’operazione più lunga da eseguire è la cancellazione di tutto il display che richiede il trasferimento di ben 153kB tra l’ATmega 328 e il display, anche se viene completata in meno di un decimo di secondo per l’occhio viene percepita come un fastidioso lampeggio.

:sweat_smile: Ok, all sfarfallamento mi posso abituare, ma non ho ancora capito cosa ho sbagliato nel codice...

Non potrei usare una micro SD per salvare parte del codice? :sweat_smile: :cold_sweat:

Non capisco la richiesta.

Il peso del programma è di 10000 kb su 28000. Io vorrei aggiungere altre funzioni e temo che lo spazio su Arduino non sia abbastanza... Magari si può utilizzare la microSD per mettere il programma... (Penso sia una cavolata) :sweat_smile: Comunque nel programma c'è qualcosa di sbagliato perché la seconda cifra detto secondo sparisce ogni volta che i secondi arrivano a dieci...

No, non si può.
I microcontrollori Atmel non possono utilizzare memoria esterna come memoria di programma: il Program Counter, il registro che punta le celle di memoria che contengono le istruzioni da eseguire, può indirizzare solo la flash interna.

Ma 10K sono meno della metà di 28K, forse ti preoccupi inutilmente.

PS:
se comunque sfori il limite, l'alternativa è utilizzare un chip differente, con più Flash.

Si forse hai ragione sul fatto che mi preoccupo inutilmente... :sweat_smile:
Comunque non sono ancora riuscito a trovare il problema nel codice...

Di quale problema?