Preview build — page text is a draft awaiting human review. Code badges come from real compiles. The flasher is real but not yet hardware-tested; the Playground is still a preview.

1.8″ ST7735 TFT with ESP32-S3-DevKitC-1 — hardware SPI

Drive a 1.8-inch ST7735 colour TFT from an ESP32-S3-DevKitC-1 on hardware SPI (GPIO11/12) with CS 10, DC 15 and RESET 16 using Adafruit ST7735.

Arduino C++Verified — core esp32 3.3.12, Adafruit ST7735 and ST7789 Library 1.12.0, 3 Nov 2026Compile-only

Community draft — report a mistake

The 1.8″ ST7735 is the cheapest colour screen in Indian shops and a good fit for the S3: the chip’s hardware SPI drives it quickly, and the module is 3.3 V already, so no level shifting.

Wire SDA (MOSI) to GPIO11, SCK to GPIO12, CS to GPIO10, A0 to GPIO15 and RESET to GPIO16, and power the board and backlight from 3V3.

Wiring

ESP32-S3-DevKitC-1Only the pins used are shown · 3.3 V logic1.8" ST7735 colour TFT (128×160)3V315 · 1516 · 1610 · 1011 · 1112 · 12GNDLEDSCKSDAA0RESETCSGNDVCC
Every connection
ESP32-S3-DevKitC-11.8" ST7735 colour TFT (128×160)WireNotes
3V3VCCred
GNDGNDblack
10CSpurple
16RESETorange
15A0blueA0 is the data/command (DC) pin.
11SDAgreenSDA here is SPI MOSI, not I2C.
12SCKyellow
3V3LEDredBacklight. Use a GPIO with PWM instead to dim it.

3.3–5 V on VCC (on-board regulator on most boards) part, 3.3 V board. The ST7735 is a 3.3 V chip. ESP32 and Pico connect directly. On a 5 V Arduino, put a level shifter or 1 kΩ / 2 kΩ dividers on CS, RESET, A0, SDA and SCK — 5 V signals shorten the display’s life.

Board quirks

  • The S3’s fast hardware SPI is on GPIO11 (MOSI) and GPIO12 (SCK). The display has no MISO, so GPIO13 stays free.
  • GPIO15/16 for A0/RESET have no boot role. On the S3, Arduino core 3.x also uses GPIO15/16 as Serial1’s default pins — if you add a UART device later, give Serial1 other pins.
  • The same 1.8″ board comes with different panel tabs. Wrong colours or a band of noise at the edges means you need INITR_GREENTAB or INITR_REDTAB instead of INITR_BLACKTAB.
  • The sketch shows the PSRAM size: 0 KB is normal with the default settings. N8R8/N16R8 boards report 8192 KB once you select OPI PSRAM in Tools.

Code

st7735-esp32s3.inoArduino C++Open in PlaygroundOpen in PlaygroundFlash
// 1.8" ST7735 128x160 SPI TFT on an ESP32-S3-DevKitC-1 (hardware SPI on the default FSPI pins).
// VCC → 3V3, GND → GND, CS → GPIO10, RESET → GPIO16, A0 (DC) → GPIO15, SDA → GPIO11 (MOSI),
// SCK → GPIO12, LED → 3V3 (backlight).
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

constexpr int8_t TFT_CS = 10;
constexpr int8_t TFT_DC = 15;
constexpr int8_t TFT_RST = 16;
Adafruit_ST7735 tft(TFT_CS, TFT_DC, TFT_RST);  // uses SPI: SCK 12, MOSI 11 on the S3

void setup() {
  Serial.begin(115200);
  tft.initR(INITR_BLACKTAB);  // try INITR_GREENTAB / INITR_REDTAB if colours or edges look wrong
  tft.setRotation(1);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextColor(ST77XX_CYAN);
  tft.setTextSize(2);
  tft.setCursor(8, 8);
  tft.print("ESP32-S3");
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_WHITE);
  tft.setCursor(8, 34);
  tft.printf("PSRAM: %u KB", ESP.getPsramSize() / 1024);
  Serial.println("ST7735 ready");
}

void loop() {
  static uint32_t frame = 0;
  tft.fillRect(8, 60, 150, 20, ST77XX_BLACK);
  tft.setCursor(8, 60);
  tft.setTextSize(2);
  tft.setTextColor(ST77XX_YELLOW);
  tft.printf("Up %lu s", millis() / 1000);
  uint16_t c = tft.color565((frame * 8) & 0xFF, 128, 255 - ((frame * 8) & 0xFF));
  tft.fillRect(8, 90, 144, 24, c);
  frame++;
  delay(500);
}

Library: Adafruit ST7735 and ST7789 Library (Adafruit) — compiled with Adafruit ST7735 and ST7789 Library 1.12.0.

Expected serial output

Serial Monitor · 115200Output
ST7735 ready

Common errors

White screen

No data reaching the panel: check CS, A0 and RESET pin numbers, and that SDA/SCK go to 11/12.

Colours swapped (red shows as blue)

Panel variant. Try INITR_GREENTAB or INITR_REDTAB.

↑↓ to move · Enter to open