Este display TFT LCD de bajo coste, que además es touch panel, es ideal para proyectos basados en ESP8266 por su comunicación SPI y porque nos ahorrará algún pin al poder prescindir de usar botones y usar su touch panel.
El tamaño es adecuado para proyectos de domótica, bastante amplio, pero la visibilidad de este tipo de displays TFT LCD es bastante reducida. Realmente sólo se ve bien en linea de visión perpendicular a la pantalla, perdiendo mucha definición y colores conforme lo miramos de soslayo.

Descripción de las conexiones

El display funciona con 5V, tanto el led como el chip. Yo los he llegado a conectar a 3.3V pero resulta menos estable. Si el led lo conectamos a 3.3V tendrá menos brillo.
Todas las conexiones están pensadas para hacer uso del SPI por hardware y que la visualización sea mucho más rápida.
El pin DC es extra para este dispositivo y no forma parte de SPI, no obstante respetar el que pone por cuestiones de velocidad.
Usaremos el pin CS de ESP8266 para este dispositivo. Si hay otros dispositivos SPI que requieran menos velocidad, podemos usar el resto de pines como CS para ellos.
La librería TFT_eSPI es ideal para programar este display. De uno de sus ficheros de cabecera sacamos la información de las conexiones.
  1. // FROM TFT_eSPI/User_Setup_Select.h (librería TFT_eSPI)
  2. // PINS
  3. // Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
  4. // Display LED to NodeMCU pin VIN (or 5V, see below)
  5. // Display SCK to NodeMCU pin D5
  6. // Display SDI/MOSI to NodeMCU pin D7
  7. // Display DC (RS/AO)to NodeMCU pin D3
  8. // Display RESET to NodeMCU pin D4. Can be connected to the NodeMCU RST pin
  9. // or 3.3V to free up a control pin. The NodeMCU D0 pin can be used for RST
  10. // Display CS to NodeMCU pin D8. The TFT CS pin can be connected to GND if no more
  11. // SPI devices (e.g. an SD Card) are connected, in this case comment out
  12. // the #define TFT_CS line below so it is NOT defined.
  13. // Display GND to NodeMCU pin GND (0V)
  14. // Display VCC to NodeMCU 5V or 3.3V

La librería TFT_eSPI

La librería TFT_eSPI es rápida y bastante versátil. Está hecha específicamente para ESP8266 y ESP32. La documentación es bastante difícil porque está dispersa en códigos fuente y librerias, por lo que es necesario indagar en el código de los numerosos ejemplos y en el de la propia librería.
Tampoco se puede, a la fecha de escribir esto, instalar desde el gestor de librerías del IDE de Arduino. Hay que bajarse el ZIP e instalar desde fichero.
Veámos el uso de esta librería por partes.

TFT_eSPI/User_Setup_Select.h

La librería soporta varios chips para otros displays que precisan otras configuraciones. Para ajustar los ficheros de cabecera a nuestro chip y nuestro montaje en concreto debemos editar User_SEtupSelect.h para apuntar al fichero de cabecera que corresponde al chip de nuestra pantalla, en este caso el ILI9341.
  1. ...
  2. // Only ONE line below should be uncommented. Add extra lines and files as needed.
  3. // COMENTAR ESTE
  4. //#include <User_Setup.h> // Default setup is root library folder
  5. // DESCOMENTAR ESTE OTRO
  6. #include <User_Setups/Setup1_ILI9341.h> // Setup file configured for my ILI9341
  7. ...

User_Setups/Setup1_ILI9341.h

Este fichero contiene mucha información, pero realmente todo puede resumirse a lo siguiente (guardar el original para referencia futura y hacer uno con un nombre distinto, p.e. pantalla9341.h).
  1. // DRIVER
  2. #define ILI9341_DRIVER
  3. // El pin CS del display. Si no hay más dispositivos en el bus SPI (SDCARD) se puede
  4. // conectar a tierra y comentar esta linea
  5. #define TFT_CS PIN_D8
  6. // Data Command control pin
  7. #define TFT_DC PIN_D3
  8. // El pin RST se puede conectar a RST del ESP8266 (valor -1) o a 3.3V
  9. //#define TFT_RST PIN_D4
  10. #define TFT_RST -1
  11. // El pin CS del touch. Si esta linea está comentada no compila las funciones "touch"
  12. #define TOUCH_CS PIN_D1
  13. // FUENTES. Lo que se comente no se compilará y ahorrará memoria
  14. #define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
  15. #define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
  16. #define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
  17. #define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
  18. // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
  19. #define LOAD_FONT7
  20. // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
  21. #define LOAD_FONT8
  22. //#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
  23. #define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
  24. // Comenta para liberar memoria e inhabilitar el smooth de fuentes
  25. #define SMOOTH_FONT
  26. // Velocidad de refresco de la pantalla
  27. // With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
  28. #define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
  29. // #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
  30. // Velocidad de refresco del touch
  31. // The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
  32. #define SPI_TOUCH_FREQUENCY 2500000
  33. // Comentado libera memoria, pero no puedes usar otros esclavos conectados al bus SPI
  34. // Transaction support is needed to work with SD library but not needed with TFT_SdFat
  35. // Transaction support is required if other SPI devices are connected.
  36. // #define SUPPORT_TRANSACTIONS
Tras haber configurado User_Setup_Select.h y Setup1_ILI9341.h podemos empezar a compilar ejemplos y ver el funcionamiento. No es demasiado complejo, salvo quizá la opción de poder añadir bitmaps.

Colores: el RGB565

RGB 565
De uno de los ficheros de cabecera obtenemos la definición de colores para un uso rápido. Esta librería utiliza una definición de color especial el color RGB565En esta web podemos definirlos visualmente con un color picker tradicional.
  1. // New color definitions use for all my libraries
  2. #define TFT_BLACK 0x0000 /* 0, 0, 0 */
  3. #define TFT_NAVY 0x000F /* 0, 0, 128 */
  4. #define TFT_DARKGREEN 0x03E0 /* 0, 128, 0 */
  5. #define TFT_DARKCYAN 0x03EF /* 0, 128, 128 */
  6. #define TFT_MAROON 0x7800 /* 128, 0, 0 */
  7. #define TFT_PURPLE 0x780F /* 128, 0, 128 */
  8. #define TFT_OLIVE 0x7BE0 /* 128, 128, 0 */
  9. #define TFT_LIGHTGREY 0xC618 /* 192, 192, 192 */
  10. #define TFT_DARKGREY 0x7BEF /* 128, 128, 128 */
  11. #define TFT_BLUE 0x001F /* 0, 0, 255 */
  12. #define TFT_GREEN 0x07E0 /* 0, 255, 0 */
  13. #define TFT_CYAN 0x07FF /* 0, 255, 255 */
  14. #define TFT_RED 0xF800 /* 255, 0, 0 */
  15. #define TFT_MAGENTA 0xF81F /* 255, 0, 255 */
  16. #define TFT_YELLOW 0xFFE0 /* 255, 255, 0 */
  17. #define TFT_WHITE 0xFFFF /* 255, 255, 255 */
  18. #define TFT_ORANGE 0xFDA0 /* 255, 180, 0 */
  19. #define TFT_GREENYELLOW 0xB7E0 /* 180, 255, 0 */
  20. #define TFT_PINK 0xFC9F
  21. // Next is a special 16 bit colour value that encodes to 8 bits
  22. // and will then decode back to the same 16 bit value.
  23. // Convenient for 8 bit and 16 bit transparent sprites.
  24. #define TFT_TRANSPARENT 0x0120
El RGB565 sólo utiliza 2 bytes (en lugar de 3) para definir una mezcla de colores RGB. Con ello se reduce el rango cromático (inapreciable en este tipo de pantallas TFT LCD) y nos ahorramos un byte de memoria.

Bitmaps (XPM – X PixMaps)

Si indagamos en el código fuente de TFT_eSPI.cpp vemos que hay métodos que nos permiten dibujar iconos monocromos previamente guardados en memoria. El formato es el de las imágenes C++: XPM (X PixMap) que podemos diseñar con Gimp.
  1. /***************************************************************************************
  2. ** Function name: drawBitmap
  3. ** Description: Draw an image stored in an array on the TFT
  4. ***************************************************************************************/
  5. void TFT_eSPI::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) {