The 38-pin GPIO expansion breakout solves the least glamorous, most persistent problem with ESP32 dev boards: they are too wide for a breadboard and too fiddly for permanent wiring. Seat your 38-pin ESP32 DevKit into the breakout’s female headers and every pin reappears on labeled terminals with room to work — power rails distributed alongside, GPIO numbers printed where you can read them, and connections that survive being bumped.
It changes how projects feel at two stages. During prototyping, it makes testing and rewiring fast: sensors connect and disconnect without prying the dev board loose or fighting for the one row of breadboard holes. And when a project graduates to “this stays plugged in,” the breakout is the difference between a nest of jumpers and an installation — screw it down, land the wires, done.
Because every ESP32 pin is exposed, the board also puts the ESP32’s pin quirks front and center: strapping pins that must float at boot, input-only pins with no pull-ups, and the ADC2 bank that stops converting when Wi-Fi runs. This manual covers seating and powering the breakout, a working map of which pins to use for what, wiring patterns for common sensor types, and test code for Arduino and MicroPython workflows.
At a Glance
Fits
38-pin ESP32 dev boards
Breaks Out
Every GPIO + power, labeled
Interfaces
I2C · SPI · UART · ADC · PWM
Power Rails
3.3 V · 5 V · GND distributed
Workflows
Arduino · ESP-IDF · MicroPython
ESP32 Included?
No — breakout board only
Specifications
Parameter
Value
Compatibility
38-pin ESP32 DevKit-style boards (2 × 19 headers)
Socket
Dual female header rows — dev board is removable
Breakout
All GPIO, EN, and power pins on labeled points
Power distribution
3.3 V, 5 V, and GND rails alongside the GPIO
Power input
Via the dev board’s USB, or 5 V to the VIN/5V rail
3.3 V source
The dev board’s regulator — budget ~300–500 mA for peripherals
Logic level
3.3 V (5 V rail is supply-only, not for GPIO)
Input-only pins
GPIO 34, 35, 36 (VP), 39 (VN)
Strapping pins
GPIO 0, 2, 12, 15 — keep unloaded at boot
Wi-Fi + analog
Use ADC1 (GPIO 32–36, 39); ADC2 dies with Wi-Fi on
Mounting
Corner holes for standoffs / enclosure mounting
Wiring Guide
Seating the Dev Board
Step
What to do
Notes
1. Match orientation
Line the dev board’s pin labels up with the breakout’s silk
3V3 over 3V3, GND over GND — check both corners
2. Align every pin
Rest the board, confirm no pin is beside its socket
A skewed row bends pins instantly
3. Press evenly
Push straight down, alternating ends
Firm, even pressure — never rock side to side
4. Verify
Power by USB; onboard LED and a 3.3 V check on the rail
Then flash a blink as a smoke test
Orientation is the one fatal mistake. Seated backwards, the dev board’s 5 V and GND land on the wrong rails the moment USB connects. Before first power-up, physically confirm one known pin (say, the 3V3 corner) sits over the matching label on the breakout. Ten seconds of checking protects both boards.
Powering the Board and Its Peripherals
Scenario
How to power
Notes
Desk / development
USB into the dev board
Breakout rails are fed through the dev board
Installed project
Regulated 5 V into the 5V/VIN rail + GND
Powers the dev board through its VIN
3.3 V sensors
Feed from the 3.3 V rail
Comes from the dev board’s regulator — keep total modest
Heavy loads (LEDs, motors, relays)
Own supply, grounds tied to the breakout GND
Never through the 3.3 V regulator
Budget the 3.3 V rail. The dev board’s little regulator feeds the ESP32 (Wi-Fi bursts included) plus everything on the 3.3 V rail. A few sensors are fine; a display plus a radio plus a sensor array starts browning out. When peripherals add up, feed the hungry ones 5 V or their own supply instead.
The Pin Map That Prevents Mysteries
Group
Pins
Rule of thumb
Safe general I/O
4, 5, 13, 14, 16–19, 21–23, 25–27, 32, 33
Use these first for outputs and buses
Input-only
34, 35, 36, 39
Great ADC inputs; no output, no internal pull-ups
Strapping pins
0, 2, 12, 15
Must be free at boot — avoid pull-downs/loads on them
Wi-Fi-safe analog
ADC1: 32–36, 39
ADC2 pins stop converting when Wi-Fi is on
Default buses
I2C 21/22 · VSPI 18/19/23/5 · UART0 1/3
Leave 1/3 alone — they are the USB serial link
Flash pins
6–11 (if exposed)
Never connect anything — internal flash uses them
Why boots fail with everything wired. GPIO 12 pulled high at reset changes the flash voltage; GPIO 0 pulled low enters bootloader mode; loads on 2 and 15 can do similar mischief. If a project boots naked but not fully wired, move whatever landed on a strapping pin to a safe pin and it resolves.
Landing Common Sensor Types
Peripheral type
Breakout points to use
Example
I2C sensor
3.3 V · GND · 21 (SDA) · 22 (SCL)
MPU6050, BME280, OLED
SPI device
18 (SCK) · 23 (MOSI) · 19 (MISO) · 5 (CS)
SD card, RC522, displays
Analog sensor
3.3 V · GND · GPIO 34 (ADC1)
LDR, TDS, gas sensor divider
Digital sensor
3.3 V · GND · any safe I/O (e.g. 27)
PIR, reed switch, DHT22
Serial module
16 (RX2) · 17 (TX2)
GPS, HC-12 — cross TX/RX
One habit for clean installs: land each sensor’s power on the rail segment nearest its signal pins and keep leads short. The breakout’s value is exactly this — wiring that reads like the pin map, so future-you can trace any wire in seconds.
Code Examples
1. Pin Sanity Tester
pin_tester.ino
// Blink any breakout point to confirm your wiring & labels.
// Change TEST_PIN, upload, and put an LED (with resistor) or
// a multimeter on that terminal.
const int TEST_PIN = 27;
void setup() {
pinMode(TEST_PIN, OUTPUT);
Serial.begin(115200);
Serial.printf("Toggling GPIO %d\n", TEST_PIN);
}
void loop() {
digitalWrite(TEST_PIN, HIGH);
delay(500);
digitalWrite(TEST_PIN, LOW);
delay(500);
}
2. I2C Bus Scanner (Pins 21 / 22)
i2c_scanner.ino
#include <Wire.h>
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // SDA, SCL on the breakout's I2C points
}
void loop() {
int found = 0;
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) {
Serial.printf("Device at 0x%02X\n", addr);
found++;
}
}
if (!found) Serial.println("No I2C devices found - check SDA/SCL");
Serial.println("---");
delay(3000);
}
3. ADC1 Reading with Wi-Fi Running
adc1_with_wifi.ino
// Proof of the ADC rule: GPIO 34 (ADC1) keeps working with Wi-Fi on;
// an ADC2 pin (e.g. GPIO 25) would return zeros here.
#include <WiFi.h>
const int SENSOR = 34; // input-only ADC1 pin on the breakout
void setup() {
Serial.begin(115200);
analogSetPinAttenuation(SENSOR, ADC_11db);
WiFi.begin("YourNetwork", "YourPassword"); // Wi-Fi active
}
void loop() {
int raw = analogRead(SENSOR);
float volts = raw * (3.3 / 4095.0);
Serial.printf("ADC1 raw: %d (%.2f V) WiFi: %s\n",
raw, volts,
WiFi.status() == WL_CONNECTED ? "connected" : "...");
delay(500);
}
4. MicroPython — Walk the Safe Pins
pin_walk.py
from machine import Pin
import time
# Pulses each safe output pin in turn - follow along with an LED
# probe on the breakout terminals to verify every label.
SAFE_PINS = [4, 5, 13, 14, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33]
pins = [Pin(n, Pin.OUT, value=0) for n in SAFE_PINS]
while True:
for n, p in zip(SAFE_PINS, pins):
print("GPIO", n)
p.value(1)
time.sleep(0.4)
p.value(0)
time.sleep(0.1)
Frequently Asked Questions
Does it come with the ESP32?
No — this is the breakout board alone. It accepts the common 38-pin ESP32 DevKit-style boards (two rows of 19 pins). If you are starting fresh, pair it with one of our pre-soldered 38-pin ESP32 dev boards and the two click together out of the box.
Will my 30-pin ESP32 board fit?
No — the socket spacing is specific to the 38-pin footprint, and a 30-pin board’s rows sit closer together. Check your board’s pin count before ordering; 38-pin boards have 19 pins per side and usually expose GPIO 34/35 and the VP/VN pins that 30-pin boards omit.
The dev board won’t seat flat. Should I push harder?
Stop and look first: one pin is almost certainly beside its socket hole rather than in it, or a pin got slightly bent in transit. Straighten any bent pin with pliers, realign, and press evenly from both ends. Force without alignment folds pins under the board — recoverable, but annoying.
My sketch works until I wire everything, then the ESP32 won’t boot.
Classic strapping-pin collision. GPIO 0, 2, 12, and 15 set boot behavior at reset, so a sensor or pull resistor parked on them can hold the chip in the wrong mode. Because the breakout makes every pin available, it is easy to grab one accidentally — shift the offending wire to a safe pin (see the Pin Groups tab) and boot returns to normal.
Can I power it from USB and the 5 V rail at the same time?
Avoid it. Pick one source at a time: USB while developing, the 5 V rail for the installed project. Backfeeding two supplies against each other stresses the dev board’s protection (some boards have a diode, some clones cut corners). If you must switch often, unplug one before connecting the other.
Can I drive relays, LED strips, or motors from the breakout terminals?
Signals yes, power no. GPIO pins still source only ~12–40 mA — the breakout adds convenience, not current. Run the control signal from a GPIO to a driver stage (relay/SSR module, MOSFET board, motor driver) and give the load its own supply, with grounds commoned at the breakout’s GND rail.
Why do my analog readings die when Wi-Fi connects?
The sensor is on an ADC2 pin. The ESP32’s Wi-Fi hardware owns ADC2 whenever the radio is active, so those pins return zeros mid-connection. Move analog inputs to the ADC1 group — GPIO 32, 33, 34, 35, 36, 39 — all clearly labeled on the breakout, and readings coexist with Wi-Fi happily (example 3 demonstrates it).