Loading the figure…
Espressif's own ESP32 board: two cores, Wi-Fi and Bluetooth, 3.3 V logic.
Each lesson runs your own code on the board. Finish its checks to tick it off.
Build the board in the right order, then power it up and check it, as on the bench.
0 of 9 stepsStrip the board to its PCB. Every part on the DevKitC is surface-mount except the two 19-pin headers.
Each fault really happens in the simulation. Trigger one, watch the figure, then read why.
A breadboard-friendly board from Espressif. The ESP32-WROOM-32E module at the top holds a dual-core Xtensa LX6 chip at up to 240 MHz, 4 MB of flash and a 40 MHz crystal under a metal shield, with a printed antenna that hangs 6 mm over the edge so no copper sits under it. Below it are a micro-USB socket, a CP2102N USB-to-serial bridge, an AMS1117 3.3 V regulator, a red power LED and two buttons: EN resets the chip, Boot holds GPIO0 low. There is no user LED, so the lessons wire one to GPIO23. Every I/O pin is 3.3 V and none of them tolerate 5 V.
| Header | Pin | Name | Functions | Level | Max current | Notes |
|---|---|---|---|---|---|---|
| J2 | 1 | 3V3 | 3.3 V supply | 3.3 V | – | Regulator output. Draw a little current for sensors here, or feed 3.0 to 3.6 V in when nothing else powers the board. |
| J2 | 2 | EN | CHIP_PU, reset | 3.3 V | – | CHIP_PU. Pulled up by 10 kΩ with a 100 nF delay capacitor; pulling it low (or pressing EN) holds the chip in reset. |
| J2 | 3 | VP | GPIO36, ADC1_CH0, SENSOR_VP, Input only | 3.3 V | – | GPIO36, input only: no output driver and no internal pull-up or pull-down. ADC1, so it reads analog values even while Wi-Fi runs. |
| J2 | 4 | VN | GPIO39, ADC1_CH3, SENSOR_VN, Input only | 3.3 V | – | GPIO39, input only, no internal pulls. ADC1 channel 3. |
| J2 | 5 | 34 | GPIO34, ADC1_CH6, VDET_1, Input only | 3.3 V | – | Input only, no internal pulls: add your own resistor for a button. ADC1, the safe choice for a potentiometer or sensor when Wi-Fi is on. |
| J2 | 6 | 35 | GPIO35, ADC1_CH7, VDET_2, Input only | 3.3 V | – | Input only, no internal pulls: add your own resistor for a button. ADC1, the safe choice for a potentiometer or sensor when Wi-Fi is on. |
| J2 | 7 | 32 | GPIO32, ADC1_CH4, TOUCH9, XTAL_32K_P | 3.3 V | 40 mA | ADC1 and a touch channel; it can also take a 32 kHz watch crystal. A good general-purpose pin. |
| J2 | 8 | 33 | GPIO33, ADC1_CH5, TOUCH8, XTAL_32K_N | 3.3 V | 40 mA | ADC1 and a touch channel; it can also take a 32 kHz watch crystal. A good general-purpose pin. |
| J2 | 9 | 25 | GPIO25, ADC2_CH8, DAC_1 | 3.3 V | 40 mA | One of the two 8-bit DAC outputs (dacWrite gives 0 to about 3.3 V). Also ADC2, which stops working while Wi-Fi is on. |
| J2 | 10 | 26 | GPIO26, ADC2_CH9, DAC_2 | 3.3 V | 40 mA | One of the two 8-bit DAC outputs (dacWrite gives 0 to about 3.3 V). Also ADC2, which stops working while Wi-Fi is on. |
| J2 | 11 | 27 | GPIO27, ADC2_CH7, TOUCH7 | 3.3 V | 40 mA | ADC2 and a touch channel. analogRead() fails here once Wi-Fi is running; use an ADC1 pin (32 to 39) for analog input then. |
| J2 | 12 | 14 | GPIO14, ADC2_CH6, TOUCH6, MTMS | 3.3 V | 40 mA | JTAG TMS. It outputs a brief signal during boot (reported by secondary sources), so avoid it for things that must stay off at power-up. |
| J2 | 13 | 12 | GPIO12, ADC2_CH5, TOUCH5, MTDI, Strapping pin | 3.3 V | 40 mA | Strapping pin MTDI: it must be LOW at reset. Pulled high, it sets the flash supply to 1.8 V and the board boot-loops with "flash read err, 1000". Keep pull-ups and sensors that idle high off this pin. |
| J2 | 14 | GND | ground | – | – | |
| J2 | 15 | 13 | GPIO13, ADC2_CH4, TOUCH4, MTCK | 3.3 V | 40 mA | ADC2 and a touch channel. analogRead() fails here once Wi-Fi is running; use an ADC1 pin (32 to 39) for analog input then. |
| J2 | 16 | D2 | flash SD2 (GPIO9) on the older WROOM-32 | – | – | On the older WROOM-32 these were the SPI flash lines (GPIO6 to GPIO11). The WROOM-32E leaves them unconnected inside the module. Never use them; in code, touching GPIO6 to GPIO11 crashes the chip. |
| J2 | 17 | D3 | flash SD3 (GPIO10) on the older WROOM-32 | – | – | On the older WROOM-32 these were the SPI flash lines (GPIO6 to GPIO11). The WROOM-32E leaves them unconnected inside the module. Never use them; in code, touching GPIO6 to GPIO11 crashes the chip. |
| J2 | 18 | CMD | flash CMD (GPIO11) on the older WROOM-32 | – | – | On the older WROOM-32 these were the SPI flash lines (GPIO6 to GPIO11). The WROOM-32E leaves them unconnected inside the module. Never use them; in code, touching GPIO6 to GPIO11 crashes the chip. |
| J2 | 19 | 5V | 5 V supply (EXT_5V) | 5 V | – | The 5V rail: USB 5 V after the Schottky diode, or a 5 V input. No reverse-polarity protection and no fuse on this pin. |
| J3 | 1 | GND | ground | – | – | |
| J3 | 2 | 23 | GPIO23, VSPI MOSI | 3.3 V | 40 mA | VSPI MOSI and a plain output that is not a strapping pin, so it is the safe pin for the lessons' LED. |
| J3 | 3 | 22 | GPIO22, I2C SCL | 3.3 V | 40 mA | Arduino's default I²C SCL (and GPIO21 is SDA). Add 4.7 kΩ pull-ups to 3V3 if the module has none. |
| J3 | 4 | TX | GPIO1, U0TXD | 3.3 V | 40 mA | UART0, wired through a 0 Ω link to the USB bridge. The boot log and Serial print here at 115200 baud; leave TX and RX free if you want uploads and the serial monitor. |
| J3 | 5 | RX | GPIO3, U0RXD | 3.3 V | 40 mA | UART0, wired through a 0 Ω link to the USB bridge. The boot log and Serial print here at 115200 baud; leave TX and RX free if you want uploads and the serial monitor. |
| J3 | 6 | 21 | GPIO21, I2C SDA | 3.3 V | 40 mA | Arduino's default I²C SCL (and GPIO21 is SDA). Add 4.7 kΩ pull-ups to 3V3 if the module has none. |
| J3 | 7 | GND | ground | – | – | |
| J3 | 8 | 19 | GPIO19, VSPI MISO | 3.3 V | 40 mA | |
| J3 | 9 | 18 | GPIO18, VSPI SCK | 3.3 V | 40 mA | |
| J3 | 10 | 5 | GPIO5, VSPI SS, Strapping pin | 3.3 V | 40 mA | Strapping pin (SDIO timing), pulled up inside; it outputs a brief signal at boot. Fine as SPI chip-select. |
| J3 | 11 | 17 | GPIO17, U2TXD | 3.3 V | 20 mA | UART2 TX (GPIO16 is RX). These two pads sit on the flash supply domain and source about 20 mA, not 40. On WROVER boards they belong to the PSRAM. |
| J3 | 12 | 16 | GPIO16, U2RXD | 3.3 V | 20 mA | UART2 TX (GPIO16 is RX). These two pads sit on the flash supply domain and source about 20 mA, not 40. On WROVER boards they belong to the PSRAM. |
| J3 | 13 | 4 | GPIO4, ADC2_CH0, TOUCH0 | 3.3 V | 40 mA | Touch channel T0, used by the touch lesson. Also ADC2. |
| J3 | 14 | 0 | GPIO0, ADC2_CH1, TOUCH1, Boot, Strapping pin | 3.3 V | 40 mA | Strapping pin wired to the Boot button: LOW at reset starts the serial downloader instead of your sketch. After boot it works as an input with INPUT_PULLUP (pressed = LOW). |
| J3 | 15 | 2 | GPIO2, ADC2_CH2, TOUCH2, Strapping pin | 3.3 V | 40 mA | Strapping pin with an internal pull-down: it must be low or floating to enter download mode. An LED with its resistor to GND is harmless, a pull-up is not. |
| J3 | 16 | 15 | GPIO15, ADC2_CH3, TOUCH3, MTDO, Strapping pin | 3.3 V | 40 mA | Strapping pin MTDO, pulled up: held LOW at reset it silences the ROM boot log on TX. Also JTAG TDO. |
| J3 | 17 | D1 | flash SD1 (GPIO8) on the older WROOM-32 | – | – | On the older WROOM-32 these were the SPI flash lines (GPIO6 to GPIO11). The WROOM-32E leaves them unconnected inside the module. Never use them; in code, touching GPIO6 to GPIO11 crashes the chip. |
| J3 | 18 | D0 | flash SD0 (GPIO7) on the older WROOM-32 | – | – | On the older WROOM-32 these were the SPI flash lines (GPIO6 to GPIO11). The WROOM-32E leaves them unconnected inside the module. Never use them; in code, touching GPIO6 to GPIO11 crashes the chip. |
| J3 | 19 | CLK | flash CLK (GPIO6) on the older WROOM-32 | – | – | On the older WROOM-32 these were the SPI flash lines (GPIO6 to GPIO11). The WROOM-32E leaves them unconnected inside the module. Never use them; in code, touching GPIO6 to GPIO11 crashes the chip. |
Sensors and actuators this board drives, with the real connections.
Anode through 220 to 330 Ω to GPIO23, cathode to GND: about 4 to 6 mA from 3.3 V. Any non-strapping output pin works.
| Part pin | Board pin |
|---|---|
| A (through 220 Ω) | 23Wire colour orange |
| K | GNDWire colour black |
One side to GPIO4, the other to GND, with pinMode(4, INPUT_PULLUP); pressed reads LOW. On GPIO34 to 39 there is no internal pull-up, so add a 10 kΩ resistor to 3V3.
| Part pin | Board pin |
|---|---|
| 1 | 4Wire colour yellow |
| 3 | GNDWire colour black |
Ends to GND and 3V3, wiper to GPIO34. analogRead(34) gives 0 to 4095 and analogReadMilliVolts(34) gives millivolts; the reading bends near both ends.
| Part pin | Board pin |
|---|---|
| 1 | GNDWire colour black |
| 2 | 34Wire colour yellow |
| 3 | 3V3Wire colour red |
Feed the pot from 3V3, never 5V. Use an ADC1 pin (32 to 39): ADC2 pins stop reading once Wi-Fi starts.
+Vs to 3V3 (it runs from 2.7 V), Vout to GPIO35, GND to GND. Temperature is (mV − 500) ÷ 10 °C.
| Part pin | Board pin |
|---|---|
| +Vs | 3V3Wire colour red |
| Vout | 35Wire colour yellow |
| GND | GNDWire colour black |
VCC to 5V, Trig to GPIO18; the board's 3.3 V trigger is high enough for the sensor. Distance in cm is the echo time in µs ÷ 58.
| Part pin | Board pin |
|---|---|
| VCC | 5VWire colour red |
| Trig | 18Wire colour orange |
| Echo (through a 1 kΩ / 2 kΩ divider) | 19Wire colour green |
| Gnd | GNDWire colour black |
Echo is a 5 V output. Run it through a divider (1 kΩ from Echo, 2 kΩ to GND, the middle to GPIO19) so the pin sees about 3.3 V. Straight into a GPIO it drives current through the clamp diodes and can kill the pin.
Brown to GND, red to 5V, orange (signal) to GPIO13, driven with a servo library at 50 Hz, 500 to 2400 µs.
| Part pin | Board pin |
|---|---|
| brown | GNDWire colour brown |
| red | 5VWire colour red |
| orange | 13Wire colour orange |
A moving SG90 draws 100 to 250 mA and up to about 700 mA when stalled. From USB that browns out the board; give servos their own 5 V supply and join the grounds.
VCC to 3V3, GND to GND, SCL to GPIO22, SDA to GPIO21. Wire.begin() uses those pins by default; the address is 0x68.
| Part pin | Board pin |
|---|---|
| VCC | 3V3Wire colour red |
| GND | GNDWire colour black |
| SCL | 22Wire colour yellow |
| SDA | 21Wire colour blue |
GND, VCC (3V3), SCL to GPIO22, SDA to GPIO21. The display answers at 0x3C.
| Part pin | Board pin |
|---|---|
| GND | GNDWire colour black |
| VCC | 3V3Wire colour red |
| SCL | 22Wire colour yellow |
| SDA | 21Wire colour blue |
The pin order differs between makers (some put VCC first): read the labels on your module before you plug it in.