ESP32 против ESP8266: выбираем плату под проект — сценарии и грабли
Корзина набита: слева NodeMCU на ESP8266 за двести с хвостом, справа DevKit на ESP32 за четыре сотни, и оба кандидата обещают WiFi в вашем проекте. Десять минут гугления приводят к выводу «бери сильнейший» — который через месяц оборачивается вопросом, зачем ночной лампе два ядра и Bluetooth. Эта страница — решалка под задачу: сравнение по пинам, АЦП, DAC, памяти и току, сценарии «берём то-то, когда…» и грабли переезда с одной платы на другую. Цифры с условиями и правило выбора по трём вопросам собраны в уроке-сравнении ESP32 и ESP8266 — здесь же только практика: что и в каком случае кладу в корзину я.
Обе платы прошиваются из одной Arduino IDE, живут на 3.3-вольтовой логике и ходят в WiFi 2.4 ГГц, поэтому половина различий видна только под нагрузкой. Распиновки для чтения гребёнок лежат отдельно — распиновка ESP32 и распиновка ESP8266: пригодятся, когда выбор сделан и пришло время втыкать провода.
Две платы — один бюджет: в чём настоящая разница
Скорость процессора — последнее, из-за чего стоит доплачивать: разница между 80 и 240 МГц на глаз не ловится, мигалка и реле частоты не чувствуют вовсе. Первым проект упирается в память. Под скетч с WiFi-стеком у ESP8266 остаётся порядка 50 КБ оперативки — двухкилобайтный ответ погодного сервера уже шатает кучу, а String в цикле рвёт её в лохмотья за сутки непрерывной работы. У ESP32 — 520 КБ SRAM: тот же JSON просто число, и библиотеки со вложенными структурами ставятся без борьбы за байты. Второй жёсткий потолок — радио: у 8266 Bluetooth нет физически, нечем его исполнять, и никакая библиотека это не обойдёт. Остальное — пины, АЦП, ЦАП, ток — лечится обвязкой и планировкой, но только не эти два пункта.
| Параметр | ESP8266 (NodeMCU V3) | ESP32 (DevKit, 38 пинов) |
|---|---|---|
| Процессор | 1 ядро Tensilica L106, 80 МГц (разгон до 160) | 2 ядра Xtensa LX6, до 240 МГц |
| RAM под скетч | порядка 50 КБ | 520 КБ |
| Флеш-память | 1-4 МБ | обычно 4 МБ |
| Цифровых пинов на гребёнке | 11, свободны 9-10 | 25 и больше |
| АЦП | 1 канал, 10 бит; на голом чипе 0-1 В, на плате до 3.3 В | до 18 каналов, 12 бит; ADC2 молчит при WiFi |
| ЦАП (DAC) | нет | два 8-битных на GPIO25 и GPIO26 |
| Bluetooth | нет | классический + BLE |
| WiFi | 2.4 ГГц, b/g/n | 2.4 ГГц, b/g/n |
| Ток в передаче WiFi | пики под 200 мА | пики до 240 мА |
| Ток в deep sleep (сам чип) | около 20 мкА | около 10 мкА |
| Логика | 3.3 В, 5 В на пины нельзя | 3.3 В, 5 В на пины нельзя |
| Цена платы | в районе 200-300 рублей | 350-600 рублей |
Читать таблицу советую не сверху вниз, а от задачи. Если скетчу нужны только digitalWrite и раз в минуту отправить три числа — почти вся таблица не имеет значения, и решает цена. Если в проекте HTTPS, разбор ответов по несколько килобайт или пульт в телефоне — решают строки RAM и Bluetooth, а остальное вторично по отношению к ним. Скорость в обоих случаях играет третьестепенную роль: узкое место у самоделок почти всегда сеть и память, а не мегагерцы.
Берём ESP8266, когда задача скромная
- Раз в минуту снять показание с DHT22 или DS18B20 и отправить три числа на сервер: скетч с WiFi-клиентом и датчиком укладывается в 30 КБ, памяти хватает с запасом.
- WiFi-розетка, реле или светильник из браузера: простая страница с парой кнопок переваривается сервером ESP8266 без пота.
- Датчик с батарейкой: чип уходит в глубокий сон на 20 мкА и просыпается по таймеру — на NodeMCU с перемычкой D0→RST это работает без пайки.
- Массовое строительство: когда устройств нужно десять, а не одно, разница в двести рублей на штуку превращается в пару тысяч бюджета.
- Переезд с Uno на WiFi без переписывания: digitalWrite, delay и pinMode переезжают один в один, меняется только логика уровней.
Минусы назову честно, чтобы вы не уехали на 8266 в бездонный проект. Оперативка кончается быстро: добавить к скетчу экран с графиками, TLS или большой JSON — и плата начнёт перезагружаться вразнобой, без ругани в мониторе порта, просто уходит в ребут. Аналоговый вход один, и на голом чипе он меряет только 0-1 В — мой первый канал я сжёг пятью вольтами с Uno-схемы, до строки про делитель тогда не дочитал. Пакет плат ставится так же, как для ESP32, а подключение и выбор модуля разобраны в уроке про ESP8266 в Arduino IDE; прошивочные тонкости клона — в шпаргалке по NodeMCU. Мой поливочный будильник на NodeMCU отработал на балконе две зимы и не перезагрузился ни разу — задача по размеру платы.
Берём ESP32, когда проект упирается в потолок
- Пульт или связь с телефоном: классический Bluetooth и BLE сидят в чипе ESP32 — у 8266 их нет вовсе.
- HTTPS с настоящим TLS: рукопожатие держит в памяти 40-50 КБ, на ESP8266 оно рядом с WiFi-стеком не помещается.
- Сервер с веб-страницей, графиками и JSON: 520 КБ SRAM съедают двухкилобайтные ответы как перекус.
- Две независимые задачи: WiFi-стек живёт на ядре 0, скетчу достаётся ядро 1 целиком, таймеры не плывут.
- Батарейная метеостанция: глубокий сон до 10 мкА, плюс ULP-сопроцессор следит за датчиком, пока ядра спят.
- Звук и плавная аналоговая периферия: два 8-битных ЦАП на GPIO25/26 и десять ёмкостных сенсорных входов, которых у 8266 нет.
Два сценария из практики, где ESP32 оказался не роскошью, а билетом. Первый: HTTPS-клиент, который дёргает погодный API — TLS-рукопожатие съедает 40-50 КБ оперативки, мой скетч на 8266 падал в перезагрузку на этапе подключения, а на ESP32 держит память с запасом. Второй: BLE рядом с активным WiFi — они живут в одном чипе, но режут друг другу heap, поэтому на слабых задачах держу включённым только одно радио. Если цель — управление светом из браузера, начните с урока про веб-сервер на ESP32; связь с телефоном удобнее поднимать по пошаговому разбору BLE-сервера, а подключение к роутеру с первого раза — в лендинге про WiFi ESP32.
Грабли миграции: strap-пины и служебные ноги
Обе платы в момент подачи питания прислушиваются к нескольким пинам: по их уровню чип решает, грузить скетч или ждать прошивку. У Uno ничего подобного нет, отсюда главная ловушка переезда — схема, собранная «как всегда», молча ломает старт. Сводка по ногам, за которыми я теперь слежу до втыкания первого провода, — ниже; полная карта опасных пинов DevKit с пояснениями живёт в отдельном уроке.
| Пин | Роль на старте | Чем грозит в сборке |
|---|---|---|
| GPIO0 (8266: D3) | LOW при подаче питания уводит чип в режим прошивки | Кнопка, замкнувшая пин на землю в момент старта, оставляет плату в загрузчике; после старта пин обычный |
| GPIO2 (8266: D4) | Обязан быть HIGH или висеть в воздухе; связан с бортовым светодиодом | Реле или транзистор, тянущие пин к земле, ломают старт; мигание светодиода при прошивке — норма |
| GPIO15 (8266: D8) | Обязан быть LOW, уже подтянут резистором | Внешняя подтяжка к 3.3 В или силовая нагрузка — и скетч не стартует |
| GPIO12 (ESP32) | HIGH на старте переключает напряжение флеша на 1.8 В | Плата уходит в цикличный ребут и снаружи выглядит мёртвой; лечится снятием всего, что поднимает пин |
| GPIO34-39 (ESP32) | Только вход, внутренних подтяжек нет | digitalWrite ничего не даст; для кнопок нужны внешние резисторы |
| GPIO16 (8266: D0) | Без прерываний и ШИМ, но умеет будить чип из сна | Для глубокого сна нужна перемычка D0→RST, без неё плата не проснётся |
3.3 вольта и ток: общая физика обеих плат
Логика у обоих чипов трёхвольтовая, и толерантности к 5 В нет ни у одного: сигнал от пяти-вольтового сенсора или Uno-схемы подавать на GPIO нельзя — вход деградирует тихо и не сразу, сначала плата работает, через месяц пин врёт. Питание сенсоров берите с вывода 3V3, а не с шины 5 В; сигнальные линии к пяти-вольтовой периферии ведите через делитель из двух резисторов или двунаправленный шифтер уровней для шин I2C и SPI. Правило одно для обеих плат, и на распиновках оно подписано прямо у ножек.
Батарейные проекты — там, где таблица умножается на годы. Сам чип ESP32 спит на 10 мкА, 8266 — на 20, и разница за год копеечная; бюджет убивает обвязка платы: DevKit с регулятором и USB-мостом во сне тянет 10-20 мА — в сотню раз больше чипа. На 8266 глубокий сон требует перемычки D0→RST и строки в скетче, на ESP32 — выбора источника пробуждения. Полный разбор с цифрами — в уроке про глубокий сон и энергобюджет, а первый запуск с подключением к WiFi — в уроке про WiFi.begin.
Промахи, которые я собрал у новичков и на себе
- Переносить подписи D как есть: на NodeMCU метка D4 — это GPIO2, а на ESP32 этих меток нет, шелкография совпадает с номерами GPIO.
- Подавать 5 В на сигнальные линии обеих плат — логика трёхвольтовая, и вход деградирует неделями, а не сгорает сразу.
- Писать analogWrite(3, …) на ESP32: пин 3 — это RX0 аппаратного UART, ШИМ там не живёт.
- Использовать GPIO34-39 как выходы: они только вход, и внутренних подтяжек у них нет — кнопка без внешнего резистора в воздухе.
- Включать WiFi и ждать показаний со второго АЦП: ADC2 ESP32 молчит при работающем радио — датчик переносится на каналы ADC1 (GPIO32-39).
- Кормить плату от порта USB 2.0 с хабом: 500 мА на четыре устройства — и просадка в момент включения радио гарантирована.
- Забывать про EEPROM на 8266: без begin() и commit() значения не сохраняются; на ESP32 вместо неё живёт Preferences.
Правило, которое теперь живёт у меня на стикере, состоит из двух строк. Строчка первая: нет Bluetooth, больших ответов и параллельных задач — берите 8266 и не переплачивайте, он закроет задачу и переживёт пару зим без единого ребута. Строчка вторая: мелькнули BLE, TLS или экран с графикой — сразу ESP32, доплата в двести рублей дешевле трёх вечеров переписывания. Сравнение по цифрам с тремя вопросами — в уроке-сравнении, первый скетч на выбранной плате заливается по уроку про первый запуск ESP32, а тонкости переноса кода между платами разобраны в уроке про портирование.