These are not three competing chips or languages. Two are frameworks (the APIs your code calls) and one is tooling (how you build and flash):
| Arduino core for ESP32 | ESP-IDF | PlatformIO | |
|---|---|---|---|
| What it is | Arduino APIs (setup(), loop(), WiFi, Preferences, ...) on ESP32 |
Espressif's official framework (FreeRTOS, CMake, menuconfig) |
build system / IDE plugin; builds Arduino or ESP-IDF projects |
| Strength | quick start, huge library ecosystem | every option configurable, newest features, full control | reproducible builds, dependency management, CI-friendly |
| Weak spot | many options fixed by the prebuilt core | steeper learning curve, more boilerplate | adds a layer; its package versions can lag behind Espressif's |
Rules of thumb
- Prototype, maker project, lots of Arduino libraries needed → Arduino core (Arduino IDE or PlatformIO).
- Product firmware, security features (secure boot, flash encryption), fine control of Wi-Fi/BLE/power, or a setting you can only change in menuconfig → ESP-IDF.
- You want both → run Arduino as an ESP-IDF component: you keep Arduino libraries and APIs, gain
menuconfig, and can mixsetup()/loop()with nativeapp_main()code. Espressif describes this route as intended for advanced users; you need the ESP-IDF toolchain in the version the Arduino core release expects. - Team, CI, pinned dependencies → PlatformIO, with
framework = arduinoorframework = espidfinplatformio.ini.
Check chip support first
The Arduino core documents which SoCs it supports (ESP32, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6, ESP32-H2 and more; some newer chips need the ESP-IDF component route). Check the current list before choosing a chip for an Arduino-based product.
Practical tips
- Pin versions: record the Arduino core (or ESP-IDF) version your firmware was tested with. APIs changed between major versions of the Arduino core.
- Partition tables are set per framework: Arduino IDE via Tools → Partition Scheme, PlatformIO via
board_build.partitions, ESP-IDF viamenuconfig.