Tooling

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-cli for 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-pico is 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-friendlypio run, pio test, pio check work in headless GitHub Actions.

Project organization patterns

  • Single sketch (Arduino IDE)MyProject.ino; fine for ≤200 lines.
  • PlatformIO projectsrc/, 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.ini env per board target — share src/ across an S3 build, a C3 build, and a release build with extra flags.
  • extra_scripts hooks — 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 Actionspio run in CI; matrix-build across boards. The standard.
  • arduino/compile-sketches — official Arduino GH Action; compiles .ino sketches 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 .ino files: PlatformIO with src/main.cpp.

On this page