ESP32-C3-LCDkit Pinout & GPIO Guide

(LCD, encoder, RGB LED, audio, IR, โ€œsafeโ€ pins)

The ESP32-C3-LCDkit is a small all-in-one dev board with:

  • ESP32-C3-MINI-1 module (4 MB flash, Wi-Fi + BLE)
  • 1.28″ 240ร—240 SPI LCD subboard (GC9A01 driver)
  • Rotary encoder + push button
  • RGB LED (WS2812)
  • Speaker + audio amp
  • IR transmitter + IR receiver
  • USB-C for power + flashing

Itโ€™s perfect for small GUI gadgets, knobs, thermostats, timers โ€“ but many GPIOs are already โ€œspoken forโ€ by the LCD and other peripherals. This guide explains which pins do what, and how to safely add your own sensors or buttons.


1. High-level architecture

The kit has two boards:

  • Mainboard (ESP32-C3-LCDkit_MB)
    • ESP32-C3-MINI-1 module
    • Rotary encoder (A/B + switch)
    • Speaker + PA
    • IR TX / IR RX with jumper selector
    • RGB LED
    • USB-C, LDO, power LEDs
    • LCD connector & โ€œUART/RGB expanderโ€ header
  • LCD subboard (ESP32-C3-LCDkit_DB)
    • 1.28″ SPI TFT 240ร—240 (GC9A01)
    • Breakout for LCD pins: SDA, SCL, CS, DC, BL, GND, 3V3 etc.

2. ESP32-C3 GPIO allocation on this kit

From Espressifโ€™s GPIO allocation table:

ESP32-C3 GPIOBoard function
IO0LCD_SDA (data line)
IO1LCD_SCL (clock)
IO2LCD_D/C
IO3AUDIO_PA (amp enable / control)
IO4IR_RX / IR_TX (via jumper)
IO5LCD_BL_CTRL (backlight)
IO6ENCODER_A (one phase)
IO7LCD_CS (chip select)
IO8RGB_LED (WS2812)
IO9ENCODER_SW (encoder push button)
IO10ENCODER_A (other phase โ€“ effectively ENCODER_B)
IO18USB_DN (native USB)
IO19USB_DP (native USB)
RXD0/TXD0Reserved (USB-serial)

ADC-capable pins GPIO0โ€“4 are therefore already wired to LCD / audio / IR. You can still use them (for example, read an ADC and drive the LCD from the same pin set), but youโ€™re sharing those pins with the built-in features.


3. Power & USB

  • USB-C port supplies 5 V to the board, then a 5Vโ†’3.3V LDO powers the ESP32-C3 and peripherals.
  • A 3.3 V power LED shows when the board is on.
  • USB-C is used both for power and flashing/debug via the on-board USB interface (native USB + USB-serial).

Recommended: use a 5V / 2A USB supply, as the LCD, speaker and Wi-Fi can draw noticeable current.


4. LCD connections (SPI)

The LCD subboard is a SPI display (GC9A01). On the mainboard, the LCD pins are wired:

  • LCD_SDA โ†’ GPIO0 (MOSI)
  • LCD_SCL โ†’ GPIO1 (SCLK)
  • LCD_D/C โ†’ GPIO2 (data/command)
  • LCD_CS โ†’ GPIO7 (chip select)
  • LCD_BL_CTRL โ†’ GPIO5 (backlight PWM/on-off)
  • 3V3 / GND power from mainboard

So your main SPI LCD bus is:

SignalGPIO
MOSI0
SCLK1
CS7
D/C2

The official ESP-IDF example for this kit already has these pins configured for the GC9A01 driver.


5. Rotary encoder & button

The board includes an EC11 rotary encoder with push button. Wiring:

  • ENCODER_A โ†’ GPIO6
  • ENCODER_B โ†’ GPIO10 (listed as ENCODER_A in the table but used as the other phase)
  • ENCODER_SW โ†’ GPIO9 (push button to ground, with pull-up)

So in code you typically:

  • Attach interrupts to GPIO6 and GPIO10 to track rotation.
  • Read GPIO9 as a digital input with internal pull-up to detect button press.

Example (Arduino-style pseudo):

const int ENC_A = 6;
const int ENC_B = 10;
const int ENC_SW = 9;

volatile int encoderPos = 0;

void IRAM_ATTR handleEnc() {
  int a = digitalRead(ENC_A);
  int b = digitalRead(ENC_B);
  if (a == b) encoderPos++;
  else        encoderPos--;
}

void setup() {
  pinMode(ENC_A, INPUT_PULLUP);
  pinMode(ENC_B, INPUT_PULLUP);
  pinMode(ENC_SW, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(ENC_A), handleEnc, CHANGE);
  attachInterrupt(digitalPinToInterrupt(ENC_B), handleEnc, CHANGE);
}

(This board is mainly targeted at ESP-IDF, but the logic is the same.)


6. RGB status LED (GPIO8)

Thereโ€™s a WS2812B RGB LED wired to GPIO8:

  • Powered from 3.3 V.
  • Single-wire data input on GPIO8.

You control it with NeoPixel / WS2812 style libraries (Adafruit_NeoPixel, RMT-based driver in ESP-IDF, etc.).

Minimal ESP-IDF style idea:

  • Configure RMT channel on GPIO8.
  • Use the โ€œRainbow / RGB LEDโ€ example from the esp32_c3_lcdkit component.

7. Audio output (GPIO3)

The board has a speaker + PA (NS4150). The PA is driven from GPIO3 (AUDIO_PA).

  • In ESP-IDF examples, the IยฒS / DAC output is routed through this path.
  • You can toggle GPIO3 to mute/unmute, or feed a PWM / DAC waveform depending on the example.

This is amazing for making sound effects, alarms, โ€œclicksโ€ in your GUI.


8. Infrared TX / RX (GPIO4)

The kit has both IR transmitter and IR receiver on GPIO4, selected by a jumper:

  • A small header labeled something like IR_TX / IR_RX select
  • You place the jumper to choose TX or RX using the same GPIO.

In code you typically use:

  • RMT TX for sending IR remote codes.
  • RMT RX for decoding incoming IR signals.

Espressifโ€™s docs include separate schematics and part numbers for the IR LED and receiver.


9. USB & serial

There are two USB-related parts:

  1. Native USB (IO18 / IO19 as USB_DN / USB_DP)
    • Used by the Type-C port for direct USB device functionality (CDC, HID, etc.).
  2. UART0 (TXD0, RXD0)
    • Connected internally to the USB interface for flashing and Serial Monitor.
    • Marked as โ€œreservedโ€ in the GPIO allocation table โ€“ not for general use.

From the user perspective you just:

Serial.begin(115200);

or in ESP-IDF use idf.py monitor, and the board just shows logs via USB-C.


10. โ€œSafe pinsโ€ for expansion

Because this board is tightly integrated, there arenโ€™t spare header rows like DevKitC. But you do get an โ€œUART & RGB expander I/Oโ€ header on the side:

This header breaks out:

  • Power pins (3V3, GND)
  • UART (TXD0 / RXD0)
  • RGB data (GPIO8)

So for adding things like:

  • An external WS2812 LED strip (chained from the onboard RGB LED)
  • A UART peripheral (e.g. external MCU, RS-485 adapter)

โ€ฆyou plug into this header.

What about extra GPIOs?

Most GPIOs are already dedicated:

  • 0,1,2,5,7 โ†’ LCD
  • 3 โ†’ audio
  • 4 โ†’ IR
  • 6,10,9 โ†’ encoder
  • 8 โ†’ RGB
  • 18,19 โ†’ USB

If you really need another GPIO:

  • You can share existing lines (e.g. use LCD_CS as a chip-select for another SPI device on the same bus),
  • Or tap the module pads / test pads (advanced, soldering-iron territory).

This is why the LCDkit is best treated as an application-specific board (GUI + encoder + audio + IR), not a general โ€œmany spare GPIOโ€ board.


11. Typical project wiring patterns

Given the tight GPIO allocation, โ€œwiring patternsโ€ are mostly internal, but hereโ€™s how you logically think about it:

11.1 Simple GUI knob (no extra hardware)

  • Use the official ESP-IDF example for ESP32-C3-LCDkit.
  • Keep all pins as-is (LCD, encoder, RGB, speaker, IR).
  • Customize only graphics + logic in code.

11.2 Add an external WS2812 strip

  • Chain extra LEDs to GPIO8 through the expander header.
  • Power strip from 3V3 (small number of LEDs) or separate 5V supply (with common GND).
  • Keep the LED count small (this is a demo board, not a giant LED driver).

11.3 Add a simple UART sensor

  • Use TXD0 / RXD0 on expander header only when you donโ€™t need USB serial at the same time, or bit-bang another UART over existing GPIOs (e.g. share LCD_SDA/SCL when LCD idle).
  • In practice, for beginners: stick to USB serial and avoid external UART on this board.

12. Summary

The ESP32-C3-LCDkit is:

  • A GUI knob dev board, not a generic GPIO breakout.
  • LCD, encoder, RGB LED, audio and IR consume almost every GPIO.
  • The main โ€œuser-tunableโ€ things are how you use:
    • The rotary encoder + button (GPIO6/10/9)
    • The RGB LED (GPIO8)
    • The speaker (GPIO3)
    • The LCD SPI bus (GPIO0/1/2/5/7)

Share your love