(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.


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:
| Signal | GPIO |
|---|---|
| SCLK | GPIO6 |
| MOSI | GPIO7 |
| MISO | GPIO4 |
| CS | GPIO10 |
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:
| Function | GPIO | Notes |
|---|---|---|
| IยฒC SDA | GPIO4 | BME280 / SHT sensor etc. |
| IยฒC SCL | GPIO6 | |
| Analog input | GPIO1 | ADC1_CH1 |
| Extra digital out | GPIO7 | Relay/MOSFET or SPI MOSI |
| Extra digital in | GPIO3 | Button, reed switch |
| RGB LED (onboard) | GPIO8 | With 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.


