Embedded

Обзор ESP32/ESP8266: отличия от Arduino UNO, подключение к среде разработки

Введение

Весь предыдущий цикл строился вокруг Arduino UNO, подключённого к компьютеру через USB-кабель — это удобно для разработки, но непрактично для устройства, которое должно работать автономно, в другой комнате или даже за пределами дома. ESP32 (и его более простой предшественник ESP8266) — микроконтроллеры со встроенным Wi-Fi (а у ESP32 ещё и Bluetooth), позволяющие устройству общаться с Qt-приложением по сети, без физического кабеля. В статье разберём ключевые отличия от Arduino UNO и настройку среды разработки.

Концепция

ESP32 значительно мощнее Arduino UNO — два ядра на частоте до 240 МГц против одного ядра 16 МГц, заметно больше RAM и флеш-памяти, встроенные Wi-Fi/Bluetooth контроллеры — и при этом программируется через тот же Arduino framework (тот же стиль setup()/loop(), многие библиотеки совместимы или имеют ESP32-версии). Главное архитектурное отличие для разработчика — большинство пинов ESP32 не эквивалентны пинам Arduino UNO по возможностям (некоторые предназначены только для ввода, некоторые заняты для внутренних нужд при старте), и распиновка требует более внимательного изучения документации конкретной платы.

Пример кода: Обзор ESP32/ESP8266

; platformio.ini — конфигурация для ESP32, отличается от Arduino UNO главным образом board/platform
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200 ; ESP32 обычно работает на более высокой скорости порта, чем Arduino UNO

lib_deps =
    knolleary/PubSubClient@^2.8 ; для MQTT, разбираемого в следующих статьях цикла
// firmware/src/main.cpp — минимальный скетч, демонстрирующий совместимость API с Arduino UNO
void setup()
{
    Serial.begin(115200); // более высокая скорость порта типична для ESP32-проектов
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
    digitalWrite(LED_BUILTIN, HIGH);
    delay(500);
    digitalWrite(LED_BUILTIN, LOW);
    delay(500);
    Serial.println("ESP32 работает");
}
# Типичные ограничения пинов ESP32, которые нужно учитывать при проектировании схемы
# (конкретный список зависит от модели платы — пример для распространённой DevKit v1)

GPIO 0, 2, 15  — задействованы при загрузке, могут вызывать проблемы при старте,
                 если на них что-то подключено и активно в момент включения питания
GPIO 6-11      — зарезервированы для встроенной флеш-памяти, НЕ использовать вообще
GPIO 34-39     — только вход (input-only), нельзя использовать для управления выходом

Пояснения к коду

platformio.ini показывает, что переход с Arduino UNO на ESP32 на уровне конфигурации сборки сводится в основном к смене platform/board — сам framework = arduino остаётся тем же, что подчёркивает совместимость на уровне API для большинства простых задач. Минимальный скетч мигания встроенным светодиодом структурно идентичен аналогичному скетчу для UNO — setup()/loop(), pinMode()/digitalWrite() работают одинаково, что и позволяет почти весь код прошивки из предыдущего цикла (DHT11, HC-SR04, серво и так далее) переносить на ESP32 с минимальными изменениями.

Список ограничений пинов — критичная информация, специфичная именно для ESP32 и не имеющая прямого аналога в более простой распиновке Arduino UNO (где почти любой цифровой пин одинаково пригоден для большинства задач) — при проектировании схемы с несколькими модулями на ESP32 нужно заранее проверить, что выбранные пины действительно подходят для требуемой роли (вход/выход, ШИМ, аналоговый вход), а не просто взять «следующий свободный номер», как иногда можно делать на простом Arduino UNO.

Подводные камни

  • Слепое перенесение распиновки проекта с Arduino UNO на ESP32 без проверки совместимости конкретных пинов — пины, успешно работавшие для определённой роли на UNO, могут оказаться неподходящими на ESP32 (зарезервированы для флеш-памяти, только-вход, проблемные при старте) — каждый перенос схемы на новую платформу требует повторной проверки распиновки по актуальной документации конкретной используемой платы ESP32.
  • Разное напряжение логических уровней — ESP32 работает с логикой 3.3В, тогда как многие модули из стартового комплекта Arduino (включая некоторые датчики предыдущего цикла) рассчитаны на 5В логику Arduino UNO — прямое подключение 5В-модуля к 3.3В-пину ESP32 может либо не работать корректно, либо в худшем случае повредить контроллер; для совместимости часто нужны дополнительные компоненты (резистивные делители напряжения или специализированные модули согласования уровней).
  • Путаница между множеством похожих, но не идентичных вариантов плат ESP32/ESP8266 от разных производителей (DevKit, NodeMCU, Wemos и другие) с разной физической распиновкой при формально одном и том же чипе — конкретный номер GPIO-пина на одной модели платы может физически соответствовать другому, отмаркированному иначе пину на другой модели, что требует точного знания, какая конкретно плата используется в проекте.
  • Первая попытка загрузить прошивку через USB-кабель на новую, неизвестную плату без проверки правильной настройки режима загрузки — некоторые модели ESP32/ESP8266 требуют удержания специальной кнопки BOOT во время начала прошивки (особенно при первой попытке или после изменения определённых настроек), что для новичков, привыкших к «просто нажать загрузить» на Arduino UNO, может стать неожиданным первым препятствием.