ESP32-DevKitC is the official Espressif development board with the ESP32-WROOM-32 module (or WROVER with PSRAM). It has 38 pins – unlike the cheap DevKit V1, it also breaks out GPIO0 and the flash memory pins.
The NodeMCU-32S and many 38-pin clones share the same layout.
Specifications
- ESP32: 2× Xtensa LX6 up to 240 MHz, 520 kB SRAM
- 4 MB flash, plus PSRAM on the version with the WROVER module
- Wi-Fi 4 (2.4 GHz), Bluetooth Classic and BLE 4.2
- all module GPIO including flash, 16 channels of 12-bit ADC, 2× DAC, 10 touch inputs
- 3× UART, 2× I2C, 2× free SPI, PWM on all output pins
- micro USB, CP2102N or CH9102F converter
- EN (reset) and BOOT buttons, power LED only
The board is wide – on a single standard breadboard there is no free row left on one side. Two breadboards side by side are more convenient. In the Arduino IDE, the generic ESP32 Dev Module board is all you need.
Pinout and pin table
Hover over a pin in the diagram or a table row; use the filter to highlight a bus. You can download the pinout as PNG or SVG.
| Pin | Name | Direction | UART | I2C | SPI | ADC | DAC | Touch | Note |
|---|---|---|---|---|---|---|---|---|---|
| J3-1 | GND | – | |||||||
| J3-2 | GPIO23 | input/output | MOSI | ||||||
| J3-3 | GPIO22 | input/output | SCL | ||||||
| J3-4 | GPIO1 | input/output | TX | UART0 TX – connected to the USB-serial converter | |||||
| J3-5 | GPIO3 | input/output | RX | UART0 RX – connected to the USB-serial converter | |||||
| J3-6 | GPIO21 | input/output | SDA | ||||||
| J3-7 | GND | – | |||||||
| J3-8 | GPIO19 | input/output | MISO | ||||||
| J3-9 | GPIO18 | input/output | SCK | ||||||
| J3-10 | GPIO5 | input/output | SS | Strapping pin (SDIO timing) – logic 1 at boot (internal pull-up) | |||||
| J3-11 | GPIO17 | input/output | Silkscreened TX2 on DOIT boards – in Arduino 3.x the default Serial2 is on GPIO4/25, specify this pin in Serial2.begin(…); used by PSRAM on WROVER modules | ||||||
| J3-12 | GPIO16 | input/output | Silkscreened RX2 on DOIT boards – in Arduino 3.x the default Serial2 is on GPIO4/25, specify this pin in Serial2.begin(…); used by PSRAM on WROVER modules | ||||||
| J3-13 | GPIO4 | input/output | RX2 | ADC2_CH0 | T0 | UART2 RX (Serial2, default in Arduino 3.x). ADC2 cannot be used with Wi-Fi enabled | |||
| J3-14 | GPIO0 | input/output | ADC2_CH1 | T1 | BOOT button. Strapping pin – logic 0 at boot = download mode | ||||
| J3-15 | GPIO2 | input/output | ADC2_CH2 | T2 | Strapping pin – must be logic 0 or unconnected at boot for download mode | ||||
| J3-16 | GPIO15 | input/output | ADC2_CH3 | T3 | Strapping pin – logic 0 at boot disables bootloader output. JTAG MTDO | ||||
| J3-17 | GPIO8 | input/output | Connected to flash memory (SD1) – do not use | ||||||
| J3-18 | GPIO7 | input/output | Connected to flash memory (SD0) – do not use | ||||||
| J3-19 | GPIO6 | input/output | Connected to flash memory (CLK) – do not use | ||||||
| J2-1 | 3V3 | output | 3.3 V output from the regulator | ||||||
| J2-2 | EN | input | Reset – connecting to GND restarts the chip (EN button) | ||||||
| J2-3 | GPIO36 | input | ADC1_CH0 | SENSOR_VP – input only, no internal pull-up/pull-down | |||||
| J2-4 | GPIO39 | input | ADC1_CH3 | SENSOR_VN – input only, no internal pull-up/pull-down | |||||
| J2-5 | GPIO34 | input | ADC1_CH6 | Input only, no internal pull-up/pull-down | |||||
| J2-6 | GPIO35 | input | ADC1_CH7 | Input only, no internal pull-up/pull-down | |||||
| J2-7 | GPIO32 | input/output | ADC1_CH4 | T9 | |||||
| J2-8 | GPIO33 | input/output | ADC1_CH5 | T8 | |||||
| J2-9 | GPIO25 | input/output | TX2 | ADC2_CH8 | DAC1 | DAC1 (8-bit); UART2 TX (Serial2, default in Arduino 3.x). ADC2 cannot be used with Wi-Fi on | |||
| J2-10 | GPIO26 | input/output | RX1 | ADC2_CH9 | DAC2 | DAC2 (8-bit); UART1 RX (Serial1, default in Arduino 3.x). ADC2 cannot be used with Wi-Fi on | |||
| J2-11 | GPIO27 | input/output | TX1 | ADC2_CH7 | T7 | UART1 TX (Serial1, default in Arduino 3.x). ADC2 cannot be used with Wi-Fi enabled | |||
| J2-12 | GPIO14 | input/output | ADC2_CH6 | T6 | JTAG MTMS; ADC2 cannot be used with Wi-Fi on | ||||
| J2-13 | GPIO12 | input/output | ADC2_CH5 | T5 | Strapping pin (flash voltage) – must be logic 0 at boot, otherwise the board will not boot. JTAG MTDI | ||||
| J2-14 | GND | – | |||||||
| J2-15 | GPIO13 | input/output | ADC2_CH4 | T4 | JTAG MTCK; ADC2 cannot be used with Wi-Fi on | ||||
| J2-16 | GPIO9 | input/output | Connected to flash memory (SD2) – do not use | ||||||
| J2-17 | GPIO10 | input/output | Connected to flash memory (SD3) – do not use | ||||||
| J2-18 | GPIO11 | input/output | Connected to flash memory (CMD) – do not use | ||||||
| J2-19 | 5V | input/output | 5 V from USB, or 5 V power input |
What to watch out for
- The GPIO are not 5V tolerant. Use a level shifter for 5V signals.
- GPIO6–11 (CLK, SD0–SD3, CMD) are connected to the module’s flash memory – if you use them, the ESP32 will crash.
- GPIO34, 35, 36 (VP) and 39 (VN) are input-only with no internal pull-up resistors.
- ADC2 (GPIO0, 2, 4, 12–15, 25–27) does not work while Wi-Fi is on – use ADC1 (GPIO32–39) for analog.
- Strapping pins: GPIO12 must be at logic 0 at boot, GPIO0 and GPIO2 select the download mode, GPIO5 and GPIO15 control timing and the bootloader log output.
- On the WROVER module, GPIO16 and GPIO17 are taken by the PSRAM.
ESP32 projects on chiptron.eu/
Projects and guides on chiptron.eu/:
- ESP32 DevKit LiPo – Olimex board pin-compatible with the ESP32-DevKitC, with LiPo charging
- YoRadio – internet radio with an ESP32 WROOM and an I2S DAC, Home Assistant support
- SEN66 with ESP32 – air quality sensor connected to an ESP32 DevKit, code and tips
More pinouts
See all pinouts on the Pinouts page.