Поливалка на Uno доросла до четырёх вкладок в Arduino IDE: автомат, датчики, шторки, меню. Каждая правка — полная пересборка, каждый новый датчик — охота в менеджере библиотек за той самой версией, что стояла на старом ноутбуке: автор её давно обновил и переименовал половину функций. Вечер уходил не на код, а на чинение окружения, а второй компьютер собирать проект отказался наотрез. В тот момент у меня впервые мелькнула мысль, которую произносят все, кто пересел на PlatformIO: может, я пишу код не в том месте.
Прежде чем сносить всё — холодный расчёт. Ниже: что PlatformIO такое на самом деле, сколько стоит вход, что ломается при переезде скетча, и по каким признакам переходить действительно пора. А по каким — ещё рано: у IDE 2 есть сильные стороны, и они проявляются ровно в той зоне, где живут первые месяцы любого ардуинщика.
Для спокойствия: среда 2.x и PlatformIO живут на одном компьютере без конфликтов — скетчбук общий, библиотеки у каждой свои, порт освобождается, когда закрываешь монитор. Я первую неделю пробегал один и тот же скетч в обеих средах и смотрел, где быстрее дохожу до результата. Такой личный тест лучше сотни статей: половина хвалебных постов про конструктор написана людьми, которым нужен был именно VS Code, а не микроконтроллер; вторая половина — наоборот.
Что такое PlatformIO: плагин к VS Code с ini-файлом
PlatformIO — не среда с нуля, а конструктор сборки, живущий внутри VS Code плагином. Он превращает обычную папку с кодом в проект прошивки, а проект описывает текстовый файл platformio.ini: три строчки задают плату и фреймворк, дальше — версия каждой библиотеки. Меню «Инструменты → Плата» исчезает: плата, скорость монитора порта, список зависимостей — всё в тексте, и этот текст едет в git вместе с кодом. Структура папок строгая: src — код, lib — свои библиотеки, .pio — служебный кэш сборки, о нём отдельно ниже.
Цена входа — первый запуск: конструктор качает тулчейн под выбранную плату, для AVR это несколько сотен мегабайт, на скромном канале — четверть часа ожидания. Дальше сборки кэшируются: пересобирается то, что изменилось. На замерах, которые гуляют по форумам, PlatformIO обгоняет IDE 2, когда в проекте файлов за полсотни; на одиночной мигалке разницы вы не заметите, а первая компиляция пустого скетча в IDE 2 и вовсе проходит быстрее — ей не нужно прогонять конвейер с графом зависимостей.
[env:uno]platform = atmelavrboard = unoframework = arduinomonitor_speed = 9600lib_deps = adafruit/DHT sensor library@1.4.4 [env:debug]platform = atmelavrboard = unoframework = arduinobuild_flags = -DDEBUG ; тот же код, но с отладочным флагомБиблиотеки — главная причина, по которой люди переезжают. В IDE 2 мы ставили их кликами в менеджере библиотек, и версии жили своей жизнью: на ноутбуке 1.4.4, дома свежая 2.0 с переписанным API. В PlatformIO зависимости перечислены в ini вместе с номером версии — adafruit/DHT sensor library@1.4.4 — и первый же запуск на новой машине ставит ровно их. Код из git собирается одинаково на работе и дома; это и есть лечение синдрома «у меня работало», о котором мы ещё вспомним в уроке про бэкап проектов.
Мелочи быта тоже меняются, но терпимо. Скорость Serial-монитора — строчка monitor_speed в ini, а не выпадающий список; полный лог компиляции — в панели терминала VS Code всегда, отдельно его включать не нужно, читается он так же, как подробный вывод, который мы включали в настройках IDE. Загрузка и монитор — кнопки внизу окна, к ним привыкаешь за пять минут. Урок про чтение лога компиляции остаётся при вас: текст ошибок тот же gcc, просто в другом месте.
Сам переезд скучнее, чем звучит. Содержимое скетча копируется в src/main.cpp, сверху добавляется #include <Arduino.h> — обычный cpp-файл не знает про byte, Serial и pinMode, без этой строчки компилятор споткнётся на первой же строке. Дальше ловушка, на которой я потерял час: файл .ino перед сборкой пропускает препроцессор Arduino IDE, который дописывает прототипы функций за вас. Обычный C++ этого не делает: если toggleLamp() определена ниже места вызова, сборка ответит function not declared in this scope — хотя в IDE 2 тот же текст собирался молча.
Вторая ловушка — вкладки. Четыре вкладки IDE переезжают не автоматически: их содержимое становится отдельными .cpp и .h файлами в src, а библиотеки из менеджера — строчками lib_deps в ini. Мы разбивали скетч по папкам ещё в уроке про структуру скетчбука — здесь та же работа, только папки жёстче: src/main.cpp точка входа, остальное рядом. Через пару вечеров такой порядок начинает нравиться: файл виден в панели целиком, а не одной вкладкой из шести.
| Критерий | Arduino IDE 2 | PlatformIO |
|---|---|---|
| Первый старт | установка за пять минут, плата из меню | тулчейн качается при первой сборке: десятки минут на медленном канале |
| Одиночный скетч | пересборка целиком за секунды | чуть дольше: конвейер запускается даже для одного файла |
| Проект на десятки файлов | пересобирает всё каждый раз | кэш пересобирает изменённое — заметно быстрее |
| Библиотеки | менеджер кликами, версии живут своей жизнью | версии зафиксированы в ini: одна сборка на любой машине |
| Несколько плат в проекте | каждая — отдельная копия скетча | один проект, несколько env в ini |
| Порог входа | минимальный: открыл и работаешь | VS Code, ini, привычные кнопки в других местах |
Так переходить или нет: границы мнения
Мой расклад после года на двух средах. Уроки и проверка гипотезы «горит или нет» — IDE 2: открыл, поправил, залил, ничего лишнего. Поливалка с её четырьмя файлами, ESP32 рядом с Uno и парой библиотек с жёсткими версиями — PlatformIO, и второй ноутбук собирает её без единого ручного действия. Официальная документация PIO отвечает на вопрос «что выбрать» примерно так же: для простого короткого проекта — Arduino IDE, для более серьёзного — конструктор; я с этим живу и спорить не собираюсь.
Переходить «потому что профи так делают» не стоит: платой будет порог входа, а выигрыша на одном файле вы не увидите. Реальные триггеры другие: проект перерос один файл, появилась вторая плата, вы ловите расхождения версий библиотек между машинами или готовите проект к публикации — репозиторий с ini переезжает между людьми без инструкции «а теперь поставьте вот эту библиотеку с такой-то версией». Пока ничего из этого не случилось, IDE 2 остаётся лучшим другом — то, с чего мы начинали в уроке про её установку.
Про скорость — пара честных чисел. Пустой скетч на Uno в IDE 2 после прогрева компилируется за десяток секунд; в PIO тот же файл — сопоставимо, разбежка в считанные секунды туда-сюда. Разрыв появляется на зрелом проекте: правка одной константы в поливалке из четырёх файлов — в PIO секунды, потому что пересобирается один модуль; IDE 2 честно перекомпилирует весь лист. Чем крупнее проект, тем сильнее это чувствуется: на двадцати файлах ожидание уже видно по песочным часам, и кэш конструктора перестаёт быть фетишем — становится необходимостью.
- 1. С чего начинается новый проект в PlatformIO?
- 2. Скетч из IDE 2 скопировали в src/main.cpp без правок, а функция toggleLamp() определена ниже вызова. Что будет при сборке?
- 3. Когда PlatformIO реально обгоняет Arduino IDE 2 по времени сборки?
- 4. Что перечисляют в lib_deps файла platformio.ini?
- 5. Сборка после переезда упала, хотя в IDE 2 всё работало. Где теперь читать подробности?
- PlatformIO — конструктор сборки внутри VS Code: плата, фреймворк и версии библиотек описаны в platformio.ini и едут в git вместе с кодом
- Первый запуск качает тулчейн — минуты на скромном канале; дальше кэш, и обгон IDE 2 проявляется на проектах с десятками файлов
- Переезд: код в src/main.cpp, сверху #include <Arduino.h>, прототипы функций — препроцессор .ino за вас их больше не допишет
- lib_deps фиксирует версии библиотек: проект собирается одинаково на любой машине — кончина синдрома «у меня работало»
- Граница здравого смысла: один файл и одна плата — сидите в IDE 2; второй проект, вторая плата, фикс-версии — переходите
Частые вопросы по теме урока
- С чего начинается новый проект в PlatformIO?
- Проект PIO описывает ini-файл: env, platform, board, framework, список lib_deps. Драйверы тут ни при чём — это забота системы, а не конструктора сборки. С platformio.ini, где описаны плата, фреймворк и библиотеки
- Скетч из IDE 2 скопировали в src/main.cpp без правок, а функция toggleLamp() определена ниже вызова. Что будет при сборке?
- Прототипы генерировал препроцессор Arduino IDE, и только для .ino. В main.cpp это обычный C++: нужен прототип над setup() или перенос функции выше вызова. Компилятор ответит function not declared in this scope
- Когда PlatformIO реально обгоняет Arduino IDE 2 по времени сборки?
- Кэш сборки выигрывает на зрелых проектах: файлов много, меняется один. Одиночная мигалка в IDE 2 собирается не хуже, а первый запуск PIO и вовсе длинный — качает тулчейн. На больших проектах с десятками файлов, где кэш пересобирает только изменённое
- Что перечисляют в lib_deps файла platformio.ini?
- lib_deps — зависимости с номерами версий: adafruit/DHT sensor library@1.4.4. Новая машина получает ровно те же библиотеки — это главный аргумент переезда. Библиотеки с версиями — они приедут сами при первой сборке
- Сборка после переезда упала, хотя в IDE 2 всё работало. Где теперь читать подробности?
- PIO собирает в терминале VS Code и туда же пишет весь вывод. Читается как подробный лог компиляции из IDE 2 — навык из урока про чтение ошибок переносится один в один. В панели терминала VS Code — PIO пишет туда полный лог