Documentation

ShillehTek Pre-Soldered XIAO ESP32C3 Microcontroller: WiFi BLE Arduino Pre-Soldered | ShillehTek Product Manual
Documentation / ShillehTek Pre-Soldered XIAO ESP32C3 Microcontroller: WiFi BLE Arduino Pre-Soldered | ShillehTek Product Manual

ShillehTek Pre-Soldered XIAO ESP32C3 Microcontroller: WiFi BLE Arduino Pre-Soldered | ShillehTek Product Manual

Overview

The Seeed Studio XIAO ESP32-C3 is a thumbnail-sized development board built around Espressif's ESP32-C3 — a single-core 32-bit RISC-V microcontroller with built-in 2.4 GHz Wi-Fi and Bluetooth Low Energy 5.0. At just 21 × 17.5 mm, it's one of the smallest fully-featured Wi-Fi dev boards you can buy, while still exposing 11 GPIOs, 3 reliable ADC channels, hardware I2C/SPI/UART, and an external antenna connector.

It's pre-soldered with castellated edges, so you can drop it on a breadboard for prototyping or reflow it directly onto a custom PCB for production. The USB-C port handles both power and programming; the RESET and BOOT buttons make recovery trivial when something goes wrong.

This board shines in battery-powered IoT and wearable projects: deep-sleep current is in the microamp range, BLE and Wi-Fi share the same antenna, and the form factor lets you tuck it into spaces that an ESP32 DevKit-V1 simply can't fit. Program it with the Arduino IDE (esp32 core), MicroPython, or ESP-IDF.

At a Glance

MCU
ESP32-C3
Core
RISC-V @ 160 MHz
Wireless
Wi-Fi + BLE 5.0
Flash / SRAM
4 MB / 400 KB
GPIO
11 pins (D0-D10)
Logic Voltage
3.3V

Specifications

Parameter Value
Microcontroller ESP32-C3 (single-core 32-bit RISC-V)
Maximum Clock 160 MHz
Flash Memory 4 MB (external SPI flash)
SRAM 400 KB
ROM 384 KB
Wi-Fi 2.4 GHz IEEE 802.11 b/g/n
Bluetooth BLE 5.0 (no Classic)
USB USB-C (Native USB Serial/JTAG)
GPIO 11 pins (D0-D10)
Analog Input 3 reliable channels (A0, A1, A2 on ADC1) + A3 on ADC2 (use only if A0-A2 unavailable)
I2C SDA=D4 (GPIO6), SCL=D5 (GPIO7)
SPI SCK=D8 (GPIO8), MISO=D9 (GPIO9), MOSI=D10 (GPIO10)
UART TX=D6 (GPIO21), RX=D7 (GPIO20)
Power Input 5V via USB-C, or 3.7V LiPo via solder pads on back
Output Pins 5V (USB pass-through), 3V3 (regulator output)
Antenna On-board PCB antenna + IPEX U.FL connector
Dimensions 21 × 17.5 mm

Pinout Diagram

XIAO ESP32-C3 pinout diagram showing left side D0/A0/GPIO2 through D6/TX/GPIO21 and right side 5V, GND, 3V3, D10/MOSI/GPIO10, D9/MISO/GPIO9, D8/SCK/GPIO8, D7/RX/GPIO20, with I2C SDA on D4 and SCL on D5, and a note that A3 (GPIO5) uses ADC2 and may be unreliable for analog reads

Wiring Guide

Power and Programming

The XIAO ESP32-C3 is powered through USB-C (5V) or through the 5V/3V3/GND header pins. A 3.7V LiPo battery can be soldered to the BAT pads on the back of the board for portable use.

Pin Function Notes
USB-C 5V power + flashing No external programmer needed
5V +5V input/output Pass-through from USB-C
3V3 3.3V regulator output ~700 mA available for sensors
GND Ground Two GND pins
BAT pads 3.7V LiPo input Solder pads on PCB underside
Tip: If your board doesn't show up on a fresh flash, hold BOOT, tap RESET, then release BOOT to force the bootloader. After the first successful upload from the Arduino IDE, normal automatic-reset flashing usually works.
Warning: All GPIO pins are 3.3V only. Connecting a 5V signal (e.g., HC-SR04 Echo) directly will damage the chip. Use a logic-level shifter or 1k/2k voltage divider on any 5V output.

External LED + Button

Unlike larger ESP32 boards, the XIAO ESP32-C3 does not have a user-controllable on-board LED — only power and charge indicators. Add an external LED on any GPIO with a 220Ω current-limit resistor.

Component XIAO Pin Details
LED + 220Ω → GND D0 (GPIO2) Anode to GPIO, cathode to GND through resistor
Button → GND D1 (GPIO3) Use INPUT_PULLUP
Info: If you need a status LED with no extra components, address the on-board RGB-style LED on D6/GPIO21 — but note that this pin doubles as UART TX, so using it for an LED disables Serial1.

I2C Devices

I2C uses D4 for SDA and D5 for SCL. The Wire library on the ESP32 Arduino core picks these pins up automatically.

Sensor Pin XIAO ESP32-C3 Pin
VCC 3V3
GND GND
SDA D4 (GPIO6)
SCL D5 (GPIO7)
Tip: Most I2C breakouts have built-in 4.7k/10k pull-ups. If your sensor doesn't, add 4.7k from SDA and SCL to 3V3.

SPI Devices

SPI maps to D8 (SCK), D9 (MISO), and D10 (MOSI). Pick any free GPIO for the CS line — D7 (GPIO20) is a common choice.

SPI Signal XIAO Pin GPIO
SCK D8 GPIO8
MISO D9 GPIO9
MOSI D10 GPIO10
CS D7 GPIO20 (or any free GPIO)

UART / Serial

D6 is TX and D7 is RX for the second UART (Serial1). The USB-C port acts as the default Serial for the Arduino IDE Serial Monitor.

UART Signal XIAO Pin GPIO
TX (Serial1) D6 GPIO21
RX (Serial1) D7 GPIO20
Serial Monitor USB-C Native USB CDC

Code Examples

Arduino — External LED Blink

xiao_c3_blink.ino
// XIAO ESP32-C3 - Blink an external LED on D0
// Board: "XIAO_ESP32C3" in the Arduino IDE (esp32 core)

#define LED_PIN D0   // GPIO2

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(250);
  digitalWrite(LED_PIN, LOW);
  delay(250);
}

Arduino — Wi-Fi Scan

xiao_c3_wifi_scan.ino
// XIAO ESP32-C3 - Scan for nearby Wi-Fi networks
// Prints SSID, RSSI, and encryption type to Serial Monitor.

#include <WiFi.h>

void setup() {
  Serial.begin(115200);
  delay(500);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  Serial.println("Wi-Fi scan starting...");
}

void loop() {
  int n = WiFi.scanNetworks();
  Serial.printf("Found %d networks:\n", n);
  for (int i = 0; i < n; i++) {
    Serial.printf("  %2d) %-32s  %4d dBm  %s\n",
                  i + 1,
                  WiFi.SSID(i).c_str(),
                  WiFi.RSSI(i),
                  WiFi.encryptionType(i) == WIFI_AUTH_OPEN ? "OPEN" : "ENC");
  }
  Serial.println();
  delay(5000);
}

Arduino — I2C Bus Scanner

xiao_c3_i2c_scan.ino
// XIAO ESP32-C3 - I2C Bus Scanner
// SDA = D4 (GPIO6), SCL = D5 (GPIO7)

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  while (!Serial) {}
  Wire.begin();   // Defaults to SDA=GPIO6, SCL=GPIO7 on XIAO ESP32-C3
  Serial.println("\nI2C Scanner");
}

void loop() {
  byte found = 0;
  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {
      Serial.printf("  Found device at 0x%02X\n", addr);
      found++;
    }
  }
  Serial.printf("%d device(s) found.\n\n", found);
  delay(2000);
}

MicroPython — BLE Advertise Hello

xiao_c3_ble.py
# XIAO ESP32-C3 - MicroPython BLE Advertise
# Flash the official MicroPython ESP32-C3 firmware, then run this.

import bluetooth
from time import sleep

ble = bluetooth.BLE()
ble.active(True)

name = b"XIAO-C3"
adv = bytearray(b'\x02\x01\x06')              # Flags: LE general discoverable
adv += bytes([len(name) + 1, 0x09]) + name    # Complete local name

ble.gap_advertise(100_000, adv_data=adv)
print("Advertising as", name.decode())

while True:
    sleep(1)

Frequently Asked Questions

Why is my analog read from A3 noisy?
A3 (GPIO5) lives on ADC2, which is shared with the Wi-Fi radio on ESP32-C3. When Wi-Fi is active, ADC2 readings are unreliable. For consistent analog input, use A0, A1, or A2 — they are on ADC1 and work alongside Wi-Fi without interference.
How do I enter the bootloader if uploading fails?
Hold the BOOT button, tap RESET (or power-cycle by unplugging and replugging USB), then release BOOT. The board enters the ROM serial bootloader. Re-run your Arduino IDE upload — once it succeeds, automatic flashing usually works for subsequent uploads.
Can I power it from a battery?
Yes. The XIAO ESP32-C3 has BAT+ and BAT- solder pads on the underside designed for a 3.7V LiPo cell. The on-board charger handles charging from USB-C while the board runs. For a longer-life device, use deep-sleep — current drops to single-digit microamps.
Does it support Bluetooth Classic (A2DP, etc.)?
No. The ESP32-C3 supports BLE 5.0 only. For Bluetooth Classic features like A2DP audio streaming, you need an ESP32 (the original ESP32 series), not the C3.
How is it different from the XIAO ESP32-S3?
The S3 is dual-core Xtensa LX7 at 240 MHz with 8 MB PSRAM and supports more advanced features like camera interfaces and AI acceleration. The C3 is a single-core RISC-V at 160 MHz, simpler and a bit cheaper. For battery-powered IoT and BLE projects the C3 is excellent. For ML, audio, or larger memory needs, pick the S3.
Can I use the USB port for HID (keyboard/mouse)?
Yes. The ESP32-C3 has a native USB-Serial-JTAG controller; with the Arduino esp32 core you can configure it for USB CDC + HID. The Adafruit TinyUSB library supports HID descriptors over the native USB.
What antenna setup is best?
For most projects the on-board PCB antenna is fine and gives ~50 m range outdoors. For longer range, fragile RF environments, or when the board is enclosed in metal, attach an external 2.4 GHz antenna to the U.FL/IPEX connector and switch the antenna selection (search the Seeed wiki for the resistor-pad change required on the XIAO ESP32-C3).

Related Tutorials