The classic ESP32 in depth: pins, ADC, DAC and when it's still worth it

The chip, the WROOM and WROVER modules, the 38-pin pinout, the ADC that lies, the DAC, touch, the pins you must not touch, and when to pick it today.

Also available in: EN, ES

Series Introduction to the ESP32 Part 2 View the series →
Illustration of the classic ESP32 and its peripherals

When people say “ESP32” they almost always mean this one: the 2016 chip with two cores and 38 pins. It still has the most tutorials, it is the cheapest board with classic Bluetooth, and even though there are more modern options, it still makes a lot of sense in 2026.

But it has a few corners —pins you cannot use, an ADC that is not as nice as the marketing suggests— that you should know before soldering anything. I have wasted more than one afternoon by not knowing them, so let’s save you the trouble.

The chip: not every “ESP32” is the same

Inside the module there is a specific chip, and they are not all equal:

ChipWhat is special about it
ESP32-D0WDQ6The original, 2 cores, QFN 6×6 mm
ESP32-D0WDSame but in a 5×5 mm package
ESP32-D0WD-V3The current revision, used in new modules
ESP32-D0WDR2With 2 MB of PSRAM inside the chip itself
ESP32-S0WDSingle core (rare to see)

For our purposes: 2 × Xtensa LX6 cores at 240 MHz, 520 KB of SRAM and 448 KB of ROM. That is the “classic ESP32”.

The modules: WROOM, WROVER and friends

The bare chip is not something you solder by hand. It lives inside a module with the flash, the crystal and the antenna. The ones you will find:

  • ESP32-WROOM-32E — the standard. 4 MB of flash, PCB antenna. Leaves GPIO16 and GPIO17 free.
  • ESP32-WROVER-E — same, but with 8 MB of PSRAM on top. Note: the PSRAM eats GPIO16 and GPIO17, so if you need those pins, you cannot use WROVER.
  • ESP32-WROOM-32UE / WROVER-IE — no PCB antenna, with a U.FL connector for an external antenna. The fix when the ESP32 lives inside a metal box.
ESP32-WROOM-32 module with its metal shield
The ESP32-WROOM-32: chip, flash and antenna in a single part. Photo: Ubahnverleih (CC0).

2026 note: for new designs, Espressif recommends the E series (ESP32-WROOM-32E / WROVER-E). The older modules without the “E” are marked as not recommended for new designs.

And on the back you can see where everything is:

Back side of the ESP32-WROOM-32 module
On the back: the ESP32 chip on the left and the flash memory on the right. Photo: Ubahnverleih (CC0).

The board you will buy

The module is mounted on a development board (devkit) that adds USB, a regulator and two buttons: EN (reset) and BOOT (for flashing). The classic one is the ESP32-DevKitC.

ESP32-DevKitC board
ESP32-DevKitC: the module, the micro-USB port, the regulator and the two buttons. Photo: Ubahnverleih (CC0).

A warning worth money: these boards have no native USB. The port is a bridge chip (CP2102 or CH340) that talks to the ESP32 over UART. If you have trouble flashing, it is almost always that chip’s driver, not the ESP32.

Specs, no fluff

ThingValue
Cores2 × Xtensa LX6 @ up to 240 MHz
SRAM520 KB
Wi-Fi802.11 b/g/n (2.4 GHz)
Bluetooth4.2 classic (BR/EDR) + BLE
GPIOs34 total, ~25 usable
ADC18 channels, 12-bit (ADC1 + ADC2)
DAC2 channels, 8-bit
Touch10 capacitive pins
Peripherals3×UART, 2×I2C, SPI, 2×I2S, CAN (TWAI), SD/MMC, PWM, RMT

The classic Bluetooth bit is unique to the classic: neither the S2, nor the C3, nor the S3 have it. If your project talks to a speaker or an old-school Bluetooth gamepad, this is your chip.

The 38-pin pinout

Full 38-pin ESP32 DevKitC pinout
ESP32 (DevKitC, 38 pins) pinout. Source: Wikimedia Commons, CC BY-SA 4.0.

If you come from Arduino, here is a mindset shift: not every pin does everything. There are input-only pins, pins that decide how the chip boots, and pins that are literally taken internally. Let’s go one by one.

The pins that rock

The DAC (GPIO25 and GPIO26)

The classic has two real analog outputs (8-bit). The C3, for example, has none. You can output an actual voltage, generate a waveform or build a mediocre but fun synthesizer.

Touch: 10 pins that sense your finger

With no extra sensor, the chip measures the capacitance of GPIO0, 2, 4, 12, 13, 14, 15, 27, 32 and 33. Perfect for buttons with no moving parts. (This peripheral disappeared in the S2 and S3, so if you need it, you go back to the classic.)

ADC1: the one that works with Wi-Fi

GPIO32 to GPIO39 are ADC1. They are the only ones you can use while Wi-Fi is on. Burn this into your memory, because it is the number one cause of “my sensor reads random values”.

And a few lesser-known extras

  • Internal Hall sensor, using no pin at all.
  • Internal temperature sensor (not very accurate, but it exists).
  • CAN (TWAI) in hardware, no external module.

The pins that will ruin your day

GPIO6 to GPIO11: the flash

They are wired to the flash memory. Never use them. If you touch them, the ESP32 stops booting and looks dead. It is not dead: re-flash it and breathe.

The boot (strapping) pins

On power-up, the chip looks at these pins to decide how to boot:

PinWhat happens if it is wrong
GPIO0LOW enters flash mode; as an output it can block boot
GPIO2Must be LOW or floating at boot
GPIO12If it is HIGH at boot, bad news (it is about flash voltage)
GPIO15Must be HIGH; otherwise the boot log is silenced

Rule of thumb: do not put anything critical on those pins and, if you do, check their state at boot.

GPIO34 to GPIO39: input only

They have no internal pull-up or pull-down and cannot be used as outputs. They are perfect for a sensor you only need to read, but if you try to light an LED with them it will not work and you will spend a while thinking the LED is broken.

The ADC lies (and how to tame it)

This is the detail that frustrates people most. The ESP32’s ADC is 12-bit, but:

  • It is not linear. It deviates a lot near 0 V and near 3.3 V.
  • It has an offset. With 11 dB attenuation it saturates earlier than the datasheet suggests.
  • It needs calibration. ESP-IDF ships an eFuse calibration API. Use it.
  • ADC2 does not work with Wi-Fi on. We repeat: use ADC1.

If you need decent, stable measurements, an external ADS1115 over I2C will save you a lot of headaches.

PSRAM: when you need it

PSRAM is extra memory (typically 8 MB on the WROVER). You need it if you are going to hold large buffers: images, audio, huge JSONs or network buffers.

If your project is sensors and a couple of LEDs, you do not need it and the WROOM is cheaper. And remember the toll: PSRAM uses GPIO16 and GPIO17.

When to pick the classic (and when not to)

Yes, pick the classic if…

  • You need classic Bluetooth (not just BLE).
  • You want DAC, touch or CAN without adding anything.
  • You need lots of GPIOs and GPIO16/17 free.
  • You are following a tutorial that assumes the classic and do not want to fight different pins.

Pick something else if…

  • You want the cheapest, most modern option: a C3 does almost the same for less.
  • You need native USB (HID, JTAG): S2, S3, C3 or C6.
  • You need camera, audio or AI: ESP32-S3.
  • You want Matter/Thread/Zigbee: C6 or H2.

Current tools (2026)

If you are going to program it, these are the living versions today:

ToolCurrent version
ESP-IDF6.1
Arduino core3.3.11 (on ESP-IDF 5.5.5)
PlatformIO (platform-espressif32)7.1.3
MicroPython1.29
esp-hal (Rust)1.2.0

Typical mistakes with the classic

  1. Trying to use GPIO6–11 “because they look free on the drawing”.
  2. Putting an LED on GPIO34–39 and not understanding why it stays dark.
  3. Reading a potentiometer on ADC2 and getting wild values once Wi-Fi comes up.
  4. Using GPIO12 as an output and having the board boot whenever it feels like it.
  5. Buying a WROVER to use GPIO16/17 and discovering they are taken.
  6. Blaming your code when the problem is the CH340 driver.

Summary

  • The classic ESP32 is 2 × LX6 cores, 520 KB SRAM, Wi-Fi 4 and classic Bluetooth + BLE.
  • The modules you will see: WROOM-32E (no PSRAM) and WROVER-E (with PSRAM that eats GPIO16/17).
  • It has unique things: DAC, touch, CAN and classic Bluetooth.
  • Watch out for GPIO6–11, the strapping pins (0, 2, 12, 15) and GPIO34–39 (input only).
  • ADC2 does not work with Wi-Fi; use ADC1 and, if you need precision, an ADS1115.

Next step: if you want something smaller, cheaper and with native USB, Part 3 is about the ESP32-S2. And if you do not have a board yet, start with Part 1: what the ESP32 is and its family.

Image credits

Photos from Wikimedia Commons:

  • ESP32-WROOM-32 module (front and back) and ESP32-DevKitC — Ubahnverleih (CC0)
  • ESP32 DevKitC pinout — Vishnu Maiea (CC BY-SA 4.0)

Related posts

↑↓ navigate ↵ open Esc close