Перед работой с VS Code + PlatformIO рекомендуется освоить стандартную Arduino IDE: понимать что такое компиляция, загрузка, выбор COM порта для загрузки, выбор платы и так далее
VS Code #
Самым мощным, современным, удобным и универсальным редактором кода для продвинутого пользователя является Visual Studio Code (VS Code). Это максимально навороченный "блокнот":
Фишки VS Code
- Из коробки поддерживает почти все существующие языки программирования и имеет подсветку синтаксиса для них
- Автоформатирование, которое гибко настраивается почти для любого языка
- IntelliSence - очень удобное автодополнение кода со встроенной документацией
- Разворачивание макросов и constexpr функций во всплывающем окошке без компиляции программы
- Подсветка явных ошибок в коде без компиляции проекта
- Большое количество горячих клавиш и инструментов для редактирования текста
- Удобный визуальный навигатор по коду и дерево структуры проекта
- Удобный файловый менеджер проекта и поиск по файлам
- Удобные вкладки открытых файлов, возможность разделить экран
- Умеет "переходить по клику" к определению функций и других сущностей даже в системных библиотеках
- Система расширений (плагинов), которые расширяют его возможности почти до бесконечности
- Очень лёгкий и быстрый сам по себе как программа, запускается за полсекунды
- Отлично выглядит на стандартной теме "тёмная современная"
- Работает с Git для совместной разработки
- Отладка (для некоторых платформ)
- Поддерживает работу с разными консолями и терминалами
- Имеет неприлично огромное и пугающее количество настроек
- В нём крайне приятно писать код, это нечто невероятное после Arduino IDE
В VS Code можно писать код почти на любом языке, сразу запускать и отлаживать его, использовать современные инструменты и фреймворки. Из личного опыта: C++, Arduino, Python, Node JS, HTML/CSS/JS, Flutter, PHP. Это буквально одна программа для всего, что может понадобиться разработчику.
Установка #
Качается с официального сайта, ставится "в три клика": согласен, далее, далее, завершить.
VS CodeПри установке нужно поставить вот эти галочки. Как минимум - нижнюю:
PlatformIO IDE #
PlatformIO (PIO) - сам по себе это набор консольных утилит, скриптов и сценариев для автоматической установки всего необходимого для работы с различными микроконтроллерами (SDK, компиляторы, загружаторы и т.д.). А также это огромная база различных платформ и фреймворков (помимо Arduino), поддержка более 1500 отладочных плат и МК и более 13000 библиотек! Со всеми "Ардуинами" оно тоже конечно замечательно работает. PlatformIO может использоваться разными способами, но раз уж мы заговорили о VS Code - будем использовать в паре с ним.
Преимущества и недостатки
Вот преимущества такой связки перед Arduino IDE:- Быстрая компиляция проекта: PlatformIO собирает проект немного иначе, за счёт чего получается огромный прирост в скорости компиляции. Если на AVR Arduino это заметно не так сильно, то ESP32 например в Arduino IDE может компилироваться секунд 20 на мощном компьютере (на слабом может делать это несколько минут!), а в PlatformIO на этот же проект уходит 3-4 секунды! Жизнь слишком коротка, чтобы компилировать под ESP8266/ESP32 в Arduino IDE...
- База платформ и фреймворков: больше не нужно искать какие-то "ссылки для менеджера плат", всё есть из коробки для всех плат
- Личная папка библиотек у каждого проекта: в Arduino IDE есть одна общая папка с библиотеками, из-за чего иногда случаются конфликты. Здесь библиотеки устанавливаются в папку проекта, можно указать конкретную версию - они не будут пересекаться с другими проектами
- Индивидуальная настройка проекта: проект можно полностью настроить под плату или несколько плат и фреймворков, указать конкретные версии платформ, указать список библиотек и их версий. Эти настройки хранятся в папке с проектом, а не являются общими, как в Arduino IDE. Можно просто открыть папку проекта на другом компьютере и среда автоматически всё скачает, настроит и подготовит: достаточно будет нажать одну кнопку для загрузки прошивки. Ещё раз - все библиотеки и пакеты для поддержки плат скачаются автоматически, не нужно вообще ничего дополнительно делать!
- Библиотеки можно ставить как из базы библиотек, так и напрямую с GitHub разработчика
- Настройки платы ничем не ограничиваются, можно менять любые фьюзы и низкоуровневые конфиги, включая флаги и параметры компилятора
- Exception decoder прямо в консоли монитора порта для ESP8266 и ESP32
Недостатки:
- Все настройки проекта задаются в текстовом конфиге, параметры и формат записи настроек нужно искать в документации. Она не очень дружелюбная, поэтому иногда приходится просто гуглить
- Монитор порта очень бедный, корявый, иногда работает некорректно - с багами и сбоями. Часто приходится пользоваться внешним, например из Arduino IDE
- Нет встроенного плоттера для графиков, но есть плагин от сообщества. Я пользуюсь плоттером из Arduino IDE
- Очень мелкие кнопки загрузки/компиляции, но проблема +- решаемая
- Другие требования к структуре программы - нужно писать по-взрослому с соблюдением норм и правил языка, а не как "скетчи" в Arduino IDE
- Проект, который работал в Arduino IDE, может не собраться в PlatformIO - придётся переписывать и нормально разбивать его на файлы. Но это сложно считать минусом - нужно сразу учиться писать по-человечески
- Случаются баги и тормоза у самой PlatformIO, благо на моём опыте все они лечатся перезапуском VS Code. Например, выбран для загрузки порт COM3, а IDE упрямо пытается загрузить через COM12 и удивляется, что устройство недоступно
- Постоянные сбои и глюки при переключении окружения
Установка #
Достаточно открыть вкладку расширений в VS Code, найти в поиске PlatformIO и нажать Install:
В процессе установки могут появляться всплывающие окна с предложением установить дополнительные расширения для работы - соглашаемся. В конце установки может попросить перезагрузиться - соглашаемся. Далее открываем вкладку PlatformIO и установка продолжится:
Готово! Можно установить поддержку русского языка - так же в виде расширения, и перезагружаемся:
Добро пожаловать на главную страницу PlatformIO IDE! Отсюда можно создать проект, посмотреть список платформ и библиотек. Я вообще ей не пользуюсь, поэтому снимаю галочку "показывать при запуске" и прощаюсь:
Git #
Для использования библиотек с GitHub (если вам это нужно) нужно установить Git, установка проходит без каких-то особенностей.
Настройки #
Лично мне комфортнее работать с такими параметрами шрифта: размер 15
, масштаб 1
. Масштаб в данном случае увеличивает всю программу, делает кнопочки чуть больше:
Параметры автоформатирования кода предпочитаю такие: ищем в настройках C_Cpp.clang_format_fallbackStyle
, вставляем туда { BasedOnStyle: Google, IndentWidth: 4, ColumnLimit: 0, AllowShortIfStatementsOnASingleLine: AllIfsAndElse, AllowShortCaseLabelsOnASingleLine: true }
Далее можно включить автосохранение файлов на afterDelay:
Последний опциональный штрих - установить расширение PlatformIO Big Buttons, оно позволит не целиться по микрокнопкам при загрузке проекта. Кнопки конечно великоваты, но тут либо совсем мелкие, либо вот такие =)
Ну вроде бы и всё!
PIO имеет отдельный блок настроек для VS Code, подробнее - в документации
Проект из Интернета #
Для того, чтобы открыть чужой проект из Интернета, достаточно перетащить в окно VS Code папку, содержащую platformio.ini
- всё остальное IDE сделает сама! Нужные пакеты и утилиты для поддержки плат, SDK и фреймворки скачаются и установятся глобально в папку PlatformIO, библиотеки же скачаются в папку проекта в .pio
. Для выбора порта, загрузки или компиляции программы используем кнопки в окне IDE:
Работа с PIO #
Создание проекта #
Я не использую встроенные менюшки PIO с менеджером проектов, библиотеками и платформами. Они есть, они работают, но у меня всё настроено и оно вообще не надо. Так то можно нажать New Project, выбрать плату и вам создадут папку проекта с 15 папками внутри.
Для меня проект - это папка в рабочей папке с проектами. Есть "шаблонная" папка проекта, я её дублирую, переношу в окно VS Code - и пошла жара. Если надо добавить новую плату - открываю список плат, там сразу даётся пример что нужно писать в конфиге. Так что создаём пустую папку и переносим её в окно VS Code:
Далее в этой папке нужно создать файл platformio.ini
, папку src
и в ней файл main.cpp
. Этого достаточно:
Проекты #
При запуске VS Code выдаётся список последних открытых папок (проектов). Чтобы посмотреть все - нажимаем "Подробнее". Папки можно удалять из списка крестиком справа от названия:
platformio.ini #
В этом файле прописываются все настройки проекта: платформа, плата, фреймворк, настройки конкретной платы, список библиотек и так далее. Файл позволяет создать в одном проекте несколько "рабочих сред" - окружений (environment, env). Каждое окружение - это конкретная плата со своими настройками, таким образом можно одновременно разрабатывать проект под несколько разных плат и быстро переключаться между ними.
Настройки окружения прописываются после тега [env:имя_окружения]
, а просто [env]
задаёт общие настройки для всех окружений. Например так - общая скорость монитора для всех, фреймворк - Ардуино, список библиотек. Далее идут конкретные платы со своими настройками:
[env]
framework = arduino
monitor_speed = 115200
lib_deps = ; список библиотек
[env:nano328new]
platform = atmelavr
board = nanoatmega328new
[env:nano328]
platform = atmelavr
board = nanoatmega328
Теперь кликаем по вкладке PlatformIO слева, чтобы оно запустилось, и получаем переключатель плат в нижнем меню:
Прикладываю конфиг для списка плат, которые использую (Arduino NANO, Wemos Mini, ESP32dev, ESP32 cam, ESP32-C3, ESP32-S2):
platformio.ini
[env]
framework = arduino
monitor_speed = 115200
lib_deps =
; lib
; lib
; lib
[env:nano328new]
platform = atmelavr
board = nanoatmega328new
[env:nano328]
platform = atmelavr
board = nanoatmega328
[env:d1_mini]
platform = espressif8266
board = d1_mini
upload_speed = 921600
monitor_filters = esp8266_exception_decoder, default
build_type = debug
board_build.filesystem = littlefs
[env:esp32dev]
platform = espressif32
board = esp32dev
monitor_filters = esp32_exception_decoder
board_build.filesystem = littlefs
board_build.f_cpu = 240000000L
[env:esp32cam]
platform = espressif32
board = esp32cam
upload_speed = 921600
board_build.mcu = esp32
board_build.f_cpu = 240000000L
[env:esp32-c3]
platform = espressif32
board = esp32dev
upload_speed = 921600
board_build.mcu = esp32c3
board_build.f_cpu = 80000000L
[env:esp32-s2]
platform = espressif32
board = lolin_s2_mini
upload_speed = 921600
В файле программы main.cpp
пишем минимальный код:
#include <Arduino.h>
void setup() {
}
void loop() {
}
Всё! Теперь можно выбрать нужную плату и скомпилировать или загрузить проект. PIO сама скачает и установит все нужные утилиты и поддержку платы в систему:
Прикладываю свой шаблон проекта, его можно скачать, распаковать и перетащить в окно VS Code.
Шаблон проектаУдаление платформ #
Ненужные платформы или их конкретные версии можно удалить с вкладки Platforms на главном экране PlatformIO:
PIO может кешировать всякое: иногда выполняйте в терминале команду pio system prune
- очистить лишние и временные данные, их может накопиться несколько ГБ!
Установка библиотек #
Библиотеки можно искать и устанавливать через встроенный менеджер библиотек, что с одной стороны удобно, а с другой - не очень: приходится вручную выбирать проект из списка, также библиотека будет добавлена во все окружения отдельно. "Установка" библиотеки заключается в том, что PIO модифицирует файл platformio.ini
и добавляет туда строчку:
Я ставлю библиотеки "вручную" - сам указываю, что мне нужно и где. PIO поддерживает несколько вариантов установки библиотек, точнее - зависимостей (library dependency, lib dep):
lib_deps =
fastled/FastLED ; библиотека из реестра PIO
GyverLibs/EncButton@^3.6.2 ; с версией
https://github.com/GyverLibs/GyverSegment.git ; из репозитория
https://github.com/GyverLibs/FastBot.git#2.22 ; с версией
https://github.com/GyverLibs/BitPack/archive/refs/heads/main.zip ; из архива
99% библиотек хранятся на GitHub и поиск в гугле любой библиотеки обычно первым делом отправляет на её GitHub. Поэтому почти со 100% вероятностью они имеются в реестре библиотек PIO и можно добавлять библиотеку в список lib_deps
по её расположению на гите:
Библиотеки автоматически загружаются в папку .pio/libdeps/<env>
- отдельно для каждого окружения:
Таким образом всегда можно открыть библиотеку, её папку с примерами, описание или документацию - всё под рукой:
Если библиотека требует установки других библиотек для своей работы - они установятся автоматически. Например моя библиотека GyverLibs/Settings
тянет за собой кучу зависимостей, они все сами скачиваются:
Папку .pio
можно безопасно удалять - IDE скачает заново всё, что ей нужно. Также в этой папке находятся скомпилированные файлы проекта
Если нужно изменить что-то в файлах библиотеки, то не рекомендуется делать это в папке .pio
: если IDE обновит библиотеку - все изменения пропадут! Скопируйте нужную библиотеку в папку lib
и уберите из зависимостей.
Локальные библиотеки #
Непосредственно папки библиотек можно класть в папку lib
- компилятор тоже там ищет файлы. Здесь же можно разрабатывать свои библиотеки:
Обновление библиотек #
Чтобы обновить автоматически установленные библиотеки, используется команда pio pkg update
в консоли PIO, либо кнопка в меню:
Полезные сочетания клавиш #
Ctrl
+Shift
+N
- новое окно VS CodeAlt
+Shift
+F
- автоформатирование кодаCtrl
+/
- закомментировать/раскомментировать строкуCtrl
+F
- поиск по текущему файлуCtrl
+H
- поиск и замена по текущему файлуCtrl
+Shift
+F
- поиск по файлам проектаCtrl
+Shift
+H
- поиск и замена по файлам проектаCtrl
+Alt
+B
- компиляцияCtrl
+Alt
+U
- загрузка прошивкиCtrl
+Лев. кн. мыши
на имени в коде - перейти к определению
Вот отличная статья про возможности редактирования в VS Code, горячие клавиши и так далее.