LilyGo T-Display-S3
The T-Display-S3 is an ESP32-S3 board with a bright 1.9″ 170×320 IPS screen built right in — the board to pick when your prop needs a display: ammo counters, gauges, countdowns, scanner readouts.
| Chip | ESP32-S3 |
|---|---|
| Flash | 16 MB |
| PSRAM | 8 MB |
| Max LEDs | 256 |
| Audio | ✔ |
| Display | 1.9" 170x320 ST7789 IPS LCD (8-bit parallel i8080) |
| Touch | — |
| Storage | On-chip FAT (USB drive) |
| Network | ✔ |
| Update modes | Standalone (WiFi/OTA) · Loader (USB-drop) |
What it’s good for
Section titled “What it’s good for”Any prop where the screen is the effect. The reference build is the Predator Gauntlet: a wrist bio-scanner where one onboard button cycles between a thermal scan (looping heartbeat audio plus a red ECG trace), a vocal-mimicry mode with a live waveform, and a three-digit self-destruct countdown that ends in a full-screen strobe — with a small LED strip pulsing along on GPIO13. Because the board already has two buttons (BOOT on GPIO0 and a second on GPIO14), you can build a fully interactive prop before soldering a single wire. With 16 MB of flash and 8 MB of PSRAM, there’s plenty of room for fonts and sounds.
Wiring
Section titled “Wiring”| GPIO | Can do | Notes |
|---|---|---|
0 | in / out | BOOT button (strapping pin) |
1 | in / out / PWM / ADC | ADC1_CH0; I2S BCLK when an audio amp is wired |
2 | in / out / PWM / ADC | ADC1_CH1; I2S LRC/WS when an audio amp is wired |
3 | in / out / PWM / ADC | ADC1_CH2; I2S DIN when an audio amp is wired |
10 | in / out / PWM / ADC | ADC1_CH9 |
11 | in / out / PWM / ADC | ADC2 — unreliable while WiFi is on |
12 | in / out / PWM / ADC | ADC2 — unreliable while WiFi is on |
13 | in / out / PWM / ADC | ADC2 — unreliable while WiFi is on |
14 | in / out / PWM | Second onboard button |
16 | in / out / PWM / ADC | ADC2 — unreliable while WiFi is on |
17 | in / out / PWM / ADC | ADC2 — unreliable while WiFi is on |
18 | in / out / PWM / ADC | ADC2 — unreliable while WiFi is on |
21 | in / out / PWM | Default LED data pin (no onboard pixel) |
43 | in / out / PWM | UART0 TX |
44 | in / out / PWM | UART0 RX |
Reserved pins — leave these alone
GPIO 4— Battery voltage ADCGPIO 5— LCD resetGPIO 6— LCD chip selectGPIO 7— LCD data/commandGPIO 8— LCD write strobeGPIO 9— LCD read strobeGPIO 15— LCD power enable — must stay highGPIO 38— LCD backlightGPIO 39— LCD data D0GPIO 40— LCD data D1GPIO 41— LCD data D2GPIO 42— LCD data D3GPIO 45— LCD data D4GPIO 46— LCD data D5GPIO 47— LCD data D6GPIO 48— LCD data D7
The screen runs on an 8-bit parallel bus and claims most of the high GPIOs, which
leaves the 15 header pins above for your build. There’s no onboard addressable
pixel — an external LED strip’s data line goes to a free header pin, with
GPIO21 as the factory default if your show.json doesn’t name one. Buttons
and sensors go on any free input-capable pin; the two onboard buttons (GPIO0 and
GPIO14) are already wired and ready to use as inputs.
Sound comes from a small I2S amplifier (such as the MAX98357A) wired to the three low header pins:
| Amp pin | Board pin |
|---|---|
| BCLK | GPIO1 |
| LRC / WS | GPIO2 |
| DIN | GPIO3 |
Leave the amp’s GAIN and SD pins at their defaults. This is the same amp wiring convention as the ESP32-S3-LCD-1.47.
Storage & your data
Section titled “Storage & your data”Your show.json, config.json, fonts, and sounds live on the board’s on-chip
FAT partition, which the board exposes as a USB drive — plug it in and it
shows up like a thumb drive. Copy files on and off directly, or edit them live
from the device’s web dashboard (Files tab) once it’s on WiFi.
First-time flashing
Section titled “First-time flashing”The T-Display-S3 flashes over its native USB-C port. If the board doesn’t show up for flashing, put it in ROM download mode manually: hold the BOOT button (GPIO0) while pressing reset, then release BOOT. That gesture always works and is also the ultimate un-brick path. Full walkthrough: Flashing your board.
Update modes
Section titled “Update modes”The T-Display-S3 supports both update modes — pick one per device:
- Standalone — the device joins WiFi and you update firmware from its web dashboard, no cable. See the standalone quickstart.
- Loader — no WiFi needed: tap RESET then press BOOT, the device appears as
a USB drive, and you drag a
firmware.uf2onto it. The full loader loop is verified end-to-end on this exact board. See the loader quickstart.
The two modes use different flash layouts, so switching between them is a one-time USB reflash (which erases the data drive — back up first).
Quirks
Section titled “Quirks”- GPIO15 must stay high or the display and its power rail stay dark. The firmware drives it high at boot, so you never have to think about it — just don’t wire anything else to it.
- The LCD runs on an 8-bit parallel bus, not SPI, and consumes most of the high GPIOs. Fifteen header pins remain usable.
- No onboard addressable pixel. GPIO21 is only the factory-default data pin for an external strip; nothing lights up until you wire one.
- GPIO1/2/3 are the documented I2S amp wiring (BCLK / LRC / DIN) — keep them free if you plan to add sound later.
- GPIO11–13 and 16–18 are ADC2 channels: analog reads on them are unreliable while WiFi is on. Use GPIO1–3 or GPIO10 (ADC1) for analog sensors.
- The drag-a-UF2 loader update flow is fully verified on this board, making it a great first board for cable-free updates.