Why the onboard LED is GPIO38 or GPIO48
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?”
Almost certainly not. The board has two hardware revisions and they use different pins for the same LED. 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