GPIO 0 was held low at reset, so the chip waits for a firmware download instead of running your sketch. Release it, or use the BOOT and EN buttons in the right order.
What the message means
At reset the ESP32 reads GPIO 0. Low means download mode; high means run the stored program. A module, jumper or button holding the pin low keeps it in download mode.
Fix it in this order
- Unplug anything connected to GPIO 0 and press EN (reset).
- If uploading fails to connect, hold BOOT, tap EN, then release BOOT when the upload says Connecting.
- After a successful upload, press EN once to start the program.
- Remove jumpers that tie GPIO 0 to ground on ESP32-CAM boards after flashing.
- Check the other boot pins too: GPIO 2, 12 and 15 should not be forced by wiring at reset.
Why it happens
The message “waiting for download” means GPIO 0 was held low at reset, so the chip started its serial bootloader instead of your sketch. Something connected to GPIO 0, or a jumper left in place, causes it.
Disconnect whatever pulls GPIO 0 low, then press the EN (reset) button. On an ESP32-CAM, remove the GPIO 0 to GND jumper after uploading and reset the board.
If you see this, do this
| You see | Do this |
|---|---|
| It runs after you unplug a wire | That wire was pulling GPIO 0 low. |
| Upload fails to connect | See the failed to connect page. |
Related
ESP32 failed to connect, invalid header.
Last reviewed: November 2026. These are the usual causes and the order that finds them fastest. Test on your own board; clones and cables differ.