STANNUM
Open the simulator

Tutorials / Boards

ESP32 boards

Eight boards to choose from, pin by pin: which GPIOs reach the header, which are input-only, which have an ADC, and which must be left alone.

Every project has one board, and it is always an ESP32 — the original chip, with two cores and Wi-Fi. The firmware and the compiler are the same on all eight models below. What changes is the header — which pins reach the edge of the board, with what label, and what else the board carries (a battery connector, a camera, an Uno shape). Choose the model on the board's card (double-click its title bar → Settings → Board model). Switching models keeps the wires that still have a pin to go to.

Which one to pick

BoardPinsWhen
DOIT ESP32 DevKit V1 (30 pins)30The default and the most common board on the market — the one in most tutorials. The flash pins do not reach the header, and neither does GPIO 0.
ESP32-DevKitC V4 (38 pins)38Espressif's official board. Brings out 5 V, GPIO 0 and the flash GPIOs 6–11 (which must not be used — the lab crosses them out).
WROOM-32 module (no board)38The bare module, with no regulator and no USB. 3V3 is an input here: you supply regulated 3.3 V.
NodeMCU-32S (Ai-Thinker, 38 pins)38Ai-Thinker's 38-pin board: the DevKitC V4 layout with different labels — P in front of the GPIO, SVP/SVN, RX/TX. Very common in kits.
WeMos LOLIN32 Lite (26 pins)26The small, cheap board with a Li-Po connector (“ESP32 Lite” in many shops). No 5 V pin, no RX0/TX0, no GPIO 21 on the header.
AI-Thinker ESP32-CAM (16 pins)16The camera board. The camera is simulated with your computer's camera (see the camera guide); the header has the 10 GPIOs left, the SD card on 2, 4, 12–15, no USB (programmed through U0R/U0T).
WeMos D1 R32 (Uno form factor)30An ESP32 in the shape of an Arduino Uno, for Uno shields (at 3.3 V!). Pick it if your class has Uno shields on the shelf.
Adafruit HUZZAH32 Feather (28 pins)28Adafruit's Feather: battery charging on board, the Feather pin layout, A0–A13 names. Common in the Adafruit ecosystem.

Rules that hold on every board

DOIT ESP32 DevKit V1 (30 pins)

The DOIT ESP32 DevKit V1 (30 pins) as the lab draws it, with the labels of the silkscreen.
LabelGPIONotes
3V33RX0 — the serial monitor's receive line.
GNDGround. All GND pins are the same node.
D1515ADC. Strapping pin; default CS of HSPI.
D22ADC. Strapping pin; on many boards it also drives the on-board LED.
D44ADC
RX216RX2 — Serial2 receive by default (the GPS guide uses it).
TX217TX2 — Serial2 transmit by default.
D55Default chip select (CS) of the VSPI bus.
D1818Default SCK of VSPI (displays, SD card, LoRa).
D1919Default MISO of VSPI.
D2121Default SDA: Wire.begin() with no arguments uses it.
RX03RX0 — the serial monitor's receive line.
TX01TX0 — the serial monitor's transmit line. Using it as a GPIO breaks Serial.
D2222Default SCL: Wire.begin() with no arguments uses it.
D2323Default MOSI of VSPI.
VIN5 V input to the regulator (what the USB supplies). Never wire it to a GPIO.
GNDGround. All GND pins are the same node.
D1313ADC. Default MOSI of HSPI.
D1212ADC. Strapping pin: must be LOW at boot (the default MISO of HSPI).
D1414ADC. Default SCK of HSPI.
D2727ADC
D2626ADC. Also a DAC output on the real chip (not simulated).
D2525ADC. Also a DAC output on the real chip (not simulated).
D3333ADC
D3232ADC
D3535input only, no pull-up, ADC
D3434input only, no pull-up, ADC
VN39input only, no pull-up, ADC
VP36input only, no pull-up, ADC
ENChip enable: pulling it LOW holds the chip in reset.

ESP32-DevKitC V4 (38 pins)

The ESP32-DevKitC V4 (38 pins) as the lab draws it, with the labels of the silkscreen.
LabelGPIONotes
3V33RX0 — the serial monitor's receive line.
ENChip enable: pulling it LOW holds the chip in reset.
VP36input only, no pull-up, ADC
VN39input only, no pull-up, ADC
IO3434input only, no pull-up, ADC
IO3535input only, no pull-up, ADC
IO3232ADC
IO3333ADC
IO2525ADC. Also a DAC output on the real chip (not simulated).
IO2626ADC. Also a DAC output on the real chip (not simulated).
IO2727ADC
IO1414ADC. Default SCK of HSPI.
IO1212ADC. Strapping pin: must be LOW at boot (the default MISO of HSPI).
GNDGround. All GND pins are the same node.
IO1313ADC. Default MOSI of HSPI.
SD29internal flash — do not use
SD310internal flash — do not use
CMD11internal flash — do not use
5V5Default chip select (CS) of the VSPI bus.
GNDGround. All GND pins are the same node.
IO2323Default MOSI of VSPI.
IO2222Default SCL: Wire.begin() with no arguments uses it.
TX01TX0 — the serial monitor's transmit line. Using it as a GPIO breaks Serial.
RX03RX0 — the serial monitor's receive line.
IO2121Default SDA: Wire.begin() with no arguments uses it.
GNDGround. All GND pins are the same node.
IO1919Default MISO of VSPI.
IO1818Default SCK of VSPI (displays, SD card, LoRa).
IO55Default chip select (CS) of the VSPI bus.
IO1717TX2 — Serial2 transmit by default.
IO1616RX2 — Serial2 receive by default (the GPS guide uses it).
IO44ADC
IO00ADC. BOOT button, a strapping pin: leave it alone at boot; fine as an input afterwards.
IO22ADC. Strapping pin; on many boards it also drives the on-board LED.
IO1515ADC. Strapping pin; default CS of HSPI.
SD18internal flash — do not use
SD07internal flash — do not use
CLK6internal flash — do not use

WROOM-32 module (no board)

The WROOM-32 module (no board) as the lab draws it, with the labels of the silkscreen.
LabelGPIONotes
GNDGround. All GND pins are the same node.
3V33RX0 — the serial monitor's receive line.
ENChip enable: pulling it LOW holds the chip in reset.
SENSOR_VP36input only, no pull-up, ADC
SENSOR_VN39input only, no pull-up, ADC
IO3434input only, no pull-up, ADC
IO3535input only, no pull-up, ADC
IO3232ADC
IO3333ADC
IO2525ADC. Also a DAC output on the real chip (not simulated).
IO2626ADC. Also a DAC output on the real chip (not simulated).
IO2727ADC
IO1414ADC. Default SCK of HSPI.
IO1212ADC. Strapping pin: must be LOW at boot (the default MISO of HSPI).
GNDGround. All GND pins are the same node.
IO1313ADC. Default MOSI of HSPI.
SD29internal flash — do not use
SD310internal flash — do not use
CMD11internal flash — do not use
CLK6internal flash — do not use
SD07internal flash — do not use
SD18internal flash — do not use
IO1515ADC. Strapping pin; default CS of HSPI.
IO22ADC. Strapping pin; on many boards it also drives the on-board LED.
IO00ADC. BOOT button, a strapping pin: leave it alone at boot; fine as an input afterwards.
IO44ADC
IO1616RX2 — Serial2 receive by default (the GPS guide uses it).
IO1717TX2 — Serial2 transmit by default.
IO55Default chip select (CS) of the VSPI bus.
IO1818Default SCK of VSPI (displays, SD card, LoRa).
IO1919Default MISO of VSPI.
NCNot connected.
IO2121Default SDA: Wire.begin() with no arguments uses it.
RXD03RX0 — the serial monitor's receive line.
TXD01TX0 — the serial monitor's transmit line. Using it as a GPIO breaks Serial.
IO2222Default SCL: Wire.begin() with no arguments uses it.
IO2323Default MOSI of VSPI.
GNDGround. All GND pins are the same node.

NodeMCU-32S (Ai-Thinker, 38 pins)

Physically the same 38-pin layout as the DevKitC V4 — the labels are what changes. SVP and SVN are GPIO 36 and 39 (the “sensor” inputs), RX/TX are the serial monitor's GPIO 3 and 1, and SD0–SD3, CMD and CLK are the flash pins: crossed out in the lab, off limits on the bench.

The NodeMCU-32S (Ai-Thinker, 38 pins) as the lab draws it, with the labels of the silkscreen.
LabelGPIONotes
3V33RX0 — the serial monitor's receive line.
ENChip enable: pulling it LOW holds the chip in reset.
SVP36input only, no pull-up, ADC
SVN39input only, no pull-up, ADC
P3434input only, no pull-up, ADC
P3535input only, no pull-up, ADC
P3232ADC
P3333ADC
P2525ADC. Also a DAC output on the real chip (not simulated).
P2626ADC. Also a DAC output on the real chip (not simulated).
P2727ADC
P1414ADC. Default SCK of HSPI.
P1212ADC. Strapping pin: must be LOW at boot (the default MISO of HSPI).
GNDGround. All GND pins are the same node.
P1313ADC. Default MOSI of HSPI.
SD29internal flash — do not use
SD310internal flash — do not use
CMD11internal flash — do not use
5V5Default chip select (CS) of the VSPI bus.
GNDGround. All GND pins are the same node.
P2323Default MOSI of VSPI.
P2222Default SCL: Wire.begin() with no arguments uses it.
TX1TX0 — the serial monitor's transmit line. Using it as a GPIO breaks Serial.
RX3RX0 — the serial monitor's receive line.
P2121Default SDA: Wire.begin() with no arguments uses it.
GNDGround. All GND pins are the same node.
P1919Default MISO of VSPI.
P1818Default SCK of VSPI (displays, SD card, LoRa).
P55Default chip select (CS) of the VSPI bus.
P1717TX2 — Serial2 transmit by default.
P1616RX2 — Serial2 receive by default (the GPS guide uses it).
P44ADC
P00ADC. BOOT button, a strapping pin: leave it alone at boot; fine as an input afterwards.
P22ADC. Strapping pin; on many boards it also drives the on-board LED.
P1515ADC. Strapping pin; default CS of HSPI.
SD18internal flash — do not use
SD07internal flash — do not use
CLK6internal flash — do not use

WeMos LOLIN32 Lite (26 pins)

Two rows of thirteen. One row starts with VP and ends with the only GND; the other starts with the only 3V3 and ends with 13. There is no 5 V pin: the board is powered by the USB or by the battery on its connector. GPIO 21, the usual SDA, is not on the header — call Wire.begin(19, 23) or any other pair. The blue LED on the board is GPIO 22, and it lights on LOW.

The WeMos LOLIN32 Lite (26 pins) as the lab draws it, with the labels of the silkscreen.
LabelGPIONotes
VP36input only, no pull-up, ADC
VN39input only, no pull-up, ADC
ENChip enable: pulling it LOW holds the chip in reset.
3434input only, no pull-up, ADC
3535input only, no pull-up, ADC
3232ADC
3333ADC
2525ADC. Also a DAC output on the real chip (not simulated).
2626ADC. Also a DAC output on the real chip (not simulated).
2727ADC
1414ADC. Default SCK of HSPI.
1212ADC. Strapping pin: must be LOW at boot (the default MISO of HSPI).
GNDGround. All GND pins are the same node.
3V33RX0 — the serial monitor's receive line.
2222Default SCL: Wire.begin() with no arguments uses it.
1919Default MISO of VSPI.
2323Default MOSI of VSPI.
1818Default SCK of VSPI (displays, SD card, LoRa).
55Default chip select (CS) of the VSPI bus.
1717TX2 — Serial2 transmit by default.
1616RX2 — Serial2 receive by default (the GPS guide uses it).
44ADC
00ADC. BOOT button, a strapping pin: leave it alone at boot; fine as an input afterwards.
22ADC. Strapping pin; on many boards it also drives the on-board LED.
1515ADC. Strapping pin; default CS of HSPI.
1313ADC. Default MOSI of HSPI.

AI-Thinker ESP32-CAM (16 pins)

Drawn with the camera connector at the top and the SD slot facing you. The camera is simulated: with this board, esp_camera_fb_get() gets frames from your computer's camera, degraded to the configured size and JPEG quality — see ESP32-CAM camera. Only ten GPIOs reach the header: the camera takes fifteen, all of them off-board. Of the ten, 2, 4, 12, 13, 14 and 15 are also the SD card's lines — wire a sensor there and the card stops working — and 4 drives the white flash LED. U0R and U0T are GPIO 3 and 1, the serial port you program the board through; VCC is the 3.3 V output of the on-board regulator.

The AI-Thinker ESP32-CAM (16 pins) as the lab draws it, with the labels of the silkscreen.
LabelGPIONotes
5V5Default chip select (CS) of the VSPI bus.
GNDGround. All GND pins are the same node.
IO1212ADC. Strapping pin: must be LOW at boot (the default MISO of HSPI).
IO1313ADC. Default MOSI of HSPI.
IO1515ADC. Strapping pin; default CS of HSPI.
IO1414ADC. Default SCK of HSPI.
IO22ADC. Strapping pin; on many boards it also drives the on-board LED.
IO44ADC
3V33RX0 — the serial monitor's receive line.
IO1616RX2 — Serial2 receive by default (the GPS guide uses it).
IO00ADC. BOOT button, a strapping pin: leave it alone at boot; fine as an input afterwards.
GNDGround. All GND pins are the same node.
VCC
U0R3RX0 — the serial monitor's receive line.
U0T1TX0 — the serial monitor's transmit line. Using it as a GPIO breaks Serial.
GNDGround. All GND pins are the same node.

WeMos D1 R32 (Uno form factor)

The two Uno headers become the two columns: on the left the power and analog header (RST, 3V3, 5V, GND, VIN, then A0–A5), on the right the digital one (SCL, SDA, AREF, GND, then D13 down to D0). Each label carries the GPIO and the Uno name (“26·D2”), because the board prints both. Two silkscreen errors on the real board: A2 is printed “IO36” but is GPIO 35, and A4 is printed “IO38” — a pin that does not exist — but is GPIO 36. The lab shows the real GPIO. The on-board LED is GPIO 2, which is also A0.

The WeMos D1 R32 (Uno form factor) as the lab draws it, with the labels of the silkscreen.
LabelGPIONotes
RSTChip enable: pulling it LOW holds the chip in reset.
3V33RX0 — the serial monitor's receive line.
5V5Default chip select (CS) of the VSPI bus.
GNDGround. All GND pins are the same node.
GNDGround. All GND pins are the same node.
VIN5 V input to the regulator (what the USB supplies). Never wire it to a GPIO.
2·A02ADC. Strapping pin; on many boards it also drives the on-board LED.
4·A14ADC
35·A235input only, no pull-up, ADC
34·A334input only, no pull-up, ADC
36·A436input only, no pull-up, ADC
39·A539input only, no pull-up, ADC
22·SCL22Default SCL: Wire.begin() with no arguments uses it.
21·SDA21Default SDA: Wire.begin() with no arguments uses it.
AREFNot connected.
GNDGround. All GND pins are the same node.
18·D1318Default SCK of VSPI (displays, SD card, LoRa).
19·D1219Default MISO of VSPI.
23·D1123Default MOSI of VSPI.
5·D105Default chip select (CS) of the VSPI bus.
13·D913ADC. Default MOSI of HSPI.
12·D812ADC. Strapping pin: must be LOW at boot (the default MISO of HSPI).
14·D714ADC. Default SCK of HSPI.
27·D627ADC
16·D516RX2 — Serial2 receive by default (the GPS guide uses it).
17·D417TX2 — Serial2 transmit by default.
25·D325ADC. Also a DAC output on the real chip (not simulated).
26·D226ADC. Also a DAC output on the real chip (not simulated).
1·TX1TX0 — the serial monitor's transmit line. Using it as a GPIO breaks Serial.
3·RX3RX0 — the serial monitor's receive line.

Adafruit HUZZAH32 Feather (28 pins)

The long side is the Feather standard: RST (the chip's reset), 3V from the regulator, A0–A5, then SPI (SCK 5, MO 18, MI 19), serial (RX 16, TX 17) and GPIO 21. The short side has BAT (the Li-Po, not modeled), EN (the regulator's enable, not the chip's) and USB (5 V from the connector — wiring it to a GPIO gets the red warning), then 13, 12, 27, 33, 15, 32, 14 and I²C on SCL 22 and SDA 23. The red LED is GPIO 13; A13 (GPIO 35) reads half the battery voltage.

The Adafruit HUZZAH32 Feather (28 pins) as the lab draws it, with the labels of the silkscreen.
LabelGPIONotes
RST
3V3RX0 — the serial monitor's receive line.
NCNot connected.
GNDGround. All GND pins are the same node.
A026ADC. Also a DAC output on the real chip (not simulated).
A125ADC. Also a DAC output on the real chip (not simulated).
A234input only, no pull-up, ADC
A339input only, no pull-up, ADC
A436input only, no pull-up, ADC
A54ADC
SCK5Default chip select (CS) of the VSPI bus.
MO18Default SCK of VSPI (displays, SD card, LoRa).
MI19Default MISO of VSPI.
RX16RX2 — Serial2 receive by default (the GPS guide uses it).
TX17TX2 — Serial2 transmit by default.
2121Default SDA: Wire.begin() with no arguments uses it.
BAT
ENChip enable: pulling it LOW holds the chip in reset.
USB
1313ADC. Default MOSI of HSPI.
1212ADC. Strapping pin: must be LOW at boot (the default MISO of HSPI).
2727ADC
3333ADC
1515ADC. Strapping pin; default CS of HSPI.
3232ADC
1414ADC. Default SCK of HSPI.
SCL22Default SCL: Wire.begin() with no arguments uses it.
SDA23Default MOSI of VSPI.

See also