ELECTRONICS

PlatformIO: Arduino без Arduino IDE

PlatformIO — это не другая среда, а другой способ работы: проект живёт в обычной папке с текстовым файлом настроек, собирается из командной строки или из Visual Studio Code, а библиотеки и версии плат записаны в проекте и ставятся сами. Скетчи при этом те же самые, на том же C++ с теми же setup и loop.

Новичку она не нужна. Она нужна в тот момент, когда проект перерос один файл, когда плат стало две, когда захотелось нормального автодополнения или когда проект надо отдать другому человеку так, чтобы у него собралось с первого раза.

Чем отличается от Arduino IDE

Arduino IDEPlatformIO
Библиотеки ставятся в общую папку, версия одна на все проектыБиблиотеки записаны в проекте с версией, у каждого проекта свои
Плата выбирается в меню перед каждой загрузкойПлата записана в platformio.ini, можно несколько сразу
Редактор простой, автодополнение в 2.x есть, но слабоеПолноценный VS Code: переход к определению, подсказки, отладчик
Один файл .ino, остальные подключаются неявноОбычный проект C++: src, include, lib, каждый файл явно
Ставится за пять минут, работает сразуПервая установка качает гигабайт инструментов
Всё в одном окне, кнопка загрузкиКнопки те же, но внизу окна, плюс терминал

Установка

PlatformIO ставится как расширение в Visual Studio Code. Отдельного «PlatformIO IDE» для скачивания нет — то, что называется этим словом, и есть VS Code с расширением.

  1. 1

    Поставьте Visual Studio Code

    Бесплатный редактор от Microsoft, скачивается с code.visualstudio.com. Не путать с Visual Studio без слова Code — это другая, тяжёлая программа.

  2. 2

    Поставьте расширение PlatformIO IDE

    Слева панель расширений, в поиске PlatformIO IDE, кнопка Install. Дальше ждите: расширение скачает Python и свои инструменты, это занимает от пяти до пятнадцати минут. В левой панели появится значок муравья.

  3. 3

    Создайте проект

    Значок муравья → PIO Home → New Project. Имя, плата из списка (Arduino Uno, ESP32 Dev Module и так далее), фреймворк Arduino. PlatformIO скачает компилятор для этой платы — тоже не быстро, но только в первый раз.

  4. 4

    Напишите код в src/main.cpp

    Единственное отличие от скетча — строка #include <Arduino.h> в начале. Arduino IDE добавляла её сама, здесь это делаете вы.

  5. 5

    Соберите и залейте

    Внизу окна: галочка — собрать, стрелка — залить, вилка — монитор порта. Порт находится сам; если их несколько, укажите upload_port в настройках.

// src/main.cpp — тот же скетч, только с одной строкой сверху
#include <Arduino.h>

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
}

platformio.ini — сердце проекта

Всё, что в Arduino IDE выбиралось через меню, здесь записано в одном текстовом файле в корне проекта. Минимум для UNO — пять строк:

; platformio.ini — вся настройка проекта в одном файле
[env:uno]
platform = atmelavr
board = uno
framework = arduino
monitor_speed = 9600

Для ESP32 добавляются скорость загрузки и библиотеки. Строка lib_deps — главная причина переходить: библиотеки с версиями скачаются сами на любом компьютере, куда попадёт проект.

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_speed = 921600

; библиотеки скачаются сами при первой сборке
lib_deps =
    adafruit/DHT sensor library@^1.4.6
    adafruit/Adafruit SSD1306@^2.5.9

Секций [env:…] может быть несколько: один проект собирается и для UNO, и для ESP32, а выбирается нужная внизу окна. Имена библиотек для lib_deps берутся из реестра registry.platformio.org — там же, где их ищет кнопка Libraries в PIO Home.

Когда переходить, а когда нет

Оставайтесь в Arduino IDE, если проект — один файл, плата одна, а уроки, по которым вы идёте, показывают скриншоты этой среды. Переход добавит настройки, но не добавит результата.

Переходите, когда код перевалил за несколько сотен строк и хочется разбить его по файлам; когда одна библиотека нужна в старой версии, а другая в новой; когда проект в git и его собирают на разных компьютерах; когда надоело искать, какой из пяти открытых скетчей сейчас настоящий.

Обратно вернуться можно всегда: код тот же. Переименуйте main.cpp в .ino, уберите строку с Arduino.h — и Arduino IDE его откроет.

На чём попадаются

Установка висит на «Installing PlatformIO Core»

Чаще всего антивирус или брандмауэр режут скачивание, либо путь к профилю пользователя содержит кириллицу — PlatformIO ставит свои инструменты в папку.platformio в домашней директории, и русские буквы в пути ломают Python. Помогает переменная PLATFORMIO_CORE_DIR с путём без кириллицы.

Функция не объявлена, хотя в Arduino IDE работало

Arduino IDE незаметно генерировала объявления функций, чтобы их можно было вызывать раньше, чем они написаны. PlatformIO этого не делает: либо объявите функцию сверху, либо перенесите её выше места вызова.

Не видит библиотеку из Arduino IDE

И не должен: у PlatformIO свои библиотеки внутри проекта. Добавьте нужную в lib_deps или положите папкой в lib/. Как устроены библиотеки вообще — отдельная страница.

Монитор порта показывает мусор

monitor_speed в ini не совпадает со скоростью в Serial.begin. По умолчанию монитор открывается на 9600, а ESP32 обычно работают на 115200.

Что дальше