The ESP32-WROOM-32 module features 38 physical pads, but standard 30-pin DevKit boards expose 25 usable GPIOs operating strictly at 3.3V logic. Below is the definitive pinout reference, regional wiring color standards for peripheral integration, and exact strapping pin rules to prevent boot failures.
Complete ESP32-WROOM-32 Pinout Reference
This table maps the standard 30-pin DevKitC V4 layout to the underlying ESP32-WROOM-32E silicon. Always assume a 3.3V logic level; feeding 5V into any GPIO will destroy the input protection diodes and likely brick the chip.
| DevKit Pin | GPIO | Primary Function | Restrictions & Notes |
|---|---|---|---|
| 3V3 | - | Power (3.3V) | Max draw ~500mA depending on onboard regulator. |
| GND | - | Ground | Common ground for all peripherals. |
| EN | - | Enable | High to run, Low to reset. Has internal pull-up. |
| VP | 36 | ADC1_CH0 / Input | Input ONLY. No internal pull-up/pull-down. |
| VN | 39 | ADC1_CH3 / Input | Input ONLY. No internal pull-up/pull-down. |
| IO34 | 34 | ADC1_CH6 / Input | Input ONLY. No internal pull-up/pull-down. |
| IO35 | 35 | ADC1_CH7 / Input | Input ONLY. No internal pull-up/pull-down. |
| IO32 | 32 | ADC1_CH4 / Touch9 | Safe for I2C/UART. Has internal pull-up/down. |
| IO33 | 33 | ADC1_CH5 / Touch8 | Safe for I2C/UART. Has internal pull-up/down. |
| IO25 | 25 | ADC2_CH8 / DAC1 | ADC2 conflicts with WiFi. DAC output capable. |
| IO26 | 26 | ADC2_CH9 / DAC2 | ADC2 conflicts with WiFi. DAC output capable. |
| IO27 | 27 | ADC2_CH7 / Touch7 | ADC2 conflicts with WiFi. |
| IO14 | 14 | ADC2_CH6 / Touch6 | ADC2 conflicts with WiFi. Outputs PWM on boot. |
| IO12 | 12 | ADC2_CH5 / Touch5 | Strapping pin. Boot fails if pulled HIGH. |
| IO13 | 13 | ADC2_CH4 / Touch4 | ADC2 conflicts with WiFi. |
| IO9 | 9 | SD2 (Flash SPI) | Connected to internal flash. Do not use. |
| IO10 | 10 | SD3 (Flash SPI) | Connected to internal flash. Do not use. |
| IO11 | 11 | CMD (Flash SPI) | Connected to internal flash. Do not use. |
| IO23 | 23 | VSPI MOSI | Safe for general output/SPI. |
| IO22 | 22 | Wire SCL (Default) | Safe for I2C. Has internal pull-up. |
| TX0 | 1 | UART0 TX | Debug output. HIGH on boot. |
| RX0 | 3 | UART0 RX | Debug input. HIGH on boot. |
| IO21 | 21 | Wire SDA (Default) | Safe for I2C. Has internal pull-up. |
| IO19 | 19 | VSPI MISO | Safe for general input/SPI. |
| IO18 | 18 | VSPI SCK | Safe for general output/SPI. |
| IO5 | 5 | VSPI SS / PWM | Strapping pin. Outputs PWM on boot. |
| TX2 | 17 | UART2 TX | Safe for general UART. |
| RX2 | 16 | UART2 RX | Safe for general UART. |
| IO4 | 4 | ADC2_CH0 / Touch0 | ADC2 conflicts with WiFi. |
| IO0 | 0 | ADC2_CH1 / Touch1 | Strapping pin. Must be HIGH for normal boot. |
| IO2 | 2 | ADC2_CH2 / Touch2 | Strapping pin. Onboard LED. Must be LOW/Floating to boot. |
| IO15 | 15 | ADC2_CH3 / Touch3 | Strapping pin. Outputs PWM on boot. |
Rows People Get Wrong: Strapping Pins and ADC Conflicts
The most common bench failures with the WROOM-32 happen when builders ignore the silicon-level constraints tied to specific GPIOs. Here is what the datasheet actually means for your circuit:
- The Strapping Pins (GPIO 0, 2, 5, 12, 15): During reset, the ESP32 samples these pins to determine boot mode and flash voltage. If you wire a relay or a sensor that pulls GPIO 12 HIGH during power-on, the chip will attempt to boot from an unsupported flash voltage and enter a continuous boot loop. Keep GPIO 12 LOW or floating at startup.
- The ADC2 vs. WiFi Trap: If your project uses WiFi or Bluetooth, the radio subsystem claims exclusive control of the ADC2 peripheral. Any attempt to read analog values from GPIO 4, 12, 13, 14, 15, 25, 26, or 27 while WiFi is active will return garbage data or fail silently. Always route critical analog sensors to ADC1 (GPIO 32, 33, 34, 35, 36, 39).
- Input-Only Pins (34, 35, 36, 39): These pins lack internal pull-up/pull-down resistors and cannot drive outputs. If you need a stable logic level on these pins for a button or switch, you must add an external 10kΩ resistor to 3.3V or GND.
Regional Wiring Standards: DC Sensors vs. Mains Relays
While the ESP32 operates at 3.3V DC, it is frequently used to trigger relay modules that switch regional mains voltages. Confusing DC wiring conventions with AC mains color codes is a severe shock hazard. Always verify which standard applies to your physical location.
Any procedure involving mains voltage (>50V AC / >120V DC) requires de-energizing the circuit, locking out the breaker, and verifying dead with a tested CAT III multimeter. Local electrical codes (NEC, IEC) may require a licensed electrician for permanent mains connections.
Low-Voltage DC Sensor Wiring (IEC vs. NEC Practices)
For 3.3V and 5V DC sensor wiring (I2C, SPI, UART), the industry generally follows a unified bench standard rather than strict regional building codes:
- Red: VCC / Power (3.3V or 5V)
- Black: GND
- Yellow/White/Blue: Signal / Data lines
Note: Do not use IEC 60446 AC colors (Brown/Blue) for low-voltage DC breadboarding, as it creates dangerous confusion if the same enclosure houses a mains-powered relay.
Mains Relay Wiring (Regional AC Standards)
When wiring the load side of an ESP32-controlled relay module to 120V/230V AC, you must follow your regional authority having jurisdiction (AHJ):
| Region / Standard | Live / Hot | Neutral | Earth / Ground |
|---|---|---|---|
| US / Canada (NEC) | Black (or Red) | White | Bare Copper or Green |
| EU / IEC 60446 | Brown | Blue | Green/Yellow Stripe |
| Old UK (Pre-2004) | Red | Black | Green |
| Australia / NZ | Red (or Brown) | Black (or Blue) | Green/Yellow Stripe |
If you are retrofitting an older UK installation (pre-2004 colors) with a modern ESP32 smart relay, the old Black wire is actually Live-equivalent Neutral, but you must test it with a non-contact voltage tester before assuming the color code, as previous DIYers may have wired it backward.
Safe Interpretation When Silkscreen Markings Are Faded
Cheap clone DevKit boards often suffer from silkscreen that rubs off after a few months of bench use. If your pin labels are missing, do not guess. Use the physical WROOM module and a multimeter to safely map the board:
- Locate the RF Shield: The large metal can on the ESP32-WROOM module is physically tied to GND. Set your multimeter to continuity mode. Probe the metal shield with one lead, and test the header pins with the other. Any pin that beeps is a GND pin.
- Find the EN Pin: Look at the physical WROOM module text. The pad labeled 'EN' is always located immediately adjacent to the '3V3' pad on the left side of the module (when the RF shield is facing up and the antenna is pointing away from you).
- Identify the 5V vs 3.3V Rails: Power the board via USB. Set your meter to DC Voltage. Probe the suspected power pins against your confirmed GND. The pin reading 5.0V-5.2V is the USB VBUS (often labeled 5V or VIN). The pin reading exactly 3.3V is your logic supply. Never feed 5V into a pin that reads 3.3V when powered, as it is an output from the onboard LDO.
Frequently Asked Questions
Is there an "ESP32 VROOM" module, or is it a typo for WROOM?
Search queries frequently include the term ESP32 VROOM pinout, but this is a phonetic typo. Espressif Systems manufactures the WROOM (Wi-Fi + Bluetooth RF integrated module) and WROVER (includes external PSRAM) series. There is no official 'VROOM' silicon. If you bought a board labeled 'VROOM', it is either a counterfeit silkscreen error or a joke by a third-party PCB designer. Treat it exactly as a standard ESP32-WROOM-32 for pinout and flashing purposes.
Which ESP32-WROOM pins are safest to use for I2C sensors?
While the ESP32's GPIO matrix allows you to map I2C to almost any pin, the default hardware I2C0 pins are GPIO 21 (SDA) and GPIO 22 (SCL). These pins have internal pull-up resistors (typically 45kΩ), which can sometimes save you from adding external 4.7kΩ pull-ups for short-distance, single-sensor runs. Avoid using GPIO 16 and 17 for I2C if you plan to use the hardware UART2, as they are the default RX/TX pins.
Why does my ESP32-WROOM draw excess current in deep sleep?
If your multimeter shows 5mA+ during deep sleep (instead of the expected ~10µA), you likely have a GPIO pin configured as an output driving HIGH into a peripheral that is powered down, or you have an external pull-up resistor tied to a 5V rail leaking back through the ESP32's internal protection diodes. Before entering deep sleep, use gpio_deep_sleep_hold_en() in your code, and ensure all peripherals are powered via a GPIO-controlled MOSFET so the ESP32 can physically cut their ground or VCC before sleeping. For exact current consumption metrics, refer to the Espressif ESP32 Datasheet.






