ESP32-C3 DevKitM-1 Pinout Diagram and Safe GPIOs (Boot Pins, ADC, I2C, SPI)

(Safe pins, ADC, I²C, SPI, UART, RGB LED)

The ESP32-C3-DevKitM-1 is Espressif’s tiny RISC-V dev board based on the ESP32-C3-MINI-1 / MINI-1U module – a very compact Wi-Fi + BLE module with 4 MB flash.

It’s designed to plug into a breadboard and expose almost all ESP32-C3 GPIOs on two 15-pin headers (J1 and J3). This guide focuses on which pins are safe to use, and how to wire ADC, I²C, SPI, UART and the onboard RGB LED.

ESP32-C3-DevKitM-1 Pinout

1. Board overview

Key specs:

  • MCU: ESP32-C3 (single-core 32-bit RISC-V up to 160 MHz)
  • Wireless: 2.4 GHz Wi-Fi (802.11 b/g/n) + BLE 5 (LE)
  • Flash: 4 MB SPI flash
  • Power:
    • Micro-USB (default)
    • or 5V pin
    • or 3V3 pin
  • USB-to-UART bridge (for flashing + Serial Monitor)
  • BOOT button (enter download mode)
  • RST button (reset / EN)
  • Onboard RGB LED controlled via a single GPIO (WS2812-style)

All GPIOs are 3.3 V only (not 5 V tolerant).


2. Power & control pins

From Espressif’s hardware reference:

  • 5V – USB 5 V rail; can be used as input if powering from an external 5 V source.
  • 3V3 – regulated 3.3 V from onboard LDO (or input if you supply your own 3.3 V).
  • GND – ground.
  • RST / EN / CHIP_PU – active-high enable; pulling LOW resets/powers down the chip.
  • BOOT – used together with reset to enter UART download mode.

You normally do not use RST or BOOT as GPIOs.


3. Pin headers J1 & J3

Espressif breaks out most GPIOs on J1 (left) and J3 (right). The exact order is given in the user guide tables.

High-level view (logical, not physical order):

  • GPIO0–GPIO10 – ADC-capable, general I/O.
  • GPIO18, 19 – USB D- / D+ (native USB) – not broken out on this board.
  • GPIO20, 21 – I/O + UART signals depending on config; at least one is usually used for the RGB LED on DevKitM-1 boards.

The ESP32-C3-MINI-1 module itself exposes 22 pads, but DevKitM-1 uses a subset to keep the board compact.


4. Safe GPIOs for general use

From the Espressif pin tables and module docs:

The following pins are good, boring choices for digital input/output, PWM, etc.:

  • GPIO0 – ADC1_CH0, also XTAL_32K_P (RTC), safe as GPIO/ADC.
  • GPIO1 – ADC1_CH1, XTAL_32K_N (RTC).
  • GPIO3 – ADC1_CH3, general purpose.
  • GPIO4 – ADC1_CH4, FSPIHD (can be used as GPIO when not re-routed).
  • GPIO6 – FSPICLK, but available as GPIO on DevKitM-1.
  • GPIO7 – FSPID, also good GPIO.
  • GPIO10 – FSPICS0, good as chip-select or general output.

These are the primary “safe” pool to start from.

Pins that need extra care

  • GPIO2 – ADC1_CH2 and strapping pin; level at reset selects boot mode.
  • GPIO8 & GPIO9 – also strapping pins (boot configuration).
  • GPIO5 – ADC2_CH0; ADC2 is shared with Wi-Fi, so reads can fail when Wi-Fi is active.

You can use these after boot, but:

  • Avoid strong pull-downs, big capacitors or heavy loads that could force them low at reset.
  • Expect ADC reads on GPIO5 to be less reliable under heavy Wi-Fi usage.

5. Boot / strapping pins

On ESP32-C3, the main strapping pins are:

  • GPIO2 – controls boot mode configuration.
  • GPIO8 – influences download-boot settings and logging.
  • GPIO9 – BOOT button is tied here; pulled up, button shorts to GND.

At reset, the ROM samples these pins to decide whether to:

  • Boot from flash (normal)
  • Enter serial download mode
  • Output boot messages, etc.

Rule of thumb:

For beginners, keep GPIO2, GPIO8, GPIO9 for internal use (BOOT button, LED) and don’t wire external circuitry that might drag them low at reset.


6. ADC pins

ESP32-C3 has ADC1 (5 channels) and ADC2 (1 channel):

  • ADC1: GPIO0, GPIO1, GPIO2, GPIO3, GPIO4
  • ADC2: GPIO5

Best practice:

  • Prefer GPIO0–4 for analog sensors (thermistor, LDR, potentiometer, etc.).
  • Use GPIO5 (ADC2) only if you understand the Wi-Fi conflict (reads can fail if Wi-Fi is busy).

Resolution is up to 12 bits (0–4095); usable voltage depends on attenuation (typically up to ~2.4–3.0 V). Keep inputs ≤ 3.3 V or use a resistor divider.


7. Onboard RGB LED

DevKitM-1 has a WS2812-style RGB LED on the board, marked “RGB”. It’s driven from a single GPIO (commonly GPIO8 or GPIO2 depending on revision/schematic).

  • It’s powered from 3.3 V.
  • To control colours you use a library like Adafruit_NeoPixel or FastLED.

Example (assuming LED on GPIO8):

#include <Adafruit_NeoPixel.h>

#define LED_PIN 8
#define LED_COUNT 1

Adafruit_NeoPixel rgb(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  rgb.begin();
  rgb.show(); // turn off
}

void loop() {
  rgb.setPixelColor(0, rgb.Color(255, 0, 0)); // red
  rgb.show();
  delay(500);

  rgb.setPixelColor(0, rgb.Color(0, 255, 0)); // green
  rgb.show();
  delay(500);

  rgb.setPixelColor(0, rgb.Color(0, 0, 255)); // blue
  rgb.show();
  delay(500);
}

Because this LED often shares a strapping GPIO, avoid adding extra external loads on that same pin.


8. I²C pins

The ESP32-C3 I²C peripheral is fully GPIO-matrixed, so you can choose almost any free GPIO.

Good default pairs on DevKitM-1:

  • Option 1 (recommended):
    • SDA = GPIO4
    • SCL = GPIO6
  • Option 2 (if 4/6 are busy):
    • SDA = GPIO1
    • SCL = GPIO3

Avoid GPIO2, 8, 9 for I²C unless you’re comfortable with strapping behaviour.

Arduino example:

#include <Wire.h>

void setup() {
  Wire.begin(4, 6);   // SDA, SCL
  Serial.begin(115200);
  Serial.println("I2C on GPIO4 (SDA), GPIO6 (SCL)");
}

void loop() {
  // read/write I2C sensors here
}

9. SPI pins

ESP32-C3’s SPI controller can route signals to most GPIOs, but the “FSPI” pins are particularly suited for high-speed SPI. On the DevKitM-1, these include:

  • GPIO6 – FSPICLK (SCLK)
  • GPIO7 – FSPID (MOSI)
  • GPIO4 – FSPIHD (can use as MISO)
  • GPIO10 – FSPICS0 (CS)

Suggested SPI mapping for user peripherals:

SignalGPIO
SCLKGPIO6
MOSIGPIO7
MISOGPIO4
CSGPIO10

This keeps everything on the same side of the board and away from the most sensitive boot pins.


10. UART / Serial

On DevKitM-1 the main USB-to-UART bridge is pre-wired to the ESP32-C3’s UART0, so you just call Serial.begin() and it “just works”. The TX/RX pads of UART0 are not meant as general GPIO on this board.

If you need an extra UART (e.g. for GPS, RS-485):

  • Map UART1 or remap UART0 to spare GPIOs such as GPIO7 (TX) and GPIO6 (RX).
  • Configure in Arduino with something like:
HardwareSerial Serial1(1);

void setup() {
  Serial.begin(115200);               // USB serial
  Serial1.begin(9600, SERIAL_8N1, 6, 7); // RX=GPIO6, TX=GPIO7
}

11. “Starter” pin recipe (safe template)

For a typical Wi-Fi sensor node with I²C sensor, ADC input and RGB status LED:

FunctionGPIONotes
I²C SDAGPIO4BME280 / SHT sensor etc.
I²C SCLGPIO6
Analog inputGPIO1ADC1_CH1
Extra digital outGPIO7Relay/MOSFET or SPI MOSI
Extra digital inGPIO3Button, reed switch
RGB LED (onboard)GPIO8With NeoPixel/FastLED

This combination:

  • Avoids heavy use of strapping pins at reset.
  • Keeps ADC on ADC1 (Wi-Fi-friendly).
  • Leaves GPIO0, 2, 5, 9, 10 available for expansion.

12. Quick cheat sheet

  • Safest general-purpose GPIOs:
    • 0, 1, 3, 4, 6, 7, 10
  • ADC inputs (ADC1):
    • 0, 1, 2, 3, 4
  • ADC2 (Wi-Fi-sensitive):
    • 5
  • Onboard RGB LED:
    • Usually GPIO8 (check silkscreen / schematic for your revision).
  • Boot-sensitive pins:
    • 2, 8, 9 – don’t pull strongly low at reset.
  • Nice I²C default:
    • SDA 4, SCL 6
  • Nice SPI default:
    • SCLK 6, MOSI 7, MISO 4, CS 10

Stick to these sets and the ESP32-C3-DevKitM-1 becomes a very predictable little board for IoT sensors, Home Assistant nodes, and BLE gadgets, without “why won’t it boot?” surprises.

Share your love

Leave a Reply

Your email address will not be published. Required fields are marked *