What you are holding
A 20 by 25 millimetre board with a screen, a radio and sixteen holes. Here is what the buttons and LEDs do, which ones your code can reach, and how the expansion base charges a battery.
One chip, one screen, no bridge
The part in the middle is an ESP32-C3FH4: a single RISC-V core at up to
160 MHz, Wi-Fi 4 and Bluetooth LE, with 4 MB of flash and 400 kB of SRAM. There
is no PSRAM and no second core. One core matters more than it sounds: the radio
is serviced from the same core your loop() runs on, so a long delay() is a
stretch of time during which nothing is answering the access point.
Two things are on the board that are not on a bare C3 module. A 0.42 inch OLED is soldered to it and permanently wired to two of the GPIOs. And the USB-C socket goes straight to the chip — there is no CH340 or CP2102 between them, because the C3 has a USB peripheral of its own. That is why there is no driver to install on any operating system, and also why the port vanishes every time the chip resets.
Four parts that look like two
Two black buttons sit at the top edge, a millimetre apart, and two LEDs sit either side of the USB socket. In each pair, one is yours and one is not — and the silkscreen naming them is about half a millimetre tall.
The pair that costs people an evening is the buttons. RST restarts the chip
and is invisible to your code. BOO is GPIO 9, which the chip reads once at
reset to decide whether to run your sketch or wait for an upload, and which is
an ordinary input with a pull-up on it for the rest of the time. Holding the
wrong one during an upload is the difference between a board that flashes and
one that says "Failed to connect".
The size, if you are building it into something
The board is 20.5 mm wide and 25 mm tall, and the two rows of holes are 17.78 mm apart — 700 mil, which is a whole number of tenths, so it drops onto stripboard and across the centre channel of a breadboard without any adaptor. Eight holes down each side at the usual 2.54 mm.
The antenna is a ceramic chip a few millimetres long at the top edge. It is small, and it is the reason a later article in this book is about turning the transmit power down: at full power the radio puts out more than the matching around that antenna can carry, and the board fails to join networks it is sitting next to.
What the box gives you as well
The expansion base is the second board in the bag: a carrier with a power switch, a JST PH 2.0 battery connector, a charger, and a solder pad that connects the battery to an ADC pin so a sketch can read its own battery level. It also decides one thing you cannot undo, which is which way round the C3 board goes into it — that is its own article, and worth reading before the first time rather than after.
Charging needs the switch on
The base has its own charge indicator: LED1 in the charging-circuit notes,
connected to the charger's CHRG pin. This is separate from the power and
IO8 LEDs on the C3 board. The base's slide switch, SW2, also controls whether
the battery is connected to the charging and battery-detection circuit.
Plugging in USB is not enough: the switch must be ON to charge the cell.
- Fit the base in the correct orientation and connect a suitable single-cell battery with the correct polarity.
- Move
SW2to ON, then connect USB/5 V power. The charge LED stays on steadily while the battery is charging. - When charging finishes, the charge LED goes out as
CHRGbecomes high-impedance. - To disconnect the battery for transport or storage, move
SW2to OFF. The battery will not charge in this position, even with USB connected.
With USB/5 V supplied, the indicator behaves as follows:
| Switch and battery state | Charge LED | What it means |
|---|---|---|
| ON, battery connected and charging | Steady on | The battery is in the charging circuit. |
| ON, charging complete | Off | Charging has finished. |
| OFF | Rapid flashing, which may look dim or half-lit | The battery is disconnected from the charger and is not charging. |
The supplied charging-circuit notes describe the OFF-state glow as rapid
switching of CHRG between low and high-impedance when the charger cannot
detect the battery. Your eyes blend the flashes into a dimmer light. On the
documented circuit, this behaviour alone is normal and does not indicate a
fault; it is not a reduced-current charging mode. An unlit LED by itself is
not proof of a full battery either — check that power and the battery are
connected and the switch is ON.
Inside the base's charging circuit
The following component references come from the supplied Charging Circuit Instructions (充电电路说明书), based on schematic Schematic2_9, P1, ESP32-C3, V1.0, dated 2025-10-06.
| Component | Job |
|---|---|
| U13 — TP4054 | Single-cell lithium battery linear charger, with CHRG, GND, BAT, VCC and PROG pins. |
| R10 and R11 — 100 kΩ each | Battery-voltage divider feeding the BATTERYMONITOR ADC network. |
| SW2 | Connects or disconnects the battery from the charging and detection path. |
| Q1 | MOSFET identified in the notes as battery reverse-polarity protection / discharge control. |
| F2 | Fuse in series with the battery-positive path. |
| LED1 and R9 — 2 kΩ | Charge-status indicator driven by CHRG. |
In the notes' description of the switched battery path, Q1's drain connects
to battery positive through F2, and its source leads towards SW2. With SW2
ON, contacts 2–3 connect the battery to U13's BAT network and the
R10/R11 sensing circuit. With SW2 OFF, the contact moves to pin 1, which
is unconnected, opening that path. Pins 4–6 are marked unused.
The two equal divider resistors halve the sensed voltage before it reaches
the ADC. The base's BATTERY MONITOR solder jumper must be bridged to read
that voltage on GPIO 2; the battery-level article
explains the conversion and calibration.
For a custom hardware modification, the notes also suggest monitoring
CHRG with an ESP32 GPIO and a 4.7–10 kΩ pull-up to 3.3 V, using its level
changes to help identify battery connection status. That needs an added
connection and a check of the existing LED circuit's voltage levels before
wiring it to a GPIO; it is not a signal already available to a stock sketch.
When it does not work
The expansion base's charge LED is separate from the C3 board's power and IO8 LEDs. With SW2 OFF, the battery is disconnected from the charger. The charging-circuit notes describe rapid flashing that can look dim or half-lit; the battery is not charging. With a battery connected, move SW2 to ON and supply USB/5 V power to charge it. A steady charge LED means charging; it goes out when charging finishes.
You are probably looking at the red one. The red LED is wired across the 3.3 V rail through a resistor and has no pin at all, so nothing in any sketch can change it — it is lit whenever the board has power. The blue one, marked IO8, is the one on GPIO 8.
It does exactly one thing — it restarts the chip — and if your sketch prints nothing on startup there is nothing to see. Add a Serial.println in setup and press it again. If the serial port disappears from the IDE for a second when you press it, that is the reset working and the USB peripheral going down with it.
Slightly warm at the regulator is normal, especially with the radio transmitting. Hot enough to be uncomfortable to hold is not — unplug it and check that nothing is bridging V5 or V3 to GD before you plug it in again.
This book is written for the board with the 0.42 inch display soldered to it, and two of its GPIOs are spent on that display. A SuperMini or a bare C3 module is the same chip with different pins free; the ESP32 book covers the chip, and that is the better place to start with one of those.
What is printed beside each hole, what your code has to call it instead, and which ones were taken before you arrived.
The sixteen pins, and the six already spoken for →Edit this page — content/boards/c3-oled/what-you-are-holding.mdx
Questions about this product
See what other owners have asked, and read their solutions.
ESP32-C3 OLED Development Board with Expansion Base
Loading discussions…
Discuss this article
Ask about this page. The answer stays here, on the page it belongs to, for whoever hits the same wall next.