Здравствуйте, уважаемый читатель!
В данной статье порассуждаем о том, как и на чем можно программировать популярные “сетевые” микроконтроллеры ESP8266 и ESP32. Выясним что такое платформа (framework, SDK) и IDE (Integrated Development Environment), почему это не одно и то же, и как они связаны. Я постараюсь сделать сей обзор максимально непредвзято, дабы вы смогли выбрать для себя максимально подходящий инструмент.
Для кого эта статья? Она предназначена в первую очередь для тех, кто впервые столкнулся с ESP и хочет разобраться, с помощью каких инструментов их можно самостоятельно программировать. Не использовать чужие готовые прошивки, а именно программировать, то есть создавать свои собственные прошивки.
Данная статья посвящена только программированию микроконтроллеров ESP32 и ESP8266, а соответственно и всех плат не их основе – ESP32-DevKit, NodeMCU, ESP-01 и т.д. Если вам интересно узнать больше об этих железяках, то вы можете посмотреть еще одну статью.
Спойлер (для тех, кто не желает читать всю эту писанину): для полноценного программирования ESP8266 и ESP32 в основном используется язык C / C++ с применением платформ Arduino ESP32 или ESP-IDF, а также можно работать и с языками MicroPython или LUA. Список поддерживаемых языков постоянно расширяется – появляются новые языки и новые возможности, например появилась официальная поддержка Rust. А использовать для этого можно много самых разных сред разработки: Arduino IDE, PlatformIO, Espressif IDE, CLion, VisualGdb, ESPLorer и другие.
Инструменты для разработки, терминология
Для тех, кто впервые сталкивается с программированием, давайте чуть-чуть остановимся на необходимых терминах и инструментах для программирования. Для знакомых с программированием МК эту главу можно смело пропустить.
Любые популярные средства для программирования ESP можно разбить на несколько составных частей:
- IDE – собственно редактор программ на человеко-читаемом языке (обычно Си / Си ++, но могут быть варианты)
- Компилятор – то что переведет ваш код в читаемом языке в машинные коды (чаще всего он объединен с IDE и вы напрямую с ним не взаимодействуете)
- Freamework / платформа / SDK – набор системных библиотек, довольно жестко привязанных производителем к используемому контроллеру. Сюда входят все необходимые библиотеки и API для работы с выводами, таймерами, сетевыми интерфейсами и т.д. и т.п.
То есть IDE != платформа, хотя они и часто связаны. Например: Arduino – это не только IDE, но и фреймворк (платформа).
Если говорить очень упрощенно (да и не совсем правильно), то для того, чтобы построить дом, вам потребуются: чертеж дома (ваш исходный код), компилятор (бригада строителей) и кирпичи и иные стройматериалы (фреймворк, платформа). Об них и проговорим ниже.
Конечно же, существуют и альтернативные варианты “визуального” или модульного программирования ESP32 без написания кода, но лично я не считаю такие средства нормальными системами программирования и отношусь к ним достаточно негативно. Посему описания таких систем в данной статье не будет.
IDE
Для того, чтобы писать код, нужен основной инструмент программиста – редактор кода (или какой-либо другой инструмент для программирования). Чаще всего их называют IDE (что расшифровывается как Integrated Development Environment — интегрированная среда разработки) — это программное приложение, которое позволяет разработчикам писать, отлаживать и тестировать код, используя при этом один или сразу несколько языков программирования. IDE, как правило, включает в себя собственно редактор кода, компилятор и, возможно, отладчик (что упрощает процесс разработки программного обеспечения). В принципе, в некоторых языках программирования можно легко и блокнотом обойтись, но для микроконтроллеров это не катит.
IDE могут быть рассчитаны на работу как с одним определенным семейством микроконтроллеров (например: Atmel AVR Studio, CubeIDE, Espressif IDE и т.д.), так и одновременно с самыми разными языками и микроконтроллерами (например: ArduinoIDE, Visual Studio Code и т.д.). Первую группу IDE назовем специализированными, ну а вторую группу IDE вполне можно называть универсальными.
Компилятор
IDE сама по себе не может “заставить” микроконтроллер работать. Процессор не человек, он не понимает слов, он понимает “машинный код” – только свои команды, определенные инженерами на этапе его создания. Для того, чтобы перевести ваш текст, написанный на том или ином языке программирования (исходный код), в понятный процессору двоичный код нужен компилятор или иногда интерпретатор:
- Компилятор (англ. compiler – составитель, собиратель) читает всю программу целиком, делает ее перевод в машинный код и создает законченный вариант программы на машинном языке, который затем загружается в микроконтроллер и выполняется. При каждом новом запуске программы всегда выполняется уже ранее скомпилированный вариант программы.
- Интерпретатор (англ. interpreter – истолкователь, устный переводчик) переводит и выполняет программу строка за строкой. В этом случае при каждом запуске программы интерпретатор заново преобразует ваши строчки в машинный код и исполняет их. Очевидно, что для этого требуется гораздо больше времени и усилий, поэтому на микроконтроллерах применяется редко (а на больших и мощных контуперах – легко, особенно в скриптовых языках программирования).
В большинстве случаев для ESP32 и ESP8266 используется именно компиляторы.
Процесс перевода человеко-читаемого исходного кода программы (поэтому их ещё часто называют “исходники” или “sources“) называется “компиляцией” или иногда “сборкой” программы. В английском варианте это могут быть “compile” или “build“. Примечание автора: здесь я пошел на сознательное нарушение истины, так как процессы компиляции и сборки несколько отличаются друг от друга – но в контексте данной статьи нам эти отличия не важны; но важно то, что в разных IDE вы можете встретить и то и другое, и это будет примерно одно и то же.
Прошивка
Что ж, допустим исходный код мы успешно (без ошибок) скомпилировали в двоичный файл-образ, теперь нам нужно загрузить его в микроконтроллер и заставить выполняться. Для загрузки скомпилированной программы в микроконтроллер на разных микроконтроллерах могут применяться либо специальные аппаратные программаторы, либо программный загрузчик (bootloader). Для ESP32 разработчики предусмотрели два варианта – с загрузчиком и без оного, но в подавляющем большинстве случаев используется именно bootloader (но вы можете изменить режим запуска в SdkConfig). Разумеется, загрузчик съедает какую-то часть доступной flash-памяти – подробнее об этом можно почитать тут.
Для чего же все-таки нужен этот загрузчик? Это специальная мини-программа, которая позволяет загрузить ваш код в микроконтроллер без использования специальных аппаратных программаторов. Его задача – принять вашу прошивку через UART ( COM-порт ) и записать её на flash-память; а затем он же считывает прошивку из flash-памяти, проверяет и запускает на выполнение – делается это автоматически, при следующем запуске микроконтроллера. Он же реализует получение, запись и выбор прошивки через сетевые интерфейсы и в случае OTA (обновление прошивки “по воздуху”). Создавать загрузчик самостоятельно вам не потребуется, он будет создан и записан в микроконтроллер автоматически (по умолчанию “с завода” загрузчик уже записан в ESP, но при изменении его параметров он все-таки перезаписывается).
Собственно процесс записи этого образа в энергонезависимую память устройства часто называется “прожигом” или “прошивкой” или “загрузкой“, а в англицкой терминологии – “upload” или “flash“. Если вам интересно, откуда взялись эти термины, можно почитать здесь. Скомпилированную программу тоже часто называют “прошивкой”, поэтому “прошивка” – это может быть и процесс загрузки кода в микроконтроллер и сам скомпилированный код.
Здесь наверное стоит немного рассказать об особенностях хранения прошивок на ESP. Для хранения двоичного кода микропрограмм и различных “постоянных” данных, микроконтроллеры имеют на борту некоторый объем энергонезависимой памяти (ROM или ПЗУ). Но в случае с ESP объем ПЗУ очень даже небольшой. Даже “навороченная” ESP32 первого поколения имеет “на борту” всего 448 килобайт ROM, а новые серии (-S, -C) и того меньше. Меньше чем RAM! Этого явно не достаточно для хранения программ.
Но не всё так страшно. Дело в том, что на продукции Espressif для хранения исполняемого кода и данных используется дополнительный чип flash-памяти, который подключен к процессору по шине HSPI, и для этого используются некоторые GPIO, которые вы не можете использовать в своих проектах для чего-то иного. Насколько я понимаю (хотя я глубоко не исследовал эту тему – а зачем?) чип flash памяти может быль либо интегрирован в собственно SoC (embedded), либо распаян снаружи SoC в виде обычной микросхемки (внутри модуля или на плате) – поправьте меня если я ошибаюсь. Поэтому говоря про энергонезависимую постоянную память в случае ESP используют именно термин flash-память, а не ПЗУ/ROM, так как “истинный” ROM используется для немного другого.
На ESP для перевода загрузчика в режим ожидания пришивки с UART используется GPIO0 (это один из так называемых Strapping Pins), и он очень часто выведен на кнопку DOWNLOAD. Если на GPIO0 в момент сброса микроконтроллера присутствует низкий уровень, то это означает, что нужно ждать поток данных на UART и записать их на flash. Соответственно процесс “ручного” перевода ESP в режим записи прошивки выглядит так:
- нажать и удерживать кнопку DOWNLOAD / BOOT / IO0
- кратковременно нажать кнопку RESET / EN, не отпуская предыдущей
- отпустить кнопку DOWNLOAD / BOOT / IO0 после того, как была отпущена кнопка RESET / EN
- запустить передачу данных на микроконтроллер
Но на многих “готовых” платах этого не требуется, так как там собрана специальная схема, управляющая процессом по сигналам USB-интерфейса. Однако если вы накосячили с выбором GPIO в своем проекте и заняли некоторые служебные strapping pins, то возможно придется выполнить описанную выше процедуру вручную.
Framework / Платформа / SDK / API
Как правило, только одного редактора (IDE) и компилятора ещё не достаточно для того, чтобы вот так “взять и начать программировать”. Ну то есть можно, но ничего не заработает. Нужен набор неких “системных” библиотек и функций, который предоставит вам базовый функционал, из которого вы начнете строить свою прошивку. Эта часть необходимого инструментария называется либо framework (платформа для разработки приложений), либо SDK (software development kit — набор для разработки программного обеспечения).
Конечно, смешивать понятия SDK и framework – не совсем правильно с академической точки зрения, но в данной статье я буду использовать термины framework, платформа и SDK как взаимозаменяемые. Во первых, китайцы сами не определись, где у них что используется. Ну например: фреймворк Arduino ESP32 вполне себе тянет на гордое звание framework; а вот ESP-IDF, лично на мой взгляд, больше похоже на SDK или набор API (так как программисту придется потрудиться гораздо больше), а между тем китайцы и его гордо именуют фреймворком. А во вторых – для лучшей читаемости текста (это модное словечко framework хрен выговоришь, и SDK мне больше нравится) – примечание автора.
Иногда SDK можно разделить на несколько разных API (application programming interface), то есть наборов функций или классов на определенную тематику. Даже если вам, кажется, что вы ничего дополнительно не устанавливали в свою IDE, то это совсем не значит, что ни одного фреймворка или SDK там уже не было до вас.
SDK предоставляет вам как программисту такие функции, как:
- как настроить ножку в нужный режим
- как дергать ножкой или читать её состояние
- как отправить пару байт другу по той или иной шине
- как подключить к сети WiFi
- и т.д. и т.п.
Разные SDK / фреймворки предоставляют вам разные языки программирования и разный уровень детализации: например кирпичи или монолитные панели “с завода”. Из панелей стоить быстро и удобно, никто не спорит, но что ни строй – всё равно выходит пятиэтажная хрущевка, жить в которой бывает не очень уютно. Из кирпичиков строить долго и нудно, но можно построить красивый и уютный особняк (и, кстати, никто не запрещает вам заранее “склеивать” кирпичи в панели нужной именно вам формы самостоятельно, и использовать в других проектах быстро и удобно).
А вот что выбрать именно Вам – для этого как раз и задумывалась данная статья. Я попытался сделать обзор-сравнение IDE, максимально отстраняясь от собственных предпочтений, дабы вы могли сделать правильный выбор. Но, поскольку я в данный момент использую только PlatfromIO, мне, возможно, сложно судить об других IDE.
Все нижеизложенное отражает субъективное мнение автора и не является истиной в последней инстанции (если таковая вообще существует в этом мире). Вы имеете полное право иметь другую позицию по данному вопросу. Однако это не означает, что я обязан переделывать статью под ваше мнение, даже если я ошибаюсь. Вы имеете полное право написать где-либо статью – опровержение и закидать меня
помидорамифактами ?
Выбор между ESP8266 и ESP32
В начале хочу совсем чуть-чуть остановиться на том, какой лучше микроконтроллер приобрести – ES8266 и его модификации или ESP32 любой серии. Если у вас стоит такой выбор – советую вам остановиться именно на ESP32. И совсем не потому, что он более “мощный” – в серии ESP32 есть семейство ESP32-Cx, которое примерно сравнимо по “мощности” с ESP8266. Дело в том, что на мой взгляд ESP8266 получился у Espressif как тот первый блин – немного комом.
- Во-первых – очень мало GPIO, которые можно использовать в проектах. Допустим у вас есть только одно реле, которым нужно управлять тыкая пальчиков в кнопочку на телефоне – тогда он вполне сойдет. Но уже при попытке подключения сенсоров и дополнительного навесного оборудования могут начаться проблемы.
- Во-вторых – у ESP8266 очень маленькая свободная куча ( heap ), так что даже на два одновременных TLS соединения её не хватает
- В-третьих – мои экземпляры ESP8266, увы, оказались катастрофически не надежны, хотя были куплены в разное время у разных продавцов на Ali. Почти все устройства, которые были когда-то собраны мной на этом микроконтроллере (несколько “поливаек” и контроллер вентиляции погреба) – сдохли спустя достаточно непродолжительное время (от месяца до пары лет непрерывной работы), в то время как ESP32 “продолжают работать, работать и работать…”. Возможно, на это повлиял “ретроградный меркурий” и “так сошлись звезды” дабы я имел дополнительный стимул двигаться вперед, но ESP8266 я больше не покупаю, а оставшиеся модули и платы использую только “для опытов”.
Лично для меня это достаточные основания для отказа от дальнейшей эксплуатации в реальных проектах. А по цене они не сильно различаются. Ну а мы переходим к SDK и фреймворкам.
Готовые прошивки
Прежде чем мы перейдем к обсуждению тонкостей программирования, я хотел бы небольшое отступление. Дело в том, что Вам совсем не обязательно учиться программировать, чтобы заставить эту хреновину работать. Существует довольно большое множество готовых прошивок, когда-то и кем-то уже написанных, и очень даже популярных. От Вас потребуется только выполнить необходимые для решения ваших задач настройки. Данная статья совсем не о готовых прошивках, но присмотритесь к списку, возможно это именно то, что Вы искали (приведенный список явно не полный и служит только для предварительного ознакомления):
- WiFi-IoT – модульный конструктор прошивок
- IoT Manager – модульная беспроводная система автоматизации, основанная на популярных микроконтроллерах от компании espressif
- Tasmota – open source прошивка ESP устройств
- ЕSPHome – система управления вашими микроконтроллерами с помощью простых, но мощных файлов конфигурации и удаленного управления ими через системы домашней автоматизации
- ESPEasy – прошивка, которая поддерживает множество современных чипов от Espressiff
- ESP-Link – Wifi-Serial Bridge w/REST&MQTT, прошивка включает в себя крошечный HTTP-сервер с простым веб-интерфейсом
- NodeMCU custom builds
На этом тему готовых прошивок для ESP на данном сайте считаю исчерпанной полностью, совесть моя чиста, и мы возвращаемся к самостоятельному программированию.
Платформы (SDK) для микроконтроллеров серии ESP8266
Для программирования микроконтроллеров ESP8266, как ни странно, можно использовать несколько разных SDK и фреймворков.
Обратите внимание: я пока почти не касаюсь используемых IDE, а рассматриваю только языки программирования и фреймворки. Просто потому что один и тот же SDK вполне можно использовать в разных IDE. Сами IDE рассмотрим ниже.
Arduino ESP8266 (Arduino core for ESP8266 WiFi chip)
Arduino core ESP8266 – бесспорно и безусловно самый популярный SDK для ESP8266 чипов.
Поддерживаемые IDE: Arduino IDE; PlatformIO
Используемый язык программирования: С/C++. Примечание: строго говоря, упомянутый здесь “С++” – это не совсем “C++ в чистом виде”, а “подмножество Си с поддержкой ООП”.
Достоинства:
- Простота использования для начинающих программистов
- Только этот SDK доступен из Arduino IDE, а многие начинающие программисты не хотят переходить на довольно сложный PlatformIO. Даже уважаемый Alex Gyver рекомендовал своим читателям использовать старый добрый Arduino IDE вместо современного PlatfromIO (впрочем, я его отлично понимаю, почему он так сделал, выхода у него по сути не было, т.к. основная его аудитория – начинающие программисты, и советовать им сложные IDE – это форменное самоубийство).
- Огромное количество написанных библиотек
- Огромное количество примеров в сети – простых и не очень. Но будьте осторожны – иногда встречаются явно “кривые” примеры.
Недостатки:
- Стандартные библиотеки ESP8266WiFi могут быть нестабильными в некоторых условиях.
Знаете что побудило меня отказаться от arduino несколько лет назад в качестве первой причины? Дело в том, что устройство в гараже постоянно перегружалось из-за переполнения стека. Код там был проще пареной репы – подключаемся к wifi и mqtt, меняем влажность, включаем реле. Но уровень сигнала там был очень слабый – минус 75 dBi и хуже. Как я выяснил, устройство постоянно подключалось и отключалось от WiFi, причем иногда рабочий цикл подключения не завершался полностью, а уже происходило отключение, и “что-то шло не так…”. Все это приводило к сбоям и перезагрузкам. А на стандартные библиотеки я как бы особо повлиять и не могу.
Между тем устройства на базе ESP32 с самописным алгоритмом, который неоправданно сложен и раздут, по мнению многих комментариев Дзена – работают в тех же самых условиях стабильно долгое время без сбоев и перезагрузок. Нет, я хорошо понимаю, что в нормальных условиях правильно написанный код на Arduino работает достаточно стабильно. Но лично мне этого не всегда бывает достаточно. Да и ошибки в сторонних библиотеках никто не отменял (а повлиять на их оперативное исправление я не могу) – поэтому я предпочитаю писать свои. Но я поступил кардинально – отказался от ESP8266 вообще.
Если же у Вас есть только ESP8266 и вам необходимо её запустить в работу – то наверное это Ваш выбор. Но не единственный…
ESP8266 Non-OS SDK
ESP8266 Non-OS SDK предоставляет программисту набор интерфейсов прикладного программирования (API) для основных функций ESP8266, таких как прием/передача данных через Wi-Fi, стек TCP/IP, функции аппаратного интерфейса и базовые функции управления системой. Судя по всему, автором данного SDK является производитель чипов, но в PlatformIO запилили поддержку в свою IDE.
Поддерживаемые IDE: PlatformIO
Используемый язык программирования: С/C++. Примечание: строго говоря, упомянутый здесь “С++” – это не совсем “C++ в чистом виде”, а “подмножество Си с поддержкой ООП”.
Данный SDK доступен только в PlatformIO, но достаточно давно не развивается. Вместо него предлагается использовать ESP8266 RTOS SDK. Документация по данному SDK есть только в PlatformIO, как собственно и сам SDK. Espressif предоставляет документацию в виде PDF-файла.
ESP8266 RTOS SDK
ESP8266 RTOS SDK – ещё один вариант SDK от производителя, но на этот раз с поддержкой FreeRTOS. Если вы желаете запилить многозадачность в ESP8266, то советую вам присмотреться к данному SDK. Но ресурсы у ESP8266 гораздо скромнее чем у ESP32, это следует учитывать.
Поддерживаемые IDE: PlatformIO
Используемый язык программирования: С/C++. Примечание: строго говоря, упомянутый здесь “С++” – это не совсем “C++ в чистом виде”, а “подмножество Си с поддержкой ООП”.
Документацию по данному SDK вы можете получить здесь. На данный момент я не пользовался данным SDK, но когда-нибудь я попробую сделать это – мне просто интересно, что из этого выйдет. Тогда и можно будет написать про достоинства и недостатки.
MicroPython для ESP8266
Это адаптация популярного языка программирования Python 3, оптимизированная для работы на микроконтроллерах. Нас в данном случае интересует версия для ESP8266.
Поддерживаемые IDE: ESPlorer
Используемый язык программирования: Python 3 (несколько урезанная версия). Я лично не пробовал этот вариант программирования, но насколько я могу судить из документации, этот вариант программирования предоставляет вам интерпретатор (вместо обычного компилятора).
Вначале Вам необходимо загрузить в чип (точнее flash-память) интерпретатор MycroPython в виде уже готового к загрузке bin-файла. И только после установки прошивки c интерпретатором MycroPython на устройство вы можете получить доступ к REPL (командная строка Python) через стандартный UART0. Созданные микропрограммы сохраняются на flash в виде файлов для повторного использования.
Достоинства:
- Наверное, это отличный вариант для ценителей Python, но сам я таковым не являюсь.
Недостатки:
- Отсутствие драйверов для большинства сенсоров и периферийных устройств. Но самые базовые DHT11/DHT22 и 1-Wire имеются.
Подводя итоги – это явно вариант для экспериментов, а не для серьезных проектов. Лично на мой взгляд – на абсолютную истину я не претендую.
NodeMCU
Ещё одна прошивка-интерпретатор, на этот раз на основе языка Lua для ESP32 и ESP8266, в которой используется встроенная файловая система SPIFFS. NodeMCU часто преподносится как название отладочной платы с ESP8266 на борту, но на самом деле это ещё и SDK для ESP.
Поддерживаемые IDE: ESPlorer
Используемый язык программирования: Lua 5.3.
NodeMCU — это прошивка с открытым исходным кодом на основе Lua для ESP8266 WiFi SOC от Espressif, использующая встроенную файловую систему SPIFFS на основе флэш-памяти. NodeMCU реализован на языке C и основан на Espressif NON-OS SDK. Первоначально прошивка была разработана как сопутствующий проект для популярных модулей разработки NodeMCU на базе ESP8266, но теперь проект поддерживается сообществом, и теперь прошивку можно запускать на любом модуле ESP (в том числе и ESP32).
Достоинства:
- NodeMCU SDK содержит в себе драйверы для самых популярных сенсоров (например DHT, DS18B20) и чипов периферии (например MCP23017), что безусловно, делает ему честь
Недостатки:
- На мой взгляд ESP8266 и сам по себе обладает скромными возможностями в плане памяти, а впихивать туда еще и интерпретатор – сомнительная идея.
Лично я с сомнением отношусь к таким вариантам написания программного кода, но как говорится – “если вы не любите кошек, значит вы просто не умеете их готовить“.
В качестве заключения к данному разделу
Возможно, вы знаете или можете найти в сети и другие SDK для разработки собственного программного обеспечения ESP8266. Но мы на этом закончим и переходим к SDK для ESP32.
Фреймворки для микроконтроллеров серии ESP32
Для программирования микроконтроллеров из серий ESP32, ESP32-Cx и ESP32-Sx также вполне можно использовать несколько разных SDK и фреймворков и даже разных языков программирования. Я не случайно начал список ниже с ESP-IDF, а не с самого популярного Arduino32, и далее будет понятно почему.
Обратите внимание: я пока почти не касаюсь используемых IDE, а рассматриваю только языки программирования и фреймворки. Просто потому что один и тот же SDK вполне можно использовать в разных IDE. Сами IDE рассмотрим ниже.
ESP-IDF (Espressif IoT Development Framework)
ISP-IDF – официальный native (что переводится как “родной”) framework от производителя чипов Espressif. То есть ESP-IDF является базовым SDK для всех чипов ESP32, а также он является основой для других фреймворков и языков программирования (примечание автора: возвращаясь к строительной теме – это и есть те самые “кирпичи”).
Поддерживаемые IDE: Arduino IDE; Espressif IDE; PlatformIO
Используемый язык программирования: С/C++. Примечание: строго говоря, упомянутый здесь “С++” – это не совсем “C++ в чистом виде”, а “подмножество Си с поддержкой ООП”. То есть вроде бы язык тот же самый, что и в Arduino IDE, но есть нюансы…
Основан ESP-IDF целиком и полностью на операционной системе реального времени FreeRTOS, но кроме этого он содержит и массу “фирменных” штучек (API). Поэтому, кроме собственно знания C / C++, от вас потребуется хорошее понимание многопоточности (multithreading) и всяких там специальных RTOS-ских фишек типа задач, очередей, мьютексов и т.д. Если вы, как и я, пришли в мир микроконтроллеров с “больших” компьютеров и хорошо знакомы с multithreading-ом, то вам будет не сложно освоить всё это.
Теперь давайте рассмотрим плюсы и минусы этой платформы. Многие из них весьма условны.
Достоинства:
- ESP-IDF имеет соответствующие API для поддержки абсолютно всех аппаратных возможностей, которые были заложены в чипы ESP32 при их проектировании. То есть с этим SDK вы смело можете одновременно использовать две шины IIC, два или три UART, MODBUS, ещё добавить SPI “по вкусу”, I2C и вообще всё, что указано в datasheet-ах – лишь бы выводов хватило. Я уже молчу про всякие там NVS, SPIFFS, TLS и HTTPS и прочее. И при всем этом эти самые API как правило предоставляют программисту максимально возможный уровень настройки под конкретные требования – никакие Arduino тут даже рядом не стояли (нервно курят в коридоре).
- Только у ESP-IDF имеется возможность конфигурировать проект через стандартный механизм SdkConfig. В том числе вы можете в любой момент изменить разметку Flash-памяти по своим вкусам и соображениям. В Arduino IDE, таковые возможности либо отсутствуют, либо достигаются путем танцев с бубном.
- Используя ESP-IDF, вы имеете возможность в полной мере использовать все “сетевые” возможности чипов, как то:
- Вы можете использовать для передачи данных через общий сетевой интерфейс любой физический уровень стека TCP/IP, например Ethernet или GPRS, и при этом все другие API, рассчитанные на работу с WiFi, будут работать без переделок и перделок
- ESP-IDF поддерживает нестандартные протоколы передачи данных через WiFi, например ESP-NOW и режим Long Range, который поддерживает передачу данных на расстоянии данных до 1 км
- Вы можете создать абсолютно любой требуемый алгоритм подключения к сети WiFi – например при работе условиях очень слабого сигнала сети – от -80 до -90dBi и ниже. Стандартные Arduino-вские библиотеки, хоть и очень просты в использовании программистом, но в таких условиях работают далеко не всегда достаточно надежно.
- Используя ESP-IDF, вы автоматически исключаете из кода ненужный балласт в виде Arduino-вского кода, поскольку Arduino32 – это по сути “обертка” вокруг ESP-IDF. На самом деле это весьма условный и спорный плюс, признаю, так как вы в конечном итоге напишите что-то свое примерно того же объема.
Недостатки:
- Самый “главный” минус ESP-IDF, который отпугивал новичков раньше – отсутствие библиотек драйверов для конкретных внешних сенсоров и устройств. Но
если есть в кармане пачка сигарет, тоне все так плохо на сегодняшний день – на сегодняшний момент в Espressif всерьез взялись за эту тему. Сейчас в реестре компонентов ESP-IDF [components.espressif.com] вы можете найти драйверы для большинства популярных сенсоров, дисплеев и устройств. Так что этот недостаток не считаем актуальным. - Необходимость постоянно и всегда “держать в голове”, что мы работаем не с линейным кодом, а c многопоточным и асинхронным! То есть многопоточность должна быть постоянно что называется “у вас в крови”. Для новичков в программировании это сложно, особенно после прямолинейных
как ломпринципов Arduino. Да и не для новичков не очень просто – вот казалось бы, я написал уже достаточно много многопоточных программ на С и Delphi для компьютеров, иногда мне даже кажется, что понимаю что и для чего требуется. Создал и немало работающих прошивок под ESP-IDF. Но все равно иногда допускаю глупые ошибки, чаще всего из-за невнимательности. - Необходимость вникать и изучать в более низкоуровневые (чем в Arduino) API и функции. Многие стандартные для Arduino32 стандартные макро-функции типа WiFi.begin(wifiSSID, wifiPASS); вам придется подробно и детально написать самому. С использованием соответствующих API, callback-ов и асинхронного кода “по событиям”. На мой лично взгляд – это прост о отлично, так как позволяет изменить логику управления по необходимости. А вот по мнению очень многих <sarcazm>специалистов в программировании микроконтроллеров – это очень-очень-очень-очень-очень-очень-очень-очень-очень-очень-очень-очень-очень-очень-очень-очень плохо и подлежит немедленному уничтожению</sarcazm>. Поэтому я записал данный пунктик в недостатки, пусть будет так. Кроме того, для некоторых API можно найти удобные компоненты – обертки в реестре компонентов на components.espressif.com.
Может быть читатели подскажут ещё какие-то достоинства или недостатки данной платформы (если это действительно неустранимые недостатки, не следствие отсутствия опыта), тогда я смогу дополнить данный список. А сейчас я просто не могу ничего вспомнить. Лично на мой взгляд, достоинства перекрывают недостатки “с лихвой” – драйвера при необходимости легко пишутся самим; а громоздкие функции, будучи однажды написанными по своему усмотрению, легко используются повторно.
Здесь стоит немного поподробнее остановиться на собственно процессе компиляции приложений для ESP-IDF (а значит и для Arduino32, так как он является производным от ESP-IDF). Основой всего служит кроссплатформенная система сборки CMake. Для адаптации данной системы сборки к чипам ESP32 в Espressif был создан так называемый toolchain, что по-русски означает “набор инструментов”, а по сути – набор разнообразных скриптов и исполняемых файлов на python 3, которые и выполняют всю основную работу по компиляции, сборке и загрузке приложений на flash-память. А посему в комплект установки фреймворка входит мини-версия python 3.
Рисунок из справочной системы отлично иллюстрирует сей процесс:
На картинке выше Project означает ваш проект, а Appliaction – скомпилированный двоичный файл прошивки, загружаемый в чип. Забегая вперед скажу, что совсем не обязательно подключать ESP32 для прошивки проводом, можно сделать это и “по воздуху”, об этом я как-то писал другую статью.
Arduino ESP32 (ESP32 Arduino Core)
Ещё один официальный framework от Espressif (другие названия: ESP32 Arduino Core или просто Arduino32). Пожалуй это самый известный и популярный SDK для разработки приложений под ESP32. Да, да, это именно тот самый фреймворк, который вы загружаете в Arduino IDE через менеджер плат и ссылку типа “https://dl.espressif.com/dl/package_esp32_index.json“. И таки нет, авторами сего творения являются не итальянцы – изобретатели Arduino, а китайцы – изобретатели ESP как таковой. А если говорить серьезно, то данный фреймворк был создан компанией Espressif для адаптации чипов ESP32 к супер-пупер-мега-популярной среде программирования Arduino IDE. А куда им было деваться? Без этого чипы ESP32 не завоевали бы и доли своей популярности. То есть это еще один из официальных (то есть выпущенных компанией – производителем чипов) фреймворков ESP32. ESP32 Arduino Core основан на той же самой ESP-IDF, которую мы и рассматривали выше (примечание автора: возвращаясь к строительной теме – во многом это и есть “панели с завода”), то есть является адаптацией ESP-IDF под требования Arduino.
Поддерживаемые IDE: Arduino IDE; PlatformIO
Используемый язык программирования: С/C++. Примечание: строго говоря, упомянутый здесь “С++” – это не совсем “C++ в чистом виде”, а “подмножество Си с поддержкой ООП”.
Несмотря на то, что Arduino IDE, на которую нацелен этот SDK, “однопоточная”, но вам всё равно остаются доступны почти все функции FreeRTOS – задачи, очереди и т.д. Но вот доступ к некоторым “фирменным” API, которые предоставляет ESP-IDF, вы потеряете. И ещё один очевидный минус этого SDK – вы потеряете в “гибкости” кода вашей программы – “панели на заводе выпускаются только для типовых проектов“. Зато в комплекте с Arduino вы автоматически получаете доступ к огромному количеству сторонних библиотек, написанных кем-то и когда-то – это неоспоримый плюс Arduino-сообщества.
Достоинства:
- Простота освоения программирования. Простые и понятные универсальные (для многих контроллеров) методы для стандартных функций – дергание ножкой, подключение к WiFi и т.д. А если вы уже ранее освоили программирование в Arduino какого-нибудь другого МК, то перейти на ESP32 вообще почти не составит труда.
- Огромный массив сторонних библиотек на все случаи жизни, как в каталоге Arduino IDE, так и на GitHub-е. Библиотеки эти иногда достаточно качественные и проверенные, иногда “не очень” (например лично я находил ошибки в библиотеках именитых брендов вроде Arafruit, когда делал с них свои версии драйверов сенсоров), иногда их приходится адаптировать под ESP32, но тем не менее они есть. И их много.
Недостатки:
- Невозможность сконфигурировать проект cmake стандартными средствами через sdkconfig
- Выбор разметок flash-памяти возможен только из заранее предустановленного производителем списка (на мой взгляд не очень оптимальных)
- Стандартный ino-скетч для ESP32 – это всего лишь задача FreeRTOS с 8192 байт стека – посмотрите функцию app_main для данного SDK. Хотя вам никто не мешает создавать свои параллельные задачи, но эту предсозданную задачу прибивать нельзя – при выходе из ардуиновского loop() нет vTaskDelete().
- Вы теряете доступ к некоторым API, доступным ESP-IDF
- Стандартные библиотеки Arduino могут быть нестабильными в некоторых условиях (хотя я уже не проверял для ESP32).
Ваш выбор – только за вами, я изложил только свое личное мнение.
MicroPython для ESP32
Это адаптация популярного языка программирования Python 3, оптимизированная для работы на микроконтроллерах. Нас в данном случае интересует версия для ESP32.
Поддерживаемые IDE: ESPlorer
Используемый язык программирования: Python 3 (несколько урезанная версия). Я лично не пробовал этот вариант программирования, но насколько я могу судить из документации, этот вариант программирования предоставляет вам интерпретатор (вместо обычного компилятора).
Вначале Вам необходимо загрузить в чип (точнее flash-память) интерпретатор MycroPython в виде уже готового к загрузке bin-файла. И только после установки прошивки c интерпретатором MycroPython на устройство вы можете получить доступ к REPL (командная строка Python) через стандартный UART0. Созданные микропрограммы сохраняются на flash в виде файлов для повторного использования.
Достоинства:
- Наверное, это отличный вариант для ценителей Python, но сам я таковым не являюсь.
Недостатки:
- Отсутствие драйверов для большинства сенсоров и периферийных устройств. Но самые базовые DHT11/DHT22 и 1-Wire имеются.
Подводя итоги – это явно вариант для экспериментов, а не для серьезных проектов. Ранее в PlatformIO был доступен ещё один python – фреймворк – Simba and Pumbaa, но примерно с год назад он был признан в pio устаревшим.
Лично на мой взгляд – на абсолютную истину я не претендую.
NodeMCU
Ещё одна прошивка-интерпретатор, на этот раз на основе языка Lua для ESP32 и ESP8266, в которой используется встроенная файловая система SPIFFS. NodeMCU часто преподносится как название отладочной платы с ESP8266 на борту, но на самом деле это ещё и SDK для ESP.
Поддерживаемые IDE: ESPlorer
Используемый язык программирования: Lua 5.3.
NodeMCU — это прошивка с открытым исходным кодом на основе Lua для ESP32 и ESP8266 WiFi SOC от Espressif , в которой используется встроенная файловая система SPIFFS на основе флэш-памяти. NodeMCU реализован на C и основан на Espressif ESP-IDF. Первоначально прошивка была разработана как сопутствующий проект для популярных модулей разработки NodeMCU на базе ESP8266 , но теперь проект поддерживается сообществом, и теперь прошивку можно запускать на любом модуле ESP. Поддержка нового SOC ESP32 WiFi/BlueTooth от Espressif находится в стадии разработки.
.
Достоинства:
- NodeMCU SDK содержит в себе драйверы для самых популярных сенсоров (например DHT, DS18B20) и чипов периферии (например MCP23017), что безусловно, делает ему честь
Лично я с сомнением отношусь к таким вариантам написания программного кода, но как говорится – “если вы не любите кошек, значит вы просто не умеете их готовить“.
В качестве заключения к данному разделу
В сети также упоминаются варианты программирования ESP32 на JavaScript и некоторых других языках, но я думаю, что ни для чего серьезного эти проекты не годятся. Впрочем, может быть я и ошибаюсь.
Какую же IDE выбрать?
С тем, какой фреймворк или SDK выбрать для разработки, думаю, вы определились. Наверное не сильно ошибусь, если скажу, что большинство на начальном этапе выберет все-таки соответствующую чипу редакцию Arduino. Ну а потом когда-нибудь, если карта ляжет, можно и на что-то более “тонкое” перейти попробовать. Что ж, давайте подберем к выбранному SDK соответствующий редактор кода – на мой взгляд нужно делать именно так, а не наоборот.
Давайте рассмотрим самые популярные варианты редакторов кода:
- Arduino IDE – “полноценная” IDE, с которой вы сможете использовать фреймфорки Arduino ESP8266 и (или) Arduino ESP32, а также множество других совместимых платформ и микроконтроллеров. Я не случайно написал “полноценная” в кавычках, так как Arduino IDE первого поколения это не среда программирования, а блокнот-переросток к прилепленным к нему списком библиотек и компилятором.
- <


