ESP32-S3-DevKitC-1 RGB LED: GPIO38 vs GPIO48
Two ESP32-S3-DevKitC-1 revisions are on the market and they moved the addressable RGB LED. Which pin yours is on, how to drive it, and what the documentation does not say.
Applies to: ESP32-S3-DevKitC-1 official boards, both PCB revisions.
The question
"The tutorial says the onboard LED is on GPIO48. Mine never lights. Is my board broken?"
The initial (v1.0) ESP32-S3-DevKitC-1 uses GPIO48 (J3 contact 16); v1.1 uses GPIO38 (J3 contact 10). Both use an addressable RGB LED, which needs a compatible driver. A dark LED alone does not identify the PCB revision or prove that the board is faulty. From the official revision note:
Both the initial and v1.1 versions of ESP32-S3-DevKitC-1 are available on the market. The main difference lies in the GPIO assignment for the RGB LED: the initial version uses GPIO48, whereas v1.1 uses GPIO38.
The fact table
| PCB revision | LED GPIO | Header position | Official source |
|---|---|---|---|
| v1.0 (initial release) | GPIO48 | J3 contact 16 | v1.0 User Guide, J3 table |
| v1.1 | GPIO38 | J3 contact 10 | v1.1 User Guide, J3 table |
Both rows are revision-scoped published fields on the board page; the interactive pinout highlights the LED pin per selected revision.
Why the pin moved: the documentation does not say. The revision note states the GPIO reassignment as a fact and gives no electrical rationale. Any page that explains it with a specific voltage-domain or layout cause is speculating — treat it accordingly.
The LED is not a plain LED
This matters more than the pin number. The official guide describes it as an addressable RGB LED (single-wire protocol, WS2812-style):
Addressable RGB LED, driven by GPIO38.
So digitalWrite(38, HIGH) does not produce "LED on" — the LED expects a timed serial protocol for color data. Use a driver:
Arduino (arduino-esp32 core):
#include <Adafruit_NeoPixel.h> // or use the built-in neopixelWrite()
Adafruit_NeoPixel led(1, 38, NEO_GRB + NEO_KHZ800);
void setup() {
led.begin();
led.setPixelColor(0, led.Color(16, 0, 0)); // dim red
led.show();
}
void loop() {}The arduino-esp32 core also ships neopixelWrite(pin, r, g, b) for a one-liner without a library.
ESP-IDF: use the led_strip component (see the ESP-IDF blink example for addressable LEDs).
Not sure which GPIO drives your LED? A minimal sketch that sets the same color on GPIO48 first, then on GPIO38, reveals the working LED pin for the board in front of you in seconds — with no external wiring. That observation gives your blink code the right pin; it does not by itself certify the PCB revision on an unknown or non-reference board. The official identification path is silkscreen, seller and schematics — see Which ESP32-S3-DevKitC-1 do I have?.
What this page cannot tell you
- Why the GPIO moved — not stated in any pinned official document. Recorded here as unknown, not guessed.
- LED part number and color order — the guide names no specific LED part.
NEO_GRBworks for common units, but if colors come out wrong on your board, tryNEO_RGB; that is a driver detail, not a hardware fact.
Sources
- ESP32-S3-DevKitC-1 v1.1 User Guide — "RGB LED" component row, J3 header table, Hardware Revision Details (commit
5c06bf18) - ESP32-S3-DevKitC-1 v1.0 User Guide — J3 header table (commit
5c06bf18) - MCUID data record: ESP32-S3-DevKitC-1 — revision-scoped
onboard_rgb_led.gpioclaims with fixed sources