Seeed XIAO ESP32-C3 Pinout, Battery Power and ESPHome

Seeed XIAO ESP32-C3 pinout and ESPHome guide: D0-D10 GPIO mapping, strapping pins, battery charging, deep sleep, ADC limits, USB serial, Arduino setup and safe GPIO choices.

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

FeatureSeeed XIAO ESP32-C3
MCUESP32-C3
CPUSingle-core 32-bit RISC-V
Maximum clock160 MHz
SRAM400 KB
Flash4 MB
Wi-Fi2.4 GHz 802.11 b/g/n
BluetoothBluetooth Low Energy 5.0 / Bluetooth Mesh
GPIO11 exposed D0–D10 pins
ADC4 exposed analogue-capable pins, but ADC1 is preferred
I²CD4 SDA / D5 SCL
SPID8 SCK / D9 MISO / D10 MOSI
UARTD6 TX / D7 RX
USBUSB-C with USB serial support
Battery3.7 V Li-ion/LiPo charging support
Published deep sleep~44 µA
Dimensions21 × 17.8 mm
AntennaExternal 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 labelESP32-C3 GPIOMain functionImportant note
D0 / A0GPIO2GPIO, ADC1_CH2Strapping pin
D1 / A1GPIO3GPIO, ADC1_CH3Good general-purpose analogue pin
D2 / A2GPIO4GPIO, ADC1_CH4, JTAGGood general-purpose pin
D3 / A3GPIO5GPIO, ADC2_CH0, JTAGADC2; avoid for precision analogue use
D4GPIO6I²C SDA, JTAGDefault SDA
D5GPIO7I²C SCL, JTAGDefault SCL
D6GPIO21UART TXDefault serial TX
D7GPIO20UART RXDefault serial RX
D8GPIO8SPI SCKStrapping pin
D9GPIO9SPI MISOStrapping / BOOT pin
D10GPIO10SPI MOSIGood 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.

  1. Disconnect the USB cable.
  2. Hold the BOOT button.
  3. Reconnect USB while keeping BOOT held.
  4. Release BOOT after the device enumerates.
  5. 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.

  1. Install the current Arduino IDE.
  2. Install esp32 by Espressif Systems through Boards Manager.
  3. Open Tools → Board → ESP32 Arduino.
  4. Select XIAO_ESP32C3.
  5. Select the USB serial port.
  6. 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

FeatureXIAO C3XIAO C6
CPUSingle-core RISC-V 160 MHzRISC-V HP core 160 MHz + LP core
Flash4 MB4 MB
Wi-FiWi-Fi 4Wi-Fi 6
BLEYesYes
Thread/ZigbeeNoYes
Board size21 × 17.8 mm21 × 17.8 mm
Published deep sleep~44 µA~15 µA under Seeed test conditions
ESPHome frameworkESP-IDF default; Arduino also availableESP-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

SymptomLikely cause / first check
Board no longer boots after adding hardwareCheck D0/GPIO2, D8/GPIO8 and D9/GPIO9 strap loading
Cannot enter upload modeDisconnect hardware from D9/GPIO9 and use BOOT recovery
A3 analogue readings are unstableGPIO5 is ADC2; move sensor to A0/A1/A2
No serial output over USBCheck USB serial settings/port and data cable
D6/D7 unavailable for sensorThey are default UART TX/RX; remap UART if needed
Battery voltage cannot be readNo onboard BAT-to-ADC path; add divider
No LED when battery poweredNormal board behaviour
Very poor Wi-Fi rangeCheck external U.FL antenna connection/orientation
Deep-sleep current much higher than 44 µAExternal sensors, regulator, pull-ups or board revision
SPI module prevents bootD8/D9 are strapping pins; inspect module pull resistors

Recommended Pin Choices

UseRecommended pins
General digital GPIOD1, D2, D3, D4, D5, D6, D7, D10
I²CD4/GPIO6 SDA, D5/GPIO7 SCL
UARTD6/GPIO21 TX, D7/GPIO20 RX
ADCD1/GPIO3, D2/GPIO4 first; D0/GPIO2 with strap caution
SPID8/D9/D10, but check boot-state loading on D8/D9
Avoid for precision ADCD3/GPIO5 (ADC2)
Use with boot cautionD0/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

Official Resources

Share your love