No pretendo crear una guía, solo quiero compartir lo que he aprendido al urgar entre las muchas lineas de código que suben los compañeros al foro. A sugerencia de surbyte, creo este hilo con la idea de que entre todos le saquemos todo el provecho posible a las pantallas TFT.
Advierto que habrá aspectos que bien se podrían resolver con lineas de código mejor optimizadas o depuradas, debo decir que soy un fan de la electrónica y no me considero un erudito, asi que toda crítica constructiva, será bien aprovechada.
Las librerías que he usado por orden de importancia son FTDI (FT800 de FTDI), ILI9341_due (me inclino por la versión 094 ), ILI9341 (Adafruit), TFTLCD (Adafruit), UTFT. Me gustaría manejar la librería ILI9341_t3 (teensy) o la desarollada para el gameduino2, pero ya veremos. Las que me parecen mas complicadas son: TFTLCD y ILI9341_due
Presentación de valores numéricos
Una de las primeras cosas que queremos ver en nuestra flamante pantalla TFT, es el valor de algun sensor de temperatura o de un acelerómetro, un voltaje, las RPM´s de algun motor, el ángulo de un servo, los datos de un GPS, etc, etc; casi siempre se vuelve un dolor de cabeza cuando vemos que lo que mandamos a la pantalla o se sobreescribe, presenta residuos de caracteres o bien en el mejor de los casos tiene un efecto parpadeante, y nos deja a medias con el gusto inicial.
El mejor camino es convertir el valor numérico en una cadena de caracteres; casi todas las librerías tienen muy bien optimizada esta parte.
El primer paso es definir una variable tipo char, con una sola basta para presentar todos los valores en un proyecto.
char TX[50];
Dentro del loop en el que se presentarán los datos en pantalla, convertimos el valor numérico en una cadena de caracteres mediante la instrucción sprint. Esta conversión funciona con valores enteros, aunque bien podría funcionar con numeros float, he visto que se obtiene un "?" como resultado. Dado que el resultado es una cadena, podemos dar el formato que deseemos, dependiendo del tipo de fuente, podemos incluso insertar símbolos o letras, Acá algunos ejemplos
Número con tres decimales "000"
sprintf(TX,"%03d", Valorslider);
Número con dos decimales, espacio y letras:
sprintf(TX,"%03d C", Valorslider);
Número con compuesto por varios datos:
sprintf(TX,"%02d:%02d:%02d", hh, mm, ss);
La ventaja de complementar con un cero las posiciones a la izquierda del dato es que los números no se encimarán o dejarán pixeles remanentes.
Bien pueden usarse expresiones como estas: %2d, en las que no se dibujan ceros en las posiciones libres a la izquierda, habrá que probar cual de las dos opciones da el mejor resultado, ya que algunas librerias centran por default los caracteres y dejan pixeles de los caracteres previos. Las librerias derivadas de la adafruit_ILI9341 responden mejor con el formato %02d, el %2d deja residuos.
Otro problema que es culpable de pixeles remanentes, tiene que ver con el diseño de la propia fuente, en teoría todos los caracteres deben tener dimensiones idénticas, es decir altura y ancho común, esto da como resultado que los caracteres se sobreescriban sin dejar residuos, cuando alguno de ellos no coincide en medidas, tiende a dejar residuos. La solución es crear una fuente personalizada o bien que la propia libreria tenga la posibilidad de insertar espacios adicionales entre caracteres.
Con la libreria TFTLCD ambos formatos funcionan sin problemas. Ejemplo:
int T = random(90,110);
sprintf(TX,"%3d C", T);
tft.setCursor(137, 50);
tft.setTextColor(YELLOW, BLACK); tft.setTextSize(3);
tft.println(TX);
int TDInt = random(95,115); //simula los datos del sensor
int fracc = random (0,99); //simula los datos del sensor
sprintf(TX,"%3d.%02d C", TDInt, fracc);
tft.setCursor(85, 100);
tft.setTextColor(YELLOW, BLACK); tft.setTextSize(3);
tft.println(TX);
Ejemplo con la librería ILI9341_due (v 094)
t3.defineArea(0, 0, 319, 239);
t3.selectFont(Arial14);
t3.setFontLetterSpacing(2);
unsigned long currentMillis1 = millis();
if(currentMillis1 - previousMillis1 > 2000)
{
previousMillis1 = currentMillis1;
lecturaV = random(0,1023); //simula los datos del sensor
Volumen = map(lecturaV,0,1023,0,100);
sprintf(TX,"Lectura = %04d (%03d ml)", lecturaV, Volumen);
t3.setFontColor(WHITE, ILI9341_BLACK);
t3.drawString(TX,80,50);
} //usa millis en lugar de delay
Las librerias UTFT y FTDI, cuentan con instrucciones que directamente pueden manejar valores numéricos e incluso permiten aplicarles un formato, su uso es bastante simple
Sigue: creación de menus aprovechando la pantalla táctil