ESP32 pins to avoid: what to check in AI-generated wiring
Before you solder wiring that an AI assistant drew up, check every pin against these lists: strapping pins (classic ESP32: GPIO0, 2, 5, 12 and 15), flash pins (GPIO6 to 11), input-only pins (GPIO34 to 39), ADC2 pins read while Wi-Fi runs, pins taken by octal flash or PSRAM on ESP32-S3 boards (GPIO35 to 37), and on the Arduino Nano ESP32 whether the code means D-numbers or GPIO numbers. Then check that I2C has pull-ups and that no 5 V signal reaches a 3.3 V pin.
An assistant can mix up chip families (classic ESP32 and ESP32-S3 have different special pins) and board numbering (Arduino labels and GPIO numbers). The checks below catch wiring that works on the bench and fails later, or only at power-up.
The checklist
| Check | Classic ESP32 | ESP32-S3 | What goes wrong |
|---|---|---|---|
| Strapping pins | GPIO0, 2, 5, 12, 15 | GPIO0, 3, 45, 46 | Their level at reset selects the boot mode. A sensor or pull resistor on one can stop the board from booting. On the classic ESP32, GPIO12 high at reset switches the flash voltage to 1.8 V. |
| Flash pins | GPIO6 to 11 | GPIO35 to 37 on octal flash or PSRAM boards (for example the DevKitC-1 N16R8) | They talk to the flash or PSRAM. Using them crashes the board. |
| PSRAM pins | GPIO16 and 17 on some modules | See flash pins | Taken on boards with PSRAM. |
| Input only | GPIO34 to 39, no internal pull-ups | – | Cannot drive an LED or relay; a button needs an external pull-up. |
| ADC2 | Not usable while Wi-Fi runs | Not usable while Wi-Fi runs | Analog readings fail once Wi-Fi is on. Use ADC1 pins. |
| Serial | GPIO1 and 3 (TX, RX) | – | Shared with the USB serial console and flashing. |
| Native USB | – | GPIO19 and 20 on the DevKitC-1 | Wired to the board's second USB port. |
Arduino Nano ESP32: D-numbers are not GPIO numbers
The Nano ESP32 prints Arduino labels on the board. D2 is GPIO5, D5 is GPIO8, A4 is GPIO11. The Arduino IDE has two modes under Tools, Pin Numbering: "By Arduino pin (default)" and "By GPIO number (legacy)". Libraries such as OneWire, FastLED and ESP32Servo need GPIO numbering. ESPHome's board entry for the Nano ESP32 defines no D-pin names, so in YAML you write GPIO5 for D2. A sketch that says pin 2 while the wire sits on D2 is the typical mismatch; the full map is on the Nano ESP32 page.
I2C needs pull-ups
Espressif recommends external pull-ups of 2 to 5 kΩ on SDA and SCL, within a range of 1 to 10 kΩ and never below 1 kΩ. Some breakout modules carry their own; check the module before adding more. If an I2C probe returns ESP_ERR_TIMEOUT, check the pull-ups first.
No 5 V signals on ESP32 pins
The ESP32 runs at 3.3 V. Espressif's datasheet for the ESP32-WROOM-32E gives a maximum high input voltage of the supply plus 0.3 V, which is 3.6 V at 3.3 V supply, and Arduino states that the Nano ESP32's pins are 3.3 V only. A 5 V sensor output, a 5 V Arduino module or a 5 V LED strip data line needs a level translator.
No loads on GPIO pins
A GPIO pin drives a signal, not a load. The ESP32-WROOM-32E sources 40 mA and sinks 28 mA at most drive strength. Relays, motors and servos need a driver or module and their own supply; see ESP32 power over USB-C.
How to check a wiring list quickly
- Write the wiring as module pin to board pin, one line each.
- Name the exact board and module variant (for example ESP32-S3-DevKitC-1 N16R8, not "ESP32").
- Mark every pin that appears in the table above and move it, unless the board's documentation uses it that way on purpose.
- Check that the firmware uses the same numbering as the wiring list.
Let your agent check it
check_project does this check for you: it reads a GitHub repo or a KiCad, ESPHome or PlatformIO file, identifies the board and modules, and lists every used pin against that board's strapping, flash and input-only pins, plus the power envelope. Connect the Protoship MCP server once:
claude mcp add --transport http protoship https://mcp.protoship.dev codex mcp add protoship --url https://mcp.protoship.dev
An agent without MCP calls GET https://protoship.dev/api/check?url=… with the link to your repo or config file.
Questions
Which ESP32 pins should I avoid?
On a classic ESP32: strapping pins GPIO0, 2, 5, 12, 15, flash pins GPIO6 to 11, GPIO16 and 17 on modules with PSRAM, and GPIO34 to 39 for outputs. On an ESP32-S3: strapping pins GPIO0, 3, 45, 46 and GPIO35 to 37 on octal flash or PSRAM boards.
Why does my ESP32 not boot when my circuit is connected?
A part of the circuit pulls a strapping pin to the wrong level at reset. Move that connection to a pin that is not a strapping pin, or make sure the pin rests at its boot level.
Can I use analog pins while Wi-Fi is on?
Only ADC1 pins. ADC2 cannot be used while Wi-Fi runs, on the classic ESP32 and on the ESP32-S3.
Is the ESP32 5 V tolerant?
No. Espressif gives a maximum high input voltage of the supply plus 0.3 V for the ESP32-WROOM-32E. Use a level translator for 5 V signals.
Finish my build Let your agent check your project
Sources
Read on 4 November 2026.
- ESP-IDF: ESP32 GPIO reference
- Espressif: ESP32 schematic checklist
- Espressif: ESP32-S3 datasheet
- Espressif: ESP32-S3-DevKitC-1 v1.1 user guide
- Arduino: Nano ESP32 pin setup (pin numbering)
- Arduino: Nano ESP32 cheat sheet
- Arduino Nano ESP32 datasheet (ABX00083)
- ESPHome source: esp32/boards.py
- ESP-IDF: I2C driver
- Espressif: ESP32-WROOM-32E datasheet v2.1