Verified 2026-10
SparkFun Thing Plus - ESP32 WROOM (USB-C)
Feather-footprint ESP32-WROOM board with 16 MB flash, USB-C through a CH340C bridge, a Qwiic connector on a separately switched 3.3 V rail, a microSD slot on the same SPI lines as the header, a single-cell LiPo connector with an MCP73831 charger and a MAX17048 fuel gauge, and 21 GPIO on the two 0.1in headers - 3.3 V logic, not 5 V tolerant.
Place this board on a carrier in the editor →
Specs
| MCU | Espressif ESP32-WROOM-32E module (dual-core Xtensa LX6 up to 240 MHz, 520 KB SRAM, 448 KB ROM, 16 MB SPI flash, 2.4 GHz WiFi 802.11 b/g/n, Bluetooth Classic and BLE) |
|---|---|
| Clock | 240 MHz |
| Flash | 16 MB |
| RAM | 520 KB |
| I/O | 21 digital, 13 analog, 16 PWM |
SparkFun's own counts for the header: 21 multifunctional GPIO, up to 13 12-bit ADC channels, 2 DAC, up to 16 PWM outputs and 8 capacitive-touch inputs. Only 20 of the 21 sit on the numbered header as GPIO - pads 10, 11, 12, 25, 26, 27 and 28 are USB, EN, battery, ground, no-connect, 3.3 V and reset - and four of the GPIO pads (A5, A4, A3, A2 = GPIO35/36/39/34) are input-only. GPIO0 goes to the BOOT button and is also the enable line for the Qwiic regulator, GPIO2 drives the WS2812, GPIO5 is the microSD chip select, GPIO13 drives the blue STAT LED, and GPIO1/GPIO3 are the CH340C's UART0 lines, which are not brought out to the header at all.
Pinout
28 pads, as the vendor numbers them.
| # | Name | Function | Signals |
|---|---|---|---|
| 1 | SDA | GPIO21 - I2C data. Feeds the Qwiic connector and the MAX17048 fuel gauge. No pull-up resistor on the board - the ESP32's internal pull-up is the only one unless the Qwiic chain supplies one | GPIO21, I2C SDA |
| 2 | SCL | GPIO22 - I2C clock. Same net as the Qwiic connector and the fuel gauge, and likewise no on-board pull-up | GPIO22, I2C SCL |
| 3 | 04 | GPIO14. Touch channel 6, ADC2 channel 6 | GPIO14, ADC2_CH6, Touch6 |
| 4 | 06 | GPIO32. ADC1 channel 4, touch channel 9 | GPIO32, ADC1_CH4, Touch9 |
| 5 | 08 | GPIO15. ADC2 channel 3, touch channel 3 | GPIO15, ADC2_CH3, Touch3 |
| 6 | 10 | GPIO33. ADC1 channel 5, touch channel 8 | GPIO33, ADC1_CH5, Touch8 |
| 7 | 11 | GPIO27. ADC2 channel 7, touch channel 7 | GPIO27, ADC2_CH7, Touch7 |
| 8 | 12 | GPIO12. ADC2 channel 5, touch channel 5. A strapping pin: it sets the flash voltage at reset, so do not hold it high or low during boot | GPIO12, ADC2_CH5, Touch5, strapping pin |
| 9 | LED | GPIO13 - drives the blue STAT LED through R4 (1k), anode side, so the LED is active HIGH. Also printed LED_BUILTIN on SparkFun's graphic. ADC2 channel 4, touch channel 4 | GPIO13, ADC2_CH4, Touch4, LED_BUILTIN |
| 10 | VUSB | USB 5 V, the same net as the USB-C VBUS pins, the MCP73831 charger input and the 3.3 V regulators' VIN through the input diode and P-FET. It is a 5 V rail brought out, not a 5 V output to load | 5V, V_USB |
| 11 | EN | Enable for the 3.3 V regulator (XC6222 CE). Pulled up to VIN through R8 (10k), so the board runs unless this pad is pulled low | EN, regulator enable |
| 12 | VBAT | Battery voltage, straight to the JST connector's positive pin and the MCP73831's battery pin - unfused and unswitched, so it is the battery node itself | VBAT, battery |
| 13 | FREE | GPIO4. ADC2 channel 0, touch channel 0 | GPIO4, ADC2_CH0, Touch0 |
| 14 | TX | GPIO17 - UART1 TX | GPIO17, UART1 TX |
| 15 | RX | GPIO16 - UART1 RX | GPIO16, UART1 RX |
| 16 | POCI | GPIO19 - SPI MISO (VSPIQ), shared with the microSD slot's DAT0 line | GPIO19, SPI MISO, VSPIQ |
| 17 | PICO | GPIO23 - SPI MOSI (VSPID), shared with the microSD slot's CMD line | GPIO23, SPI MOSI, VSPID |
| 18 | SCK | GPIO18 - SPI clock (VSPICLK), shared with the microSD slot's CLK line | GPIO18, SPI SCK, VSPICLK |
| 19 | A5 | GPIO35. ADC1 channel 7. Input only - GPIO34-39 have no output driver | GPIO35, ADC1_CH7, input only |
| 20 | A4 | GPIO36. ADC1 channel 0. Input only | GPIO36, ADC1_CH0, input only |
| 21 | A3 | GPIO39. ADC1 channel 3. Input only | GPIO39, ADC1_CH3, input only |
| 22 | A2 | GPIO34. ADC1 channel 6. Input only | GPIO34, ADC1_CH6, input only |
| 23 | A1 | GPIO25. ADC2 channel 8, DAC channel 1 | GPIO25, ADC2_CH8, DAC1 |
| 24 | A0 | GPIO26. ADC2 channel 9, DAC channel 2 | GPIO26, ADC2_CH9, DAC2 |
| 25 | GND | Ground | GND |
| 26 | NC | No connection. The pad is drilled and silkscreened NC but carries no net on the vendor's own board file, so nothing can be routed to it on a carrier | NC |
| 27 | 3V3 | 3.3 V from the main XC6222B331MR-G regulator, the same rail the ESP32 module, the microSD slot and the WS2812 run from. It is directly on the module's supply, so back-feeding it is back-feeding the module | 3.3V |
| 28 | RESET | Module enable (CHIP_PU / EN), pulled up through R2 (10k) and pulled low by the RST button, the CH340C's auto-reset transistor pair and this pad | RESET, EN, module enable |
Buses
| Bus | Signals | Pins | Voltage | Note |
|---|---|---|---|---|
| I2C ×2 | SDA, SCL | SDA, SCL | 3.3 V | GPIO21/GPIO22, on header pads 1-2, the Qwiic connector (J3) and the MAX17048 fuel gauge. SparkFun's board file shows no pull-up resistor anywhere on either line - the netlist ties SDA/SCL only to the module, the Qwiic connector, the fuel gauge and the two header pads - so the bus runs on the ESP32's internal pull-ups or whatever the Qwiic chain provides. A carrier that expects 2.2k on the host must add it, and two boards both relying on internal pull-ups will be weak. The Qwiic connector's 3.3 V is not the header's 3V3: it comes from a second XC6222B331MR-G (U5) whose enable is GPIO0, so Qwiic power is off until GPIO0 is driven high and off whenever the board is held in boot-button state. |
| SPI ×1 | SCK, PICO, POCI | SCK, PICO, POCI | 3.3 V | VSPI: SCK on GPIO18 (pad 18), PICO/MOSI on GPIO23 (pad 17), POCI/MISO on GPIO19 (pad 16). The microSD slot hangs off the same three lines with its own chip select on GPIO5 (module pad 29, no header pad), so a card and an SPI peripheral share one bus and cannot be clocked independently. |
| UART ×1 | TX, RX | TX, RX | 3.3 V | UART1 on GPIO17 (pad 14) and GPIO16 (pad 15). The console UART (UART0) is elsewhere: the CH340C bridge is wired to the module's TXD0/RXD0 (GPIO1/GPIO3) with DTR/RTS driving an auto-reset transistor pair, and those two GPIO are not on the header. |
| USB ×1 | D+, D- | 5 V | USB-C receptacle through a CH340C USB-to-serial bridge - this ESP32 has no native USB, so the port is a 5 V input and a serial console, not a USB device interface. R9 and R10 are 5.1k CC pull-downs, so a C-to-C cable works. |
I²C / bus addresses
| Address | Bus | Device | Note |
|---|---|---|---|
| 0x36 | I2C | MAX17048 fuel gauge | Silicon-fixed, nothing on the board straps it. Recorded here as the 7-bit address a bus scan reports; the MAX17048's own prose writes it as 0x6C write / 0x6D read, which is the 8-bit form with the R/W bit. It is on the same GPIO21/GPIO22 bus as the Qwiic connector, so a Qwiic device that sits at 0x36 will collide. |
Power
| Input | USB-C 5 V, or a single-cell LiPo on the 2-pin JST connector (J4), or 5 V onto the VUSB pad |
|---|---|
| Input range | 5 V USB on VUSB; the battery connects directly on VBAT. Both regulators take VIN, which is fed from VUSB through a diode and a P-FET (Q3) or from VBAT |
The MCP73831 charger (U1) takes VUSB, charges VBAT and sets its current with R6 (2.0k) on PROG, which the charger's own datasheet formula (I = 1000 V / R_PROG) makes 500 mA; the yellow CHG LED is the charger's STAT output through R3 (1k). A MAX17048 fuel gauge hangs on SDA/SCL to report battery state. SparkFun publishes no board-level current figure, only the module's (2.5 uA deep sleep, 80 mA average, 380 mA WiFi peak), so no board draw is recorded here. Three solder jumpers: PWR (gates the red power LED through R34), CHG_LED (gates the yellow charge LED through R3) and SHLD (ties the USB-C shell to ground, bridged by default). USB-C is a 5 V input only - it cannot be a USB device port.
Outputs
| Rail | Rating | Note |
|---|---|---|
| 3V3 | 3.3 V, 700 mA max | Main XC6222B331MR-G regulator (U3) feeding the ESP32 module, the microSD slot and the WS2812. 700 mA is SparkFun's figure for the regulator, not a measured board budget. |
| QWIIC_PWR | 3.3 V | A second XC6222B331MR-G (U5) that exists only to feed the Qwiic connector's 3.3 V pin. Its enable is GPIO0, so it is off until code or the module drives GPIO0 high - a sensor on the Qwiic chain will not power up on reset by itself. |
Notes
Pin numbers are the fab file's own J5 pad numbers in the THING_PLUS package - 1-12 one row, 13-28 the other - so they join to a pad rather than to a symbol, and as on the Thing Plus RP2350 the two rows run in opposite directions: pad 1 (SDA) and pad 13 (FREE) are at the same end, nearest the antenna. Silk labels on pads 3-8 are printed with leading zeros (04, 06, 08, 10, 11, 12) and are NOT the GPIO numbers: pad 3 is GPIO14, pad 4 GPIO32, pad 5 GPIO15, pad 6 GPIO33, pad 7 GPIO27, pad 8 GPIO12, per SparkFun's own graphical datasheet. Anyone reading '08' as GPIO8 will be wrong - GPIO8 does not come out at all. The board is 2.55 x 0.9 in (64.8 x 22.9 mm) with four 4-40 mounting holes. Buttons: BOOT on GPIO0 and RST on the module enable. LEDs: red PWR (jumper-gated), yellow CHG (charger STAT), blue STAT on GPIO13, and a WS2812 RGB LED on GPIO2 whose data-out is on test point TP2. Test points TP1-TP4 carry GPIO0, WS2812 DO, GPIO2 and GPIO5 (microSD CS). The fab file's module package is ESP-WROOM-32D-NARROW while the product page calls the module an ESP32-WROOM-32E; the pinout is the same but the two are not the same part number, so a footprint copied from this file is a 32D footprint. GPIO12 is a strapping pin (flash voltage) and GPIO0 is the boot strap, so a carrier that drives pad 8 or shorts GPIO0 will change how the board boots. GPIO34-39 are input-only, and the ESP32's ADC2 is unavailable while WiFi is active - on this board that hits pads 3-8 and A1/A0 (GPIO14, 32, 15, 33, 27, 12, 25, 26), which is most of the labelled analog pins, so the pins that keep working as ADC with WiFi on are A5, A4, A3 and A2 (GPIO35, 36, 39, 34).
Provenance
Every figure on this page was read from the 6 sources below and last checked on Oct 21, 2026.
- vendor SparkFun - Thing Plus ESP32 WROOM (USB-C) product page (WRL-20168, $29.95; 16 MB flash, 520 KB SRAM, 240 MHz, 21 GPIO, 13 ADC, 2 DAC, 16 PWM, 8 touch, 2.5 uA deep sleep, 80 mA average, 2.55 x 0.9 in, 28 PTH pins, MAX17048 fuel gauge, WS2812, PWR/CHG/STAT LEDs)
- datasheet SparkFun ESP32 Thing Plus (USB-C) graphical datasheet (per-pad silkscreen text and GPIO: pads 3-8 are 04/06/08/10/11/12 = GPIO14/32/15/33/27/12, pad 9 LED = GPIO13, pads 13-15 FREE/TX/RX = GPIO4/17/16, pads 16-18 POCI/PICO/SCK = GPIO19/23/18, pads 19-24 A5..A0 = GPIO35/36/39/34/25/26; ADC, DAC and touch channels; 700 mA 3.3 V regulator; Qwiic power enabled by GPIO0; microSD CS on GPIO5; 380 mA WiFi peak, 800 uA light sleep, 10-150 uA deep sleep)
- datasheet SparkFun Thing Plus ESP32-WROOM Eagle fab file (element J5, package THING_PLUS: pads 1-28 in two rows; nets per pad used for every pin number above; module U2, Qwiic J3, microSD J2, MCP73831 U1, MAX17048 U4, XC6222 U3/U5, CH340C U7, R6 2.0k PROG, R2/R8 10k pull-ups, R3/R4/R34 1k LED resistors, R9/R10 5.1k CC)
- datasheet SparkFun Thing Plus ESP32-WROOM (USB-C) schematic PDF
- datasheet Microchip MCP73831 charger datasheet (charge current set by the PROG resistor: I = 1000 V / R_PROG)
- datasheet Maxim MAX17048 fuel gauge datasheet (fixed I2C address 0x36 as a 7-bit address)