Problemas con la libería UTFT

Hola
Tengo unos problemas con a librería UTFT, bueno, tal vez no sean con la propia librería.
El caso es que tengo un Arduino Mega y un shield TFT 2,8" con el driver IL9486. A base de mucho leer y probar he conseguido hacerla funcionar con la librería UTFT, pero no la original, sino la modificada por Prometec ya que la original con este driver, da una imagen en el espejo.

Como el shield lleva un slot para SD lo aprovecho para cagar bitmaps. Para ello he conseguido hacer funcionar las librerías SdFat, UTFT (link a la original) y UTFT_SdRaw conjuntamente para poder leer bitmaps desde la SD y funcionan perfectamente.

El caso es que tengo que imprimir unos valores que van cambiando y pretendo que vayan alineados con las letras RPM (p.e 1200 RPM) por el momento (más adelante debo presentar otro tipo de valores). Bien, pues después de haber probado mil cosas que he ido leyendo, no consigo que los valores cambien suavemente, si imprimo unos valores sobre otros, al final se convierten en un punto blanco de pixeles sin sentido, es decir se van machando unos a otros.

    myScreen.setColor(VGA_WHITE);
    myScreen.setFont(SevenSegNumFont);
    myScreen.print(format_text(speed, 5), 250, 150);

Si imprimo después el mismo texto, pero con el mismo color que el fondo (para que se borren), se ven los valores, pero aparece un parpadeo molesto.

    myScreen.setColor(VGA_WHITE);
    myScreen.setFont(SevenSegNumFont);
    myScreen.print(format_text(speed, 5), 250, 150);
    myScreen.setColor(VGA_BLACK);
    myScreen.print(format_text(speed, 5), 250, 150);

La función format_text es para resolver otro problema que es el del alineamiento. Si por ejemplo hay un valor de 1100 y luego baja a 998, el 1 queda remanente hasta que vuelva a tener 4 dígitos. El problema de la alineación lo he resuelto con el snprint_P. Me he preparado una función para formatear cualquier valor y que quede alineado a la derecha y a la izquierda ponga espacios.

// value: Valor para imprimir (double para que sea cualquier valor entero o decimal
//len: longitud del texto (por ejemplo, para valores xx.xx  len=5
String format_text(double value, byte len){
      char buffer[len] = " "; //Reserva un buffer para la String resultante
    snprintf_P(buffer, len, PSTR("%3d"), value); //Formatea el texto
    return buffer; //Devuelve el String formateado a la derecha
}

En teoría esto funciona bien si hay un set completo del font seleccionado. Dentro de la propia librería hay un font (SevenSegNumFont) que sólo lleva un set de números (0 al 9), por lo que cuando se formatea con snprintf_P, al no tener el carácter "espacio" en el set del font, pone un carácter completo del tamaño del font, es decir un cuadro en blanco.

Mis preguntas son:
¿Alguna ayuda para poner una transición "suave" al imprimir los valores?
¿Como se puede añadir al SevenSegNumFont el caracter "espacio"? El SevenSegNumFont está dentro del archivo DefaultFonts.c en las carpetas de la librería UTFT.

Gracias por vuestro tiempo.

Los "blink" o parpadeos en las TFT no son culpa de las pantallas ni de las librerías.
La velocidad de los microcontroladores no dan para más. Si quisieras una pantalla y mostrar imágenes o vídeos sin notar el refresh de la pantalla es mejor que uses Raspberry PI, osea un microprocesador.
Pero no está todo perdido lo puedes conseguir con un Arduino, el DUE.

¿Por qué DUE? Bueno por la velocidad, obvio. y porque hay una modificación de la librería ILI9341 a ILI9341_due y en el ILI9341_due_config.h tenemos esta maravillosa opción que nos arregla los blinks:

#define ILI9341_SPI_MODE_DMA // uses DMA in Due
Esta opción te da problemas si usas a la vez la opción de leer las SD.

Con #define ILI9341_SPI_MODE_EXTENDED también hay buenos resultados pudiendo incluso usar la misma comunicación SPI para la SD eso sí, a la hora de programar la TFT hay que hacerlo bien con independencia del modo en el config. Hay algunos ejemplos algo "guarros" por internet.

Por cierto si en la SD estás guardando pequeñas imágenes cómo iconos o similares estilo 32x32 pixeles, puedes usar un archivo en tu proyecto y guardar los bitmaps de imágenes en el propio Arduino. Un Mega y un Due tienen capacidad más que suficiente para esto.

Muchas gracias Cuantron por la respuesta.

El problema no es con el blinking de la pantalla, eso no me importa, pero tomo nota lo del DUE para mejorarlo. Por cierto, ¿vale el driver que indicas para la pantalla con el IL9486 que tengo?

Al final me he dado cuenta que lo que no funcionaba es lo que puse en la parte de formateo del texto "format_text". Me devolvia caracteres raros y penseaba que eran superpuestos :upside_down_face:

Salvo que haya muchas cosas que imprimir en la pantalla tiene una buena velocidad no se nota mucho el blink. Para ello lo que estoy haciendo es dibujar de inicio lo que va fijo en pantalla y luego sólo actualizo los valores que son necesarios.

Respecto a lo de cargar desde Arduino, hay bastantes iconos e imagenes, por lo que es mejor cargarlas desde la SD, ya que hay un par grandes (pantalla de presentación y otra de cierre).

Muchísimas gracias por su tiempo.

@pepepotero, disculpa porque edite en vez de responder y quité lo anterior.

Esto que comentas:

"Salvo que haya muchas cosas que imprimir en la pantalla tiene una buena velocidad no se nota mucho el blink. Para ello lo que estoy haciendo es dibujar de inicio lo que va fijo en pantalla y luego sólo actualizo los valores que son necesarios."

Sencillamente perfecto, así es cómo es.

La TFT que comentas difiere un poco de las que uso, quizás puedas usarla pero no estoy 100% seguro.

Para evitar signos extraños en los nombres de los archivos de la SD o que salgan cortados (en caso que el nombre del fichero sea muy largo) usa SdFat en vez de SD.

#include "SdFat.h"
#include "sdios.h"

Cuantron,

La pantalla es compatible con el DUE y funciona sin muchas modificaciones con el código del Mega, el problema es que la SD que tiene el shield no es compatible ya que el DUE parece ser que no tiene SPI en los pines y hay que conectarla directamente a la salida SPI que hay en el centro de la placa. Para ello hay que modificar el shield o poner una SD externa directamente a los pines del SPI, con lo cual se dificulta luego acoplar el shield. Además, parece ser que los Serial trabajan a 3,3v en vez de 5 por lo que para comunicarlo con otro el Arduino hay que colocar hardware adicional para adecuar las tensiones.

Si bien no son problemas insalvables si dificultan el proyecto, por ejemplo, a la hora de minimizar la caja para meter la pantalla o las modificaciones hardware.

Por cierto, los caracteres “raros” los obtenía con el sprinf_P (la verdad es que he leído mucho pero no me aclaro con los formateos) y no con los archivos de la SD. Para no tener problemas los archivos son 8 caracteres (nombre) +3 caracteres (extensión) y, lógicamente, sin caracteres no válidos, ¡vamos!, como los archivos del MS-DOS.

Muchas gracias

Como es tu placa? o mejor dicho los pines, estan organizados para conectarse en 50 a 53 como en el MEGA no?

Sí, al conectar el shield a la placa Mega2560, en la cual funciona perfectamente (TFT y SD), el pin CS es el 53.

Asi es como conectas.


Puedes poner un link del TFT, por favor.

Sí, surbyte es lo que debería hacer, pero para eso, tengo 2 opciones, o modificar la conexiones del lector de SD de esta TFT shield, que es la que tengo, o poner otro lector de SD externo y conectarla como indica.
El MEGA sí tiene los pines de SCI en los pines digitales (20 21 y 22, si no me equivoco) pero el Due no, están donde indicas, de ahí que haya que hacer las modificaciones.
Por el momento no quiero tocar la TFT (cortar pistas y hacer soldaduras) y para colocar el lector externo debería soldar los cables al puerto de la Due, por que los dupont hembra estorbarian para colocar correctamente la shield.
Todo esto sin contar que hay que colocar hardware adicional para adaptar el voltaje serial (3,3V) para comunicarlo con un UNO (5V).
Muchísimas gracias por el esquema.

Si vas a usar el DUE no le des vuelta, corta los pines y soldalos arriba y chau.