refresco de los segundos en TFT

buenas, soy incapaz de hacer el refresco a la hora mediante una tft con librería ST7735, para el RTC estoy usando una librería que me gustó mucho de Alberto Gil ( http://giltesa.com).
Me imprime la fecha correctamente en el tft, pero se van solapando los carácteres...
esta parte es la que la hace imprimir:
la imprime correctamente, pero no refresca:

tft.setTextColor(ST7735_RED);
tft.setTextSize(1);
tft.setCursor(2,15);
tft.print(d.toString("d/m/Y H:i:s") );

Surbyte tiene un post relacionado con mi problema, dice que hay que guardar el dato en el buffer

el cual aporta la solución de hacer una función tal que:

void printTFT(byte X, byte Y, uint16_t COLOR, byte siZe,  float dato) {
     char TX[4];
     sprintf(TX,"%3d", dato);  // esto hace que siempre imprima un entero de 3 digitos 999 máx si se necesita mas
                               // simplemente amplia el %3d a %5d para 5 digitos pero tmb amplia
                               // char TX[6] creo que me sobra un digito aca pero prueba con 5.
     tft.setCursor (X,Y);
     tft.setTextColor (COLOR);
     tft.setTextSize(siZe);
     tft.print (TX);  
}

para usarlo así:

printTFT(90, 60, ST7735_GREEN, 4, grad_X);

pero debo estar haciendo algo mal y mezclando strings con float, que o bien me imprime nada o 4 digitos numéricos.
yo tengo lo siguiente:

void printTFT(byte X, byte Y, uint16_t COLOR, byte siZe,  String dato) {
     char TX[5];
     sprintf(TX,"%3d", dato);  // esto hace que siempre imprima un entero de 3 digitos 999 máx si se necesita mas
                               // simplemente amplia el %3d a %5d para 5 digitos pero tmb amplia
                               // char TX[6] creo que me sobra un digito aca pero prueba con 5.
     tft.setCursor (X,Y);
     tft.setTextColor (COLOR);
     tft.setTextSize(siZe);
     tft.print (TX);   
}


  tft.setTextColor(ST7735_RED);
 tft.setTextSize(1);
  tft.setCursor(2,15);
 tft.print(d.toString("d/m/Y H:i:s") ); //este se solapa


printTFT(20, 50,ST7735_WHITE,1,d.toString("d/m/Y H:i:s")); //este arroja como resultado "8660"

me podéis echar un cable para definir correctamente el guardado de los datos en el buffer?

gracias

una ayuda? una pista? :confused: :confused: :confused:

El problema es que Arduino no permite (por limitaciones de memoria) usar sprintf con floats.

Tienes soluciones varias pero la mejor es esta

Conversión de números a cadenas en Arduino

Otra versión similar Displaying FLOAT variables in Arduino

Hace tiempo que no toco las pantallas como la que reportas estar usando. Dándome una zambullida en el cajón de recuerdos...

El problema de las librerías basadas en la librería GFX de adafruit, es que su estructura no admite el dibujo de ceros del lado izquierdo, por ejemplo para mandar imprimir un número como este: 000.01, en cualquier TFT (ILI9325, ILI9341, ILI9488, o ST7735), utilizaríamos un equivalente a estas lineas:

tft.setTextSize(4);
tft.setTextColor(BLACK, ORANGE);
tft.setCursor(200,150);
tft.println(0000.01);

Con este resultado en pantalla (número al centro):

La orientación del número flotante es de izquierda a derecha; en caso de presentar secuencias crecientes, la impresión del valor tipo flotante no causa problemas. Sin embargo, en secuencias decrecientes quedan números residuales del lado derecho del número.

En las últimas versiones del IDE de arduino, es posible presentar flotantes en cadenas tipo char dentro de la instrucción sprintf, tal como señala surbyte. Las lineas de programación serían equivalentes a:

char textf[50]; float flotante=0000.01;
tft.setTextSize(4);
sprintf(textf,"%6.2f",flotante);  
tft.setTextColor(BLACK, ORANGE);
tft.setCursor(200,50);
tft.println(textf);

Esta secuencia curiosamente dibuja el número de derecha a izquierda, siendo mas natural su presentación en pantalla. Ciertamente se usan todos los espacios señalados en el formato del texto, pero no presentará números residuales, que me parece, son los que reportas en tu proyecto. Deberías crear un sketch en el que solo imprimas un ejemplo de lo que quieres mostrar en pantalla. En la instrucción que contabiliza el número total de dígitos de la linea sprintf (%6.2f en este caso), debes considerar el máximo que tiene la variable flotante: parte entera, punto decimal y parte decimal. En el ejemplo son 6 espacios: 3 para la parte entera, 1 para el punto decimal y 2 para la parte decimal.


El número "formateado" con sprintf está al centro, arriba.

PD: la pantalla del ejemplo es una ILI9488 de 3.5", instalada en un teensy 3.6@180MHz. Bien podría ser instalada en un teensy 3.2. En el teensy 4 el panel táctil no funciona si se conecta el lector microSD en la misma linea SPI.

IDE:1.8.9 y 1.8.11

efectivamente, ese es mi problema!!! actualmente tengo solucionado lo de la superposición de los carácteres que se modifican (tiempo, temperatura, mensaje de error..), pero el que realmente me lleva de cabeza es el tratamiento de un String.

La instrucción d.toString("d/m/Y H:i:s") me devuelve por el Serial algo como 30/01/2020 22:02:25, mientras que haciendo las distintas pruebas para el TFT con el sprintf(TX, "&19", d.toString("d/m/Y H:i:s") me devuelve valores fuera de contexto. He estado probando con el

sprintf(TX, "%10d",d.toString("d/m/Y H:i").c_str() );

Pero tampoco da resultado, creo que por falta de mis conocimientos en el tema, no estoy haciendo unuso correcto del tratamiento de datos, el link de programarfacil, surbyte lo tengo visto, pero no se aplicar la solución a mi problema.

Hace tiempo que se puede hacer eso en los ESP8266 pero si hablamos de Arduinos que ocurre?
Acabo de probarlo en un MEGA y no va.

sprintf(TX, "%10d",d.toString("d/m/Y H:i").c_str() );

eso debe ir con %s no con %d
la conversión del String usando .c_str() es a una cadena de caracteres. Y si eso apunta al uso con sprintf debes usar %s.

:sob: :sob: :sob: :sob: :sob:

Ahora no refresca y se solapan los dígitos… voy a llorar!

tengo esto:

 if (millis() > TempsAra2 + periode2) {
    TempsAra2 = millis();

Data d = rtc.getData(); //rellotge


   tft.setTextColor(ST7735_WHITE);
  tft.setTextSize(1);
  tft.setCursor(2,2);
  tft.println(">>Data Logger<<");  


tft.setTextColor(ST7735_GREEN);
 tft.setCursor(1,80);
  sprintf(TX, "%19s",d.toString("d/m/Y H:i:s").c_str() );
  tft.print(TX);
 
  }

no entiendo, no se que hago mal

ARGHHHH

tft.setTextColor(ST7735_GREEN,ST7735_BLACK);

lo tenía delante de mis narices!!!!!

muchas gracias Surbyte y TFTLCDCyg sóis unos makinas!