Arduino & PlatformIO
Build systems and IDEs for hobby and pro embedded — Arduino IDE 2.x, PlatformIO, Arduino-CLI, Arduino Cores.
The "I plug in a board and press Upload" toolchains. Less ceremony than ESP-IDF and embedded RTOSes, with broad coverage across MCU platforms. For Rust see Embedded Rust; for Python see MicroPython & CircuitPython.
Arduino — the IDE and CLI
- ★ Arduino IDE 2.x — open source (AGPLv3); Eclipse-Theia-based rewrite of the classic IDE. Modern editor (Monaco-grade), serial monitor, debugger panel, board / library manager. The default for first-time MCU programmers in 2026.
- Arduino IDE 1.8.x — legacy; still works on older OSes, but 2.x is now the recommended path.
- ★ Arduino-CLI — official command-line
arduino-clifor compile / upload / library / board management. Open source. The headless / CI-friendly path; pairs with any editor. - Arduino Lab for MicroPython — Arduino-branded MicroPython editor; smaller scope.
- Arduino Cloud Editor — browser IDE; freemium, syncs to Arduino Cloud accounts. Closed source; convenient for ChromeOS / classroom.
- Arduino Cloud (IoT Cloud) — hosted IoT backend (devices, dashboards, OTA, things). Free tier exists; closed source.
Arduino Cores (board support packages)
Cores are what teach the Arduino toolchain about a chip. Most modern ones are open source.
- ★ arduino-esp32 (Espressif) — official ESP32 core; ships every variant (classic / S2 / S3 / C3 / C6 / H2 / P4). Built on top of ESP-IDF, so you get IDF features in Arduino sketches. Apache 2.0.
- ★ ESP8266 core for Arduino — community-maintained; still active, still works.
- arduino-pico (Earle Philhower) — ★ the de-facto third-party RP2040 / RP2350 Arduino core; broader and more mature than Arduino's official Mbed-based "Arduino Mbed OS RP2040" core.
- Arduino Mbed OS RP2040 / Nano boards core — Arduino's official Pico/Nano ESP32 core; uses Mbed OS underneath. Fine, but
arduino-picois generally preferred for hobby use. - Arduino-STM32 (rogerclarkmelbourne) — older STM32 core; mostly superseded by STM32duino (the official ST-blessed core) in 2026.
- STM32duino — official STM32 Arduino core; covers most STM32 lines.
- Adafruit nRF52 / SAMD cores — Adafruit's forks of the official cores with extra board defs.
- MegaCore / MightyCore / MiniCore (MCUdude) — community AVR cores adding chips not in the stock core.
- MegaTinyCore / DxCore — modern AVR (tinyAVR / Dx) cores.
PlatformIO
The "Arduino-CLI but better organized" choice. Cross-platform, multi-MCU, dependency-managed projects.
- ★ PlatformIO Core — open source (Apache 2.0); CLI / build system supporting 1300+ boards across ESP / STM32 / nRF / RP / AVR / SAMD / Renesas / RISC-V. Reads
platformio.ini. The professional default for non-trivial Arduino-style projects. - ★ PlatformIO IDE for VS Code — free VS Code extension; the standard way to use PlatformIO. Project explorer, debugger UI, library registry, library deps inspector. Works on any OS.
- PlatformIO IDE for CLion / Eclipse / Atom — older / less-maintained editor wrappers.
- PlatformIO Registry — built-in package registry for libraries, platforms, tools, frameworks.
- PlatformIO Remote (PIO Remote) — paid / commercial tier for remote build / upload.
- PlatformIO Labs — paid commercial offerings (Plus / Enterprise: more registry quotas, advanced static analyzer integrations).
What platformio.ini gets you over Arduino IDE:
- Real dependency pinning (
lib_deps = ottowinter/ESPAsyncWebServer-esphome @ ^3.1.0). - Multiple build environments in one project (
[env:esp32-s3],[env:esp32-c3]). - Build / upload / monitor speeds an order of magnitude faster than Arduino IDE.
- CI-friendly —
pio run,pio test,pio checkwork in headless GitHub Actions.
Project organization patterns
- Single sketch (Arduino IDE) —
MyProject.ino; fine for ≤200 lines. - PlatformIO project —
src/,include/,lib/,test/,platformio.ini. The right default once you have multiple files or libs. - ★ PlatformIO + git submodules / lib_deps from git — pin a library to a commit SHA for reproducible builds.
- One
platformio.inienv per board target — sharesrc/across an S3 build, a C3 build, and a release build with extra flags. extra_scriptshooks — run pre/post-build Python (compress assets, generate version headers, update partition tables).
Library managers
- ★ Arduino Library Manager (built into Arduino IDE / CLI) — curated registry; submit via PR to the Arduino library list.
- ★ PlatformIO Registry — superset of Arduino Library Manager + PlatformIO-native packages; resolves transitive deps.
- Manual install — drop a folder into
libraries/. Works, doesn't scale. - Git submodules — for things not in either registry, or when you want a specific commit.
Where Arduino fits vs. doesn't
Arduino is great for:
- First-day learning, education, fast prototyping.
- Glue-code projects with established libraries (sensors, displays, MQTT, OTA).
- ESP32 work where the IDF-under-the-hood is exposed via
#include <esp_*.h>from inside a sketch.
Arduino starts hurting when:
- You need fine-grained RTOS scheduling (use ESP-IDF or Zephyr).
- You're doing real DSP / fast IRQ work (drop to HAL/LL or use Embassy/Rust).
- Your build needs hermeticity and CI determinism (Bazel / Nix / a real RTOS build system).
- You're shipping millions of units and every byte of flash matters.
CI / CD for Arduino-style projects
- ★ PlatformIO + GitHub Actions —
pio runin CI; matrix-build across boards. The standard. - arduino/compile-sketches — official Arduino GH Action; compiles
.inosketches in CI. - Arduino lint (
arduino-lint) — official linter for libraries / boards / cores; pairs with submitting to the Library Manager registry. - PlatformIO Check (
pio check) — wraps Cppcheck / clang-tidy / PVS-Studio over your project.
Pick this if…
- First MCU project, no opinions yet: Arduino IDE 2.x.
- Default for any non-trivial Arduino-style project: PlatformIO + VS Code.
- CI / headless builds: Arduino-CLI or PlatformIO Core.
- You're on an ESP32 and want IDF features mostly through Arduino: arduino-esp32 (it's IDF underneath).
- You're on a Pi Pico:
arduino-pico(Earle's core) for Arduino feel; or pivot to MicroPython / Pico-SDK. - You hate
.inofiles: PlatformIO withsrc/main.cpp.