The Seeed Studio XIAO ESP32-C3 is one of the smallest practical ESP32 boards for Wi-Fi and Bluetooth projects. It measures only 21 × 17.8 mm, uses a 160 MHz RISC-V ESP32-C3, includes 4 MB flash, supports Wi-Fi and Bluetooth LE, and adds onboard lithium-battery charging in the standard XIAO footprint.
It is especially attractive for ESPHome sensors, compact Home Assistant nodes, wearables and low-power IoT projects. But the tiny board also exposes several ESP32-C3 strapping pins directly on the main header, so choosing GPIOs carelessly can stop the board booting or entering upload mode.
This guide covers the current Seeed XIAO ESP32-C3 pin map, safe GPIO choices, ADC limitations, battery charging, deep sleep, USB/serial behaviour, Arduino setup and a clean ESPHome configuration for 2026.
XIAO ESP32-C3 Specifications
| Feature | Seeed XIAO ESP32-C3 |
|---|---|
| MCU | ESP32-C3 |
| CPU | Single-core 32-bit RISC-V |
| Maximum clock | 160 MHz |
| SRAM | 400 KB |
| Flash | 4 MB |
| Wi-Fi | 2.4 GHz 802.11 b/g/n |
| Bluetooth | Bluetooth Low Energy 5.0 / Bluetooth Mesh |
| GPIO | 11 exposed D0–D10 pins |
| ADC | 4 exposed analogue-capable pins, but ADC1 is preferred |
| I²C | D4 SDA / D5 SCL |
| SPI | D8 SCK / D9 MISO / D10 MOSI |
| UART | D6 TX / D7 RX |
| USB | USB-C with USB serial support |
| Battery | 3.7 V Li-ion/LiPo charging support |
| Published deep sleep | ~44 µA |
| Dimensions | 21 × 17.8 mm |
| Antenna | External U.FL antenna included |
Compared with the XIAO ESP32-C6, the C3 lacks Thread/Zigbee and Wi-Fi 6, but it remains cheaper and has extremely mature Arduino and ESPHome support.
See our D1 Mini vs Seeed XIAO ESP32-C6 comparison for how the XIAO family compares with older compact ESP8266 boards.
XIAO ESP32-C3 Pinout
| XIAO label | ESP32-C3 GPIO | Main function | Important note |
|---|---|---|---|
| D0 / A0 | GPIO2 | GPIO, ADC1_CH2 | Strapping pin |
| D1 / A1 | GPIO3 | GPIO, ADC1_CH3 | Good general-purpose analogue pin |
| D2 / A2 | GPIO4 | GPIO, ADC1_CH4, JTAG | Good general-purpose pin |
| D3 / A3 | GPIO5 | GPIO, ADC2_CH0, JTAG | ADC2; avoid for precision analogue use |
| D4 | GPIO6 | I²C SDA, JTAG | Default SDA |
| D5 | GPIO7 | I²C SCL, JTAG | Default SCL |
| D6 | GPIO21 | UART TX | Default serial TX |
| D7 | GPIO20 | UART RX | Default serial RX |
| D8 | GPIO8 | SPI SCK | Strapping pin |
| D9 | GPIO9 | SPI MISO | Strapping / BOOT pin |
| D10 | GPIO10 | SPI MOSI | Good general-purpose pin |
The XIAO pin names are aliases. If a library asks for GPIO numbers rather than D labels, use the actual ESP32-C3 numbers from the table.
The Three Strapping Pins You Need to Know
ESP32-C3 uses GPIO2, GPIO8 and GPIO9 as strapping pins. On the XIAO board these appear directly on the main headers:
D0 = GPIO2
D8 = GPIO8
D9 = GPIO9
The logic levels present on these pins during reset can affect boot behaviour. GPIO9 is especially important because Seeed also connects it to the BOOT button.
This does not mean D0, D8 and D9 cannot be used. It means external hardware must not force an inappropriate level while the ESP32-C3 is resetting.
A relay module with a strong pull-down, for example, can make a perfectly good XIAO appear “dead” if attached to the wrong strap pin.
Safest GPIOs for General Use
For ordinary sensors, relays and buttons, a conservative starting set is:
D1 / GPIO3
D2 / GPIO4
D3 / GPIO5
D4 / GPIO6
D5 / GPIO7
D6 / GPIO21
D7 / GPIO20
D10 / GPIO10
Then use D0/GPIO2, D8/GPIO8 and D9/GPIO9 only when you understand the boot-state interaction.
D6 and D7 are perfectly usable GPIOs, but they are the default UART pins. If you need an external serial sensor, keep them available.
ADC: Prefer D0–D2
Seeed exposes four analogue-labelled pins:
A0 / D0 = GPIO2 = ADC1_CH2
A1 / D1 = GPIO3 = ADC1_CH3
A2 / D2 = GPIO4 = ADC1_CH4
A3 / D3 = GPIO5 = ADC2_CH0
Seeed specifically warns that A3/GPIO5 uses ADC2 and can produce unreliable readings because of false-sampling issues on some ESP32-C3 revisions. Espressif’s current hardware guidance also recommends using ADC1 where possible because ADC2 is not factory-calibrated and can be unusable on some revisions.
For a soil-moisture sensor, battery divider or analogue sensor, prefer A0, A1 or A2.
Because D0/GPIO2 is also a strapping pin, A1/GPIO3 and A2/GPIO4 are the least awkward analogue choices for many projects.
I²C Pins
The XIAO ESP32-C3 defaults to:
D4 = GPIO6 = SDA
D5 = GPIO7 = SCL
This is the most convenient interface for environmental sensors such as BME280, SHT40, BH1750 and ADS1115.
In ESPHome:
i2c:
sda: GPIO6
scl: GPIO7
scan: true
The same pins also have JTAG-related alternate functions at chip level, but using them for I²C in a normal application is completely ordinary.
SPI Pins
Seeed maps the default SPI header to:
D8 = GPIO8 = SCK
D9 = GPIO9 = MISO
D10 = GPIO10 = MOSI
The complication is that D8 and D9 are strapping pins, and D9 is the BOOT pin.
SPI peripherals are normally fine if their outputs are high-impedance during reset. Problems appear when a module includes strong pull-ups or pull-downs that alter the required strap state.
If an SPI display or SD module suddenly prevents the board from booting, disconnect D8/D9 first and check the peripheral’s reset-state loading.
UART Pins
The default UART pins are:
D6 = GPIO21 = TX
D7 = GPIO20 = RX
Seeed recommends explicitly defining the pins when using Serial1:
Serial1.begin(115200, SERIAL_8N1, D7, D6);
// RX, TX
This lets the USB serial console remain available at the same time as a hardware UART sensor.
USB Serial and the Native ESP32-C3 USB Block
ESP32-C3 contains a built-in USB Serial/JTAG controller using chip-level GPIO18 and GPIO19. Espressif documents:
GPIO18 = USB D-
GPIO19 = USB D+
On the XIAO, the USB-C connector provides normal USB serial programming and monitoring without consuming D6/D7. Seeed’s Arduino documentation notes that USB serial is enabled by default.
This is useful because you can keep:
USB-C → programming + Serial monitor
D6/D7 → external UART device
without needing a separate USB-to-UART adapter in normal use.
BOOT Mode and Upload Recovery
If Arduino IDE or ESPHome can no longer upload to the board, Seeed recommends entering bootloader mode manually.
- Disconnect the USB cable.
- Hold the BOOT button.
- Reconnect USB while keeping BOOT held.
- Release BOOT after the device enumerates.
- Select the new serial port and upload again.
You can also try the RESET button once before using the full recovery sequence.
Because BOOT is connected to GPIO9, external circuitry on D9 can interfere with recovery. Disconnect D9 hardware if the board refuses to enter download mode.
Battery Power
The XIAO ESP32-C3 includes rear pads for a single-cell 3.7 V rechargeable lithium battery and onboard charging/power management.
Seeed currently specifies approximately:
Fast charge: 380 mA
Trickle charge: 40 mA
Battery input: 3.7 V nominal
The board can remain connected to USB while the battery is attached; the onboard power-management circuit handles charging.
Observe battery polarity carefully when soldering. A lithium-cell short circuit is not a minor electronics mistake.
No LED Does Not Mean the Board Is Off on Battery
Seeed explicitly notes that the XIAO ESP32-C3 does not illuminate an indicator merely because it is running from the battery.
So this situation is normal:
USB disconnected
Battery connected
No LED visible
Wi-Fi sensor still running
Judge operation from the firmware, Home Assistant or a multimeter rather than an LED.
The 5 V Pin Is USB VBUS
Seeed describes the 5 V pin as the USB VBUS rail. When USB is connected it provides the USB 5 V supply. It can also be used as a 5 V input, but Seeed recommends isolation with an appropriate diode when using an external source to avoid feeding power back toward USB.
Do not treat the 5 V pin as a regulated 5 V output generated from a 3.7 V battery. If a battery-powered sensor requires 5 V, design a separate boost supply rather than assuming VBUS will provide it.
3.3 V Rail Current: Seeed’s Documentation Has Two Figures
Seeed’s current page is internally inconsistent here: the main specification table lists a maximum 3.3 V output current of 500 mA, while the Power Pins section says the 3V3 output can supply 700 mA.
For a design that genuinely needs several hundred milliamps from the XIAO regulator, do not design right at either published limit. Check the regulator fitted to your exact board revision and account for ESP32-C3 peak current and thermal conditions.
For normal I²C sensors, LEDs and logic modules, this inconsistency rarely matters because their current is far below either value.
Can the XIAO ESP32-C3 Read Its Own Battery Voltage?
Not directly from the standard board. Seeed says no GPIO was reserved for battery-voltage measurement because it wanted to preserve the full XIAO header count.
The recommended workaround is an external divider feeding an ADC input. Seeed documents a community example using two 200 kΩ resistors for a 1:2 divider into A0.
Battery +
|
200k
|
+------ A0
|
200k
|
GND
A fully charged lithium cell can reach about 4.2 V, so dividing the voltage is essential. Do not wire the battery directly to an ESP32 ADC pin.
Arduino Battery-Voltage Example
void setup() {
Serial.begin(115200);
pinMode(A0, INPUT);
}
void loop() {
uint32_t total_mv = 0;
for (int i = 0; i < 16; i++) {
total_mv += analogReadMilliVolts(A0);
}
float adc_v = (total_mv / 16.0) / 1000.0;
float battery_v = adc_v * 2.0;
Serial.printf("Battery: %.3f V\n", battery_v);
delay(2000);
}
The averaging is useful because Seeed’s community example observed occasional ADC spikes during radio activity.
Deep Sleep
Seeed publishes approximately 44 µA deep-sleep consumption for the board under a 3.8 V battery-input test.
It also lists roughly:
Wi-Fi active: ~75 mA
Wi-Fi modem sleep: ~25 mA
Wi-Fi light sleep: ~4 mA
Deep sleep: ~44 µA
The finished project will usually consume more because sensors, pull-ups and regulators add their own sleep current.
For deep-sleep wake, Espressif identifies GPIO0–GPIO5 as the RTC-capable C3 GPIOs. On XIAO, that means D0–D3 correspond to GPIO2–5 and can participate in supported deep-sleep wake schemes—but remember that D0/GPIO2 is also a strapping pin.
ESPHome Setup in 2026
Current ESPHome recommends selecting the MCU variant rather than depending on a third-party PlatformIO board ID.
esphome:
name: xiao-c3-node
friendly_name: XIAO C3 Node
esp32:
variant: esp32c3
framework:
type: esp-idf
logger:
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "XIAO C3 Fallback"
password: !secret ap_password
captive_portal:
Since ESPHome 2026.1, ESP-IDF is the default framework for ESP32-C3 and is the recommended choice. Arduino compatibility is still available for C3 when a specific component requires it.
ESPHome I²C Sensor Example
A practical XIAO C3 node with an SHT40 sensor can use:
i2c:
sda: GPIO6
scl: GPIO7
scan: true
sensor:
- platform: sht4x
temperature:
name: "Room Temperature"
humidity:
name: "Room Humidity"
update_interval: 30s
D4/D5 are a particularly convenient choice because they are already Seeed’s default I²C pins and are not boot strapping pins.
ESPHome Deep-Sleep Example
deep_sleep:
run_duration: 20s
sleep_duration: 10min
A battery sensor can wake, connect to Wi-Fi, publish its readings and return to sleep. The actual battery life depends far more on connection time and peripheral current than on the 44 µA board baseline alone.
Arduino IDE Setup
Seeed uses Espressif’s official Arduino-ESP32 core.
- Install the current Arduino IDE.
- Install esp32 by Espressif Systems through Boards Manager.
- Open Tools → Board → ESP32 Arduino.
- Select XIAO_ESP32C3.
- Select the USB serial port.
- Upload normally.
Using Seeed’s dedicated board definition is preferable to choosing a generic ESP32-C3 target because the XIAO aliases and board defaults are then defined correctly.
External Antenna
XIAO ESP32-C3 uses an external U.FL antenna supplied with the board. This is important because the board itself does not rely on a large PCB antenna like many DevKits.
Seat the connector carefully and avoid pulling on the coax cable. For a battery sensor inside a plastic enclosure, antenna orientation can make a much larger difference to reliability than changing Wi-Fi transmit-power settings.
XIAO ESP32-C3 vs XIAO ESP32-C6
| Feature | XIAO C3 | XIAO C6 |
|---|---|---|
| CPU | Single-core RISC-V 160 MHz | RISC-V HP core 160 MHz + LP core |
| Flash | 4 MB | 4 MB |
| Wi-Fi | Wi-Fi 4 | Wi-Fi 6 |
| BLE | Yes | Yes |
| Thread/Zigbee | No | Yes |
| Board size | 21 × 17.8 mm | 21 × 17.8 mm |
| Published deep sleep | ~44 µA | ~15 µA under Seeed test conditions |
| ESPHome framework | ESP-IDF default; Arduino also available | ESP-IDF required |
Choose C3 when you want a cheap, mature Wi-Fi/BLE node. Choose C6 when Thread/Zigbee, Wi-Fi 6 or lower board-level deep-sleep current matters.
See our Seeed XIAO ESP32-C6 Pinout, Battery Power and ESPHome guide for the newer board.
XIAO ESP32-C3 vs XIAO ESP32-S3
S3 is the performance-oriented alternative. It adds a dual-core 240 MHz processor, 8 MB PSRAM, 8 MB flash and USB OTG on the standard XIAO S3 board.
Use S3 for:
- Displays.
- Cameras.
- Large web interfaces.
- USB HID/MIDI.
- Memory-heavy applications.
Use C3 when those features are unnecessary and the project is simply a small connected sensor or controller.
See our Seeed XIAO ESP32-S3 Pinout, Battery Power and Arduino Setup.
Best Uses for the XIAO ESP32-C3
- Compact ESPHome temperature/humidity sensors.
- Door/window sensors.
- BLE beacon and BLE-sensor projects.
- Small MQTT nodes.
- Battery-powered data loggers.
- Wearable prototypes.
- Simple smart relays with external drivers.
- Compact Home Assistant room nodes.
Common Problems
| Symptom | Likely cause / first check |
|---|---|
| Board no longer boots after adding hardware | Check D0/GPIO2, D8/GPIO8 and D9/GPIO9 strap loading |
| Cannot enter upload mode | Disconnect hardware from D9/GPIO9 and use BOOT recovery |
| A3 analogue readings are unstable | GPIO5 is ADC2; move sensor to A0/A1/A2 |
| No serial output over USB | Check USB serial settings/port and data cable |
| D6/D7 unavailable for sensor | They are default UART TX/RX; remap UART if needed |
| Battery voltage cannot be read | No onboard BAT-to-ADC path; add divider |
| No LED when battery powered | Normal board behaviour |
| Very poor Wi-Fi range | Check external U.FL antenna connection/orientation |
| Deep-sleep current much higher than 44 µA | External sensors, regulator, pull-ups or board revision |
| SPI module prevents boot | D8/D9 are strapping pins; inspect module pull resistors |
Recommended Pin Choices
| Use | Recommended pins |
|---|---|
| General digital GPIO | D1, D2, D3, D4, D5, D6, D7, D10 |
| I²C | D4/GPIO6 SDA, D5/GPIO7 SCL |
| UART | D6/GPIO21 TX, D7/GPIO20 RX |
| ADC | D1/GPIO3, D2/GPIO4 first; D0/GPIO2 with strap caution |
| SPI | D8/D9/D10, but check boot-state loading on D8/D9 |
| Avoid for precision ADC | D3/GPIO5 (ADC2) |
| Use with boot caution | D0/GPIO2, D8/GPIO8, D9/GPIO9 |
The XIAO ESP32-C3 is small enough for finished products but still friendly enough for breadboard projects. Its only real pin-management trap is remembering that three of the main D pins participate in boot strapping.
Related XIAO and ESP32-C3 Guides
- Seeed XIAO ESP32-C6 Pinout, Battery Power and ESPHome — Wi-Fi 6, Thread and Zigbee alternative.
- Seeed XIAO ESP32-S3 Pinout, Battery Power and Arduino Setup — faster dual-core XIAO with PSRAM.
- ESP32-C3 SuperMini Pinout + Safe GPIOs — another popular tiny ESP32-C3 board.
- ESP32-C3 SuperMini vs ESP32-C6 SuperMini — broader C3/C6 comparison.
Official Resources
- Seeed Studio XIAO ESP32-C3 Getting Started — official pin map, battery figures, deep sleep and Arduino setup.
- Seeed XIAO ESP32-C3 Pin Multiplexing — USB serial, UART, I²C and SPI examples.
- Espressif ESP32-C3 GPIO Documentation — strapping pins, ADC and USB pin restrictions.
- ESPHome ESP32 Platform — current ESP32-C3 variant and framework support.