LILYGO TTGO T-Display: the ESP32 That Shows the Result Right Away

An ordinary development board can do a great deal, but it talks to the developer mostly through lines in the Serial Monitor. The LILYGO TTGO T-Display has a more convincing way of doing it: a colour screen on the board itself. Wire up a sensor and you see the readings straight away. Pull data over Wi-Fi and you can draw a graph or a status line. Build a standalone instrument and there is no separate display to add, no power to route to it and no room to find for it inside the enclosure.

That is why the T-Display is more interesting than just another ESP32 board. It is very nearly a finished front panel for a device: a microcontroller, a screen, two buttons, USB-C and single-cell Li-Po charging on one narrow circuit board.

Pinout diagram of the classic LILYGO TTGO T-Display V1.1. The left header runs GND, GND, 21, 22, 17, 2, 15, 13, 12, GND, GND, 3V3 and the right header 3V3, 36, 37, 38, 39, 32, 33, 25, 26, 27, GND, 5V. The ST7789V display is on MOSI 19, SCLK 18, CS 5, DC 16, RST 23 and BL 4, and the two buttons are on GPIO0 and GPIO35.
The classic T-Display, V1.1: both headers, the six display signals and the two buttons. Click for the full-size version.

Which board this is about

The name T-Display has grown into a whole family, so the first technical trap is to take the specifications of the wrong model. What follows is about the classic LILYGO/TTGO T-Display on the original ESP32, with a 1.14-inch screen and a resolution of 135 × 240 pixels. This is not the T-Display-S3: the S3 has a different processor, a 1.9-inch screen, a different display connection, different GPIOs and PSRAM.

Current LILYGO documentation lists the SoC of the classic board as ESP32-D0WDQ6. Flash size and the USB-to-UART chip can differ between production batches, so a seller’s description or somebody else’s example code is no substitute for checking the board in your hand.

Specifications

PartSpecificationWhat it means in practice
MicrocontrollerESP32-D0WDQ6The classic ESP32, not an S2, S3 or C3
ProcessorTwo Xtensa LX6 cores, up to 240 MHzEnough for Wi-Fi, the interface, sensors and background logic at the same time
Memory520 KB of on-chip SRAM, no PSRAMLarge images and double buffering call for careful memory budgeting
FlashUsually 4 MB; a 16 MB variant existsThe size has to be checked before choosing a partition table
Wireless2.4 GHz Wi-Fi 802.11 b/g/n; Bluetooth 4.2 BR/EDR and BLESuits MQTT, HTTP, ESP-NOW, BLE beacons and talking to a phone
Display1.14-inch IPS TFT, ST7789V controllerA colour screen with good viewing angles
Resolution135 × 240 in portrait; usually 240 × 135 in landscapeGood for one large figure, a few status lines or a small graph
Display interface4-wire SPI; the stock TFT_eSPI profile runs it at 40 MHzThe screen is fast, but it occupies several GPIOs
ControlsTwo buttons: GPIO0 and GPIO35Enough for a menu, page flipping, a confirmation or a wake-up
PowerUSB-C or a single-cell Li-Po; charging on boardThe basis for a portable instrument with no separate charger module
Battery monitoringADC on GPIO34, sense circuit enabled by GPIO14The charge level can be shown right in the interface
USBUSB-C through a USB-to-UART bridgeThe original ESP32 has no native USB device; the port serves power, flashing and serial communication
USB-to-UARTCH9102 on what is currently sold; older revisions used CP210xWhen a driver misbehaves, look at the actual VID/PID rather than guessing from the board name
Logic levels3.3 V; the GPIOs are not 5 V tolerantA 5 V signal needs level shifting
DimensionsAbout 51.5 × 25 mmNoticeably narrower than most “DevKit plus a separate TFT” builds
Development environmentsArduino IDE, PlatformIO, ESP-IDF; MicroPython is possibleArduino is the easier quick start, ESP-IDF the stricter choice for a serious project

A couple of numbers give a sense of the scale. A full frame in RGB565 takes 135 × 240 × 2 = 64,800 bytes, which is about 63.3 KiB. Two frame buffers are already around 126.6 KiB, before the Wi-Fi stack, the tasks and the application’s own data. That is why partial redraws, modestly sized sprites and updating only the regions that changed are especially useful on this board.

Why the built-in display earns its place

The screen here is useful as a development tool, not as decoration. It shortens the path from a prototype to something you can use without a computer.

The screen sets limits too. It is small and it is not a touchscreen, and six of the ESP32’s signals are already spoken for by the display. A backlight left on all the time makes a noticeable difference to battery life. Complex graphics run short of memory without PSRAM, so the T-Display is at its best not as a tiny smartphone but as a clear interface built from a few well-chosen readings.

What is already wired to the ESP32

Function on the boardGPIOWhat matters
TFT MOSI19Data to the ST7789V
TFT SCLK18The display clock line
TFT CS5Display chip select, and an ESP32 boot-strapping pin at the same time
TFT DC16Switches between command and data
TFT RESET23Hardware reset for the display controller
TFT backlight4Can be switched on, switched off and dimmed with PWM
Button on GPIO00Also BOOT/strapping: holding it during a reset puts the ESP32 into the bootloader
Second button35Input only; GPIO35 has no internal pull resistors
Li-Po measurement34ADC1, input only
Sense circuit enable14GPIO14 is usually driven high before the battery is read

It is sensible to treat these pins as taken. SPI does in theory allow several devices to share the MOSI and SCLK lines, but for a first project it is safer to leave GPIO18 and GPIO19 to the screen and put an external SPI bus on free pins.

The headers, pin by pin

The tables below assume the display facing you and the USB-C connector at the bottom.

Left header, top to bottom

PinWhat it can doLimits and good uses
GNDGroundTwo pins in a row
GNDGround—
GPIO21Digital input/outputThe recommended SDA for I²C
GPIO22Digital input/outputThe recommended SCL for I²C
GPIO17Digital input/outputOne of the least troublesome free GPIOs; fine for UART TX or PWM
GPIO2ADC2, Touch2, digital I/OA strapping pin: external circuitry must not force the wrong level at start-up
GPIO15ADC2, Touch3, digital I/OStrapping and JTAG; use with care
GPIO13ADC2, Touch4, digital I/OOverlaps JTAG, but is usually usable after boot
GPIO12ADC2, Touch5, digital I/OStrapping and JTAG; an active external load during reset is especially unwelcome here
GNDGroundTwo pins in a row
GNDGround—
3V33.3 V powerNot a GPIO

Right header, top to bottom

PinWhat it can doLimits and good uses
3V33.3 V powerNot a GPIO
GPIO36 / SVPADC1_CH0, digital inputInput only, no internal pull resistor
GPIO37ADC1_CH1, digital inputInput only, no internal pull resistor
GPIO38ADC1_CH2, digital inputInput only, no internal pull resistor
GPIO39 / SVNADC1_CH3, digital inputInput only, no internal pull resistor
GPIO32ADC1_CH4, Touch9, digital I/OAn excellent general-purpose GPIO, and an analogue input that still works while Wi-Fi is running
GPIO33ADC1_CH5, Touch8, digital I/OAn excellent general-purpose GPIO, and an analogue input that still works while Wi-Fi is running
GPIO25ADC2_CH8, DAC1, digital I/OA true 8-bit DAC; handy as an output, as PWM, or as SCK for an external SPI bus
GPIO26ADC2_CH9, DAC2, digital I/OThe second true 8-bit DAC; handy as MOSI for an external SPI bus
GPIO27ADC2_CH7, Touch7, digital I/OA general-purpose GPIO; handy as MISO for an external SPI bus
GNDGround—
5V5 V power railNot a GPIO, and not a sign of 5 V logic

SVP and SVN are the historical names of the SENSOR_VP and SENSOR_VN analogue inputs, that is GPIO36 and GPIO39. They are not power pins.

How to choose GPIOs without unpleasant surprises

For ordinary digital inputs and outputs the first candidates are GPIO17, 21, 22, 25, 26, 27, 32 and 33. It makes sense to keep GPIO21 and GPIO22 for I²C.

For a second SPI bus, the official LILYGO factory example uses a convenient group:

External SPI signalGPIO
SCK25
MOSI26
MISO27
CS33

For analogue sensors with Wi-Fi switched on, choose ADC1: GPIO32, 33, 36, 37, 38 or 39. On the classic ESP32, ADC2 shares a resource with Wi-Fi, so reading GPIO2, 12, 13, 15, 25, 26 or 27 as analogue inputs may simply not work while the radio is running. GPIO36–39, meanwhile, are input only and need an external pull resistor if the sensor or the button relies on one.

There are three more rules that save a particularly large amount of time:

  1. GPIO0, 2, 5, 12 and 15 are read during reset as strapping pins. Connected peripherals must not force their start-up levels.
  2. GPIO34–39 are inputs only and have no software pull-up or pull-down. On the board itself, GPIO34 and GPIO35 are already taken by the battery and by a button.
  3. A load must not be powered straight from a GPIO. A relay, a motor, a solenoid or a high-power LED strip is switched through a transistor, a MOSFET or a driver with whatever protection it needs.

Power and battery life

The board takes power over USB-C and supports a single-cell Li-Po through a 1.25 mm two-pin connector. The cell can be charged on the board, and its voltage measured on GPIO34 once the sense circuit has been enabled with GPIO14. That is convenient for a charge indicator of your own, but a percentage cannot be obtained reliably from a simple linear formula: Li-Po voltage changes non-linearly, and the ADC of the original ESP32 needs calibration.

The T-Display should not be mistaken for an ultra-frugal sensor node just because the ESP32 itself can deep-sleep. Hobbyist measurements of the classic board have produced rough figures of around 66 mA when active, 80–140 mA with Wi-Fi running and roughly 9 mA in light sleep. These are not datasheet guarantees: the result depends on brightness, firmware, supply quality and board revision. The main practical conclusion is to switch the backlight off or dim it, turn the radio off between sessions and wake the device with a button or a timer.

What people build on a T-Display: three telling cases

1. A local Home Assistant screen

One of the most natural uses is to show a temperature, power consumption, the state of the heating or any other Home Assistant entity. In one published project the board displays the oven temperature through ESPHome, but the same template fits the time of the next train, the level in a tank or an internet speed. The value of this case is the minimal hardware: for a fixed panel, the T-Display and USB power are all it takes.

2. A departure board by the door

The open project ttgo-departure-board turns the board into a public transport display. The repository holds 33 firmware variants for networks in 17 countries: the ESP32 joins Wi-Fi, syncs the time over NTP, queries an API roughly every 30 seconds and updates the countdown every second. The two buttons switch stops and control the screen. It is a good example of an interface where 240 × 135 pixels is not too little: if you show only the direction, the line, the platform and the minutes, that is exactly as much information as you need before leaving the house.

3. A tiny wireless monitor

In 2025 a project drew attention by sending a shrunken image of the desktop over Wi-Fi to a compatible T-Display board. The computer compares frames and sends only the pixels that changed, applying batching and RLE. On an almost static picture its author reached up to 60 frames per second, and around 5 frames per second under heavy motion, with latency below 100 ms on a good network. It is not a practical replacement for a monitor, but it is a fine demonstration of how a traffic-saving algorithm can squeeze unexpectedly much out of an ESP32 and a small SPI display. One thing matters here: the project used a compatible TENSTAR board with 16 MB of flash, so that figure cannot be carried over to any LILYGO automatically.

Another popular layer is mini-games. Two buttons, a colour screen and ready-made libraries have produced Space Shooter, Breakout and small handheld builds carrying several games at once. That is entertainment and, at the same time, a decent teaching bench for sprites, frame rate, button handling and memory management.

The same T-Display shown three times: wired to a temperature sensor and displaying 22.6 °C, acting as a smart-home panel showing 428 W and 22.6 degrees, and running a game with a Li-Po cell plugged into its battery socket.
One board, three roles: a portable meter, a desk panel and a pocket console.

Four T-Display builds from the channel

The Build Mode channel has built on a T-Display four times so far. In one video the board becomes a Bluetooth speaker: the ESP32 receives music over A2DP, a MAX98357A amplifier drives a small speaker and the screen shows a live spectrum analyzer. In another it reads an MPU-6500 motion sensor over SPI, and a page in the browser turns the readings into a 3D model. In the third it balances a frame on the thrust of a single propeller: an MPU-6500 measures the tilt, and a PID controller on the ESP32 drives the motor through a DRV8833. In the fourth it sits in a 3D-printed case as a level and compass, with an MPU-6500, a BMM150 magnetometer and an 18650 cell.

What people look for most often, and why

Four themes repeat in the top results for queries about the classic T-Display: the first run, configuring TFT_eSPI, the pinout, and ready-made projects — clocks, weather, Home Assistant, MQTT panels and games. That is an accurate reflection of the board’s strengths and weaknesses.

People are drawn in by how quickly they can get a good-looking result, and most often they stumble over the configuration of this particular display. TFT_eSPI needs the Setup25_TTGO_T_Display.h profile; it pins down the ST7789V, the 135 × 240 geometry and the correct GPIOs. On alternative stacks you have to account for the offset of the active area of the matrix, the BGR colour order and separate backlight control. A telling failure: the program and the LCD itself can both be working, yet the screen looks black simply because GPIO4 never switched the backlight on.

The minimal Arduino test, once the TFT_eSPI profile has been selected, looks like this:

#include <TFT_eSPI.h>

TFT_eSPI tft;

void setup() {
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);

  tft.init();
  tft.setRotation(1);              // 240 × 135
  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_CYAN, TFT_BLACK);
  tft.drawString("Wi-Fi: OK", 12, 12, 4);
}

void loop() {}

In the Arduino IDE the manufacturer recommends the ESP32 Dev Module profile, a CPU frequency of 240 MHz, QIO, 4 MB of flash for the ordinary version, PSRAM disabled and an upload speed of 921600. If the firmware does not start or the bootloader does not answer, GPIO0 is used as BOOT: hold the button down, tap Reset, release BOOT and try the upload again.

Strengths and weaknesses

StrengthsWeaknesses
A colour IPS panel is already fitted and proven by the design of the boardThe screen is small, with no touch layer
Wi-Fi, Classic Bluetooth and BLEAn old ESP32 generation: no native USB and none of the newer ESP32-S3 capabilities
Two buttons, USB-C, Li-Po charging, battery monitoringNo PSRAM; heavy graphics eat the SRAM quickly
More compact than a DevKit plus a separate TFTThe display and the service circuits occupy a noticeable number of GPIOs
Arduino, PlatformIO, ESP-IDF, TFT_eSPI and LVGL examples all existADC2 conflicts with Wi-Fi, and GPIO36–39 work as inputs only
A good fit for standalone panels and metersThe backlight and Wi-Fi limit how long it runs on a battery
Two true DACs on GPIO25/26 and plenty of ADC1 inputsRevisions differ in flash and USB-to-UART, so the specification of a particular unit has to be checked

Bottom line

The LILYGO TTGO T-Display is valuable not for record specifications but for a well-judged layout. It turns the invisible work of a microcontroller into an interface you can read: the device reports its state immediately, shows measurements, takes commands from two buttons and can run on a battery.

For a desk clock, a Home Assistant indicator, a portable meter, an MQTT remote, a mini-game or a networked departure board, the classic T-Display remains a very sensible foundation. The main thing is to remember its age and its limits: do not confuse it with the T-Display-S3, do not count on PSRAM, protect the boot GPIOs, use ADC1 while Wi-Fi is active and check the flash size of the particular board. If 240 × 135 pixels and two buttons are enough for the project, the built-in screen saves not only components but the most expensive resource in prototyping — the time between an idea and the first result you can actually see.

Everything above, condensed into a platform-independent hardware reference a coding agent can follow: pin allocation classes, electrical rules, the canonical GPIO matrix and a machine-readable board profile.