Protoship Finish my build

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

CheckClassic ESP32ESP32-S3What goes wrong
Strapping pinsGPIO0, 2, 5, 12, 15GPIO0, 3, 45, 46Their 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 pinsGPIO6 to 11GPIO35 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 pinsGPIO16 and 17 on some modulesSee flash pinsTaken on boards with PSRAM.
Input onlyGPIO34 to 39, no internal pull-ups–Cannot drive an LED or relay; a button needs an external pull-up.
ADC2Not usable while Wi-Fi runsNot usable while Wi-Fi runsAnalog readings fail once Wi-Fi is on. Use ADC1 pins.
SerialGPIO1 and 3 (TX, RX)–Shared with the USB serial console and flashing.
Native USB–GPIO19 and 20 on the DevKitC-1Wired 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

  1. Write the wiring as module pin to board pin, one line each.
  2. Name the exact board and module variant (for example ESP32-S3-DevKitC-1 N16R8, not "ESP32").
  3. Mark every pin that appears in the table above and move it, unless the board's documentation uses it that way on purpose.
  4. 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.