Платы · статья

ESP8266, NodeMCU и Wemos D1 mini в Arduino IDE

Плата с Wi-Fi, которую программируют в Arduino IDE теми же скетчами, что и Arduino Uno. Разбираем всё по порядку: какая у вас плата, как поставить ядро ESP8266, почему D5 — это на самом деле вывод 14, сколько памяти достаётся вашему коду и что делать, когда прошивка не заливается. Числа про сборку и память мы измерили сами; всё, что про железо, — по документации, и мы это отмечаем.

Три слова, которые постоянно путают

Прежде чем что-то настраивать, надо развести три разные вещи — иначе половина инструкций из интернета будет противоречить друг другу.

  • ESP8266 — это чип. Точнее ESP8266EX, микроконтроллер со встроенным Wi-Fi. Сам по себе он не продаётся в удобном виде: у него нет ни памяти программ, ни USB.
  • ESP-01, ESP-12E, ESP-12F — это модули: маленькие платы, где к чипу уже припаяны флеш-память, антенна и кварц. Модулю всё ещё нужны питание 3,3 В и переходник USB.
  • NodeMCU и Wemos D1 mini — это готовые платы: модуль плюс стабилизатор питания, переходник USB и кнопки. Их и покупают, чтобы просто воткнуть в компьютер.

Отсюда же путаница со словом «D1». Так называют и маленькую Wemos D1 mini, и большую D1 R1 в форме Arduino Uno, и просто вывод D1 на самой плате. В объявлениях их часто зовут «Arduino D1» и «Arduino D1 mini», но Arduino их не выпускает: это платы Wemos, теперь LOLIN. Так же и NodeMCU пишут то слитно, то раздельно — плата от этого не меняется.

Какая у вас плата и что выбирать в списке

Список плат не совпадает с надписями на самих платах — это первое место, где новичок застревает. Вот перевод.

Что написано на плате или в объявленииЧто выбрать в списке платПримечание
NodeMCU, NodeMCU V2, NodeMCU V3, ESP-12ENodeMCU 1.0 (ESP-12E Module)Самая ходовая плата. Пунктов «V2» и «V3» в списке искать бесполезно — таких нет: это названия партий разных продавцов, внутри у обеих один модуль ESP-12E.
NodeMCU V0.9, NodeMCU V1, ESP-12NodeMCU 0.9 (ESP-12 Module)Первая ревизия 2014 года, сегодня встречается редко. Флеш тот же — 4 МБ.
Wemos D1 mini, LOLIN D1 miniLOLIN(WEMOS) D1 R2 & miniОдин пункт сразу на две платы: маленькую mini и D1 R2 в форме Uno.
D1 mini LiteLOLIN(WEMOS) D1 mini LiteЧип ESP8285, флеш всего 1 МБ — большие скетчи не влезут.
D1 mini ProLOLIN(WEMOS) D1 mini Pro16 МБ флеша и разъём для внешней антенны.
Дешёвая копия D1 miniLOLIN(WEMOS) D1 mini (clone)Отдельный пункт ради копий: у него режим работы с флешем безопасный (DOUT), и плата запускается там, где обычный пункт даёт «залилось, но не работает».
Wemos D1 R1 (крупная, в форме Uno)LOLIN(WeMos) D1 R1ВНИМАНИЕ: у неё совсем другая нумерация выводов, см. раздел про распиновку.
ESP-01, ESP-01S (синий модуль на 8 ножек)Generic ESP8266 ModuleПункта «ESP-01» в списке нет вовсе. Здесь же придётся выставить Flash Size руками.
ESP-01 на чипе ESP8285Generic ESP8285 ModuleФлеш у него внутри чипа, варианты только на 1 и 2 МБ.

Плата не определится сама — и это нормально. В описании плат ESP8266 нет ни одного заводского кода USB (мы проверили: ноль строк), поэтому среда физически не может узнать вашу плату по порту. Выбирать всегда придётся руками.

Как поставить поддержку ESP8266

Поддержка ESP8266 не входит в среду — её добавляют одной ссылкой. В Arduino IDE: Файл → Настройки, поле «Дополнительные ссылки для Менеджера плат», вставить адрес, нажать ОК, затем Инструменты → Плата → Менеджер плат, набрать esp8266 и нажать «Установить».

https://arduino.esp8266.com/stable/package_esp8266com_index.json

Эту строку и называют «ссылкой JSON для ESP8266». Адрес официальный и рабочий. Старая ссылка со словом staging вместо stable, которая до сих пор ходит по форумам, отдаёт «страница не найдена» — многие принимают это за блокировку. А если менеджер плат отвечает отказом или бесконечным «downloading index», дело тоже не в ссылке: разбор ошибки 403.

Из России это работает без обходных путей. Мы специально проверили с российского адреса: и сам список, и все архивы (они лежат на GitHub) отдаются на полной скорости. Так что ESP8266 — приятное исключение: ни VPN, ни зеркала для скачивания не нужно.

Но есть ловушка, о которой не пишут. Мы поставили ядро на машину в России и попробовали собрать скетч — сборка упала: fork/exec …/ctags: no such file or directory. Ядро ESP8266 скачалось, а служебная программа ctags, без которой не собирается ни один скетч, живёт на сервере самой Arduino — и он нашему серверу в России отдал отказ (403) и на список пакетов, и на сам файл ctags. Ядро уже стоит, а сборка падает — и догадаться, при чём тут ESP8266, невозможно. Подробный разбор этой беды — ошибка 403 в Arduino IDE.

В Trema IDE этого шага нет вовсе: ESP8266 уже стоит в списке плат, потому что программа берёт платы с российского зеркала. Служебные инструменты она берёт оттуда же — поэтому сборка не спотыкается о закрытый сервер.

Как подключить ESP8266 к компьютеру

Здесь всё как с Arduino: обычный USB-кабель — и плата появляется в списке портов. Три вещи, на которых спотыкаются:

  1. Кабель должен уметь передавать данные. «Зарядный» кабель не даст ни порта, ни ошибки — просто ничего не произойдёт.
  2. Нужен драйвер моста. На NodeMCU и Wemos стоит CH340 или CP2102. Порт не появился — ставим драйвер.
  3. Плату придётся выбрать руками. Сама она не определится никогда — по причине из врезки выше.

Распиновка: цифры на плате — не номера выводов

Главный источник ошибок. Надписи D0…D8 придумали авторы платы NodeMCU ещё в 2014 году, а внутри чипа выводы называются иначе. Скетч работает с настоящими номерами, и D5 — это вывод 14.

Подпись на платеНастоящий выводЧем занятМожно ли брать
D0GPIO16особенный выводосторожноНет прерываний и нет подтяжки вверх. Его соединяют с RST для выхода из глубокого сна — но на время прошивки эту перемычку надо снимать, иначе плата не войдёт в режим загрузки.
D1GPIO5SCL шины I2CсвободенСвободен, если не пользуетесь I2C: это вывод SCL по умолчанию. Шина здесь программная, так что Wire.begin(SDA, SCL) переносит её на любую свободную пару.
D2GPIO4SDA шины I2CсвободенТо же самое: по умолчанию здесь SDA, но привязки к железу нет — шину можно перенести.
D3GPIO0выбор режима загрузкиосторожноВ момент включения должен быть в высоком уровне. Кнопку сюда ставить можно — на NodeMCU здесь и стоит заводская кнопка FLASH. Беда, если уровень удерживается низким именно в момент подачи питания: тогда чип уходит в режим прошивки вместо запуска скетча.
D4GPIO2встроенный светодиодосторожноТоже участвует в выборе режима: при включении должен быть высоким. Встроенный светодиод подключён к питанию и не мешает, а вот внешняя нагрузка, тянущая D4 к земле, сорвёт запуск.
D5GPIO14SCK шины SPIсвободенСамый удобный свободный вывод.
D6GPIO12MISO шины SPIсвободенСвободен.
D7GPIO13MOSI шины SPIсвободенСвободен.
D8GPIO15выбор режима загрузкиосторожноПри включении обязан быть в низком уровне — на плате он к земле уже притянут. Опасна не земля, а подтяжка вверх: модуль, который тянет D8 к 3,3 В, не даст плате стартовать. Частый случай — вывод выбора SD-карты: он по умолчанию именно здесь.
RX / D9GPIO3приём по USBзанятЗанят разговором с компьютером. Имя D9 у NodeMCU означает именно его, у Wemos D1 mini такого имени нет, а у платы D1 R1 D9 — это совсем другой вывод, GPIO2.
TX / D10GPIO1передача по USBзанятТо же самое. У Wemos D1 mini имени D10 нет вовсе, а у платы D1 R1 D10 — это GPIO15, второй вывод выбора режима загрузки.
A0единственный АЦПаналоговый входсвободенОн один на всю плату, и у него потолок по напряжению: сам чип принимает не больше 1,0 В, а на NodeMCU и D1 mini перед входом стоит делитель, поэтому туда можно до 3,2-3,3 В. На голом модуле делителя нет. analogRead на других выводах молча вернёт 0 или 1023 — кроме D3: его номер ядро считает вторым именем того же A0.
GPIO6…GPIO11микросхема флеш-памятизанятУ Wemos D1 mini наружу не выведены вовсе, а у NodeMCU 1.0 стоят на гребёнке под именами CLK, SD0, SD1, CMD, SD2, SD3 — и это ловушка: они заняты флеш-памятью, обращение к ним обычно роняет программу. В уроках для Uno вывод 6 обычный — здесь нет.
Таблица для NodeMCU 1.0 и Wemos D1 mini — у них раскладка совпадает до вывода. У платы «LOLIN(WeMos) D1 R1» она другая, об этом отдельно ниже.

Хорошая новость: D1, D2 и так далее в коде писать можно — среда сама переведёт их в нужные номера. Но только если выбрана правильная плата.

Ловушка «D1 не равно D1». У платы «LOLIN(WeMos) D1 R1» нумерация совершенно другая: там D1 — это вывод 1 (то есть линия передачи в компьютер!), D2 — вывод 16, а D8 — вывод 0. Урок, написанный для D1 mini, на этой плате будет дёргать чужие ноги, и понять причину почти невозможно. Проверяйте, какой именно пункт выбран в списке.

Ещё три вещи, которые стоит знать заранее:

  • Аналоговый вход один — A0, и он рассчитан на один вольт. На NodeMCU и Wemos D1 mini перед ним стоит делитель на плате, поэтому туда можно подавать привычные 3,3 В; на голом модуле делителя нет, и те же 3,3 В вход испортят. А если написать analogRead(D5), ошибки не будет: функция молча вернёт 0 или 1023, и человек решает, что сломался датчик.
  • На D0 не работают прерывания. Тоже молча: в коде ядра стоит проверка «номер меньше 16», и для D0 обработчик просто не ставится. Кнопка через прерывание на этом выводе не сработает никогда.
  • Выводы D3, D4 и D8 участвуют в запуске. В момент включения на D3 и D4 нужен высокий уровень, а на D8 — низкий. Значит, D3 и D4 нельзя держать прижатыми к земле, а D8 — наоборот, нельзя подтягивать к 3,3 В: так ведёт себя, например, вывод выбора SD-карты. Уровень важен только в момент старта: нажимать кнопку после включения можно на любом из них.
  • Светодиод — только через резистор. На любом выводе: чип отдаёт немного тока, и светодиод напрямую портит вывод тихо и навсегда.

Первый скетч: мигаем встроенным светодиодом

Классическая мигалка работает и здесь, но с двумя отличиями. Первое: LED_BUILTIN — это вывод 2, он же D4, а не 13, как на Uno. Второе: светодиод горит при низком уровне, так что LOW включает, а HIGH гасит.

// Мигаем встроенным светодиодом. На ESP8266 он горит при НИЗКОМ уровне.
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // горит
  delay(500);
  digitalWrite(LED_BUILTIN, HIGH);  // погашен
  delay(500);
}

После сборки среда напишет что-то вроде «used 232148 / 1048576 bytes (22%)». Не пугайтесь: 232 килобайта на мигалку — это не ошибка. В прошивку всегда целиком линкуется стек Wi-Fi, даже если вы им не пользуетесь. Для сравнения, та же мигалка для Arduino Uno весит 924 байта.

Подключаемся к Wi-Fi: библиотека уже внутри

Ставить ничего не нужно — в ядре лежат 37 готовых библиотек, среди них ESP8266WiFi. Всё остальное ставится из каталога, как обычно: как ставить библиотеки (экраны LCD 1602 и OLED к ESP8266 подключаются на D2 и D1 — в тех статьях есть строки для него). Вот минимальный скетч: подключиться к сети и напечатать полученный адрес.

// Подключаемся к домашней сети и печатаем полученный адрес.
#include <ESP8266WiFi.h>

const char* SSID = "имя вашей сети";
const char* PASS = "пароль";

void setup() {
  Serial.begin(115200);
  Serial.println();
  WiFi.mode(WIFI_STA);   // только подключаться, свою сеть не раздавать
  WiFi.begin(SSID, PASS);
  Serial.print("Подключаюсь");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Готово, адрес платы: ");
  Serial.println(WiFi.localIP());
}

void loop() {
}

Мы его собрали: 238 736 байт памяти программ (22 %), 28 232 байта оперативной памяти (35 %). То есть Wi-Fi добавил к мигалке всего 6,5 килобайта — потому что он и так уже был в прошивке.

Строка WiFi.mode(WIFI_STA) здесь не для красоты. ESP8266 запоминает режим радио во флеш-памяти и переживает перепрошивку, а по умолчанию поднимает ещё и собственную точку доступа с именем вроде ESP_A1B2C3. Эта строка велит плате только подключаться к вашей сети.

Откройте монитор порта на скорости 115200 — там появится адрес вроде 192.168.1.42. Если вместо адреса бесконечные точки, проверьте имя сети и пароль: ESP8266 работает только с сетями 2,4 ГГц, диапазон 5 ГГц он не видит.

Веб-страничка с кнопкой прямо на плате

Вот ради чего берут эти платы: плата сама раздаёт страничку, которую можно открыть с телефона в той же сети.

// Веб-страничка с кнопкой: включает и выключает встроенный светодиод.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* SSID = "имя вашей сети";
const char* PASS = "пароль";

ESP8266WebServer server(80);
bool ledOn = false;

void showPage() {
  String html = "<meta charset='utf-8'><h2>Светодиод</h2>";
  html += ledOn ? "<p>Сейчас: горит</p>" : "<p>Сейчас: погашен</p>";
  html += "<p><a href='/toggle'>Переключить</a></p>";
  server.send(200, "text/html", html);
}

void toggle() {
  ledOn = !ledOn;
  // Встроенный светодиод горит при НИЗКОМ уровне.
  digitalWrite(LED_BUILTIN, ledOn ? LOW : HIGH);
  server.sendHeader("Location", "/");
  server.send(303);
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.println();
  Serial.print("Откройте в браузере: http://");
  Serial.println(WiFi.localIP());
  server.on("/", showPage);
  server.on("/toggle", toggle);
  server.begin();
}

void loop() {
  server.handleClient();
}

Собрали и это: 269 588 байт памяти программ (25 %), 28 824 байта оперативной (35 %). Откройте в браузере адрес, который плата напечатает в мониторе порта, — и светодиод будет слушаться ссылки.

Сколько памяти на самом деле: 4 МБ, из которых мегабайт

Вторая большая путаница. На плате написано 4 МБ, а под скетч отводится около мегабайта — и больше не станет даже на плате с 16 МБ. Так устроен чип: за раз он видит через окно кэша ровно мегабайт кода.

Флеш-память 4 МБ при заводской настройке

до 1 020 КБ
≈1 019 КБ
2 024 КБ
  • Ваш скетчдо 1 020 КБ
  • Место под обновление по воздуху≈1 019 КБ
  • Файловая система2 024 КБ
  • Служебное20 КБ
Отсюда главное недоразумение: на коробке «4 МБ», а под программу — около мегабайта, и больше не станет даже на плате с 16 МБ. Остальное отдано файлам и запасной копии прошивки.

И маленькая тонкость про проценты: строка среды «used … / 1048576 bytes» показывает круглый мегабайт, а компоновщик обрывается чуть раньше — на 1 044 464 байтах. Поэтому сборка может упасть, когда счётчик показывает 99 %.

Если скетч всё-таки перерос предел, при заводской настройке компоновщик скажет section '.irom0.text' will not fit in region 'irom0_0_seg' — а привычной строки «Скетч слишком большой» вы при этом не увидите. Она появляется только в одном случае: если в настройках платы выбран размер флеша «Mapping defined by Hardware and Sketch». Тогда предел проверяет уже сама среда.

Отдельная история — быстрая память команд, IRAM. Именно из-за неё появляется знаменитая ошибка section '.text1' will not fit in region 'iram1_0_seg'.

Как из коробки

кэш
ядро
вам
  • кэш флеша — 32 768 байт
  • код ядра — 26 899 байт
  • остаётся вам — 5 869 байт

Меню MMU: 32KB cache + 32KB IRAM (balanced)

Если не хватило

кэш
ядро
вам
  • кэш флеша — 16 384 байт
  • код ядра — 26 915 байт
  • остаётся вам — 22 237 байт

Меню MMU: 16KB cache + 48KB IRAM (IRAM)

Быстрой памяти команд всего 65 536 байт, и половину сразу забирает кэш. Строка «занято 91 %» пугает зря: своего кода там 26 899 байт, а свободно 5 869 — до тех пор, пока вы не переключите пункт меню.

Лечится она не выкидыванием библиотек, а пунктом меню: Инструменты → MMU → 16KB cache + 48KB IRAM (IRAM). Мы проверили — скетч, который падал, после этого собирается; так же выручает соседний пункт «16KB cache + 48KB IRAM and 2nd Heap (shared)». А вот похожий «16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)» не помогает: места под код в нём столько же. В Trema IDE этот переключатель лежит не в меню «Инструменты», а в панели платы — там же, где размер флеша и скорость загрузки.

Миф про библиотеки. Принято считать, что IRAM переполняется от обилия библиотек. Мы измерили: поверх мигалки ESP8266WiFi добавляет 80 байт быстрой памяти, веб-сервер — ещё около сотни, HTTPS — три с небольшим сотни. Это копейки: обычные библиотеки живут во флеше. Настоящий пожиратель — SoftwareSerial: около двух килобайт, потому что его обработчик обязан лежать именно в быстрой памяти. Что такое эти байты вообще, разобрано в статье «Память Arduino».

Не заливается прошивка: разбор по строкам

Самая частая жалоба выглядит так:

плата не отозвалась
esptool.py v3.0 Serial port COM7 Connecting........_____.....____ A fatal esptool.py error occurred: Failed to connect to ESP8266: Timed out waiting for packet header
Точки и подчёркивания — не украшение: программа делает семь заходов, в каждом два сброса платы — обычный и с удлинённой паузой, — и после каждого пять раз пробует поздороваться с загрузчиком. Точка — неудачная попытка после обычного сброса, подчёркивание — после удлинённого. Весь отказ занимает около 27 секунд.

Смысл: плата не вошла в режим прошивки или её вообще нет на этом порту. Проверяйте по порядку.

  1. Тот ли порт. Выньте кабель, посмотрите, какой порт исчез, вставьте обратно. У ESP8266, в отличие от Arduino Leonardo, порт при прошивке не пропадает и не меняет номер — им владеет отдельная микросхема-переходник.
  2. Снимите перемычку D0–RST, если вы её ставили ради глубокого сна. Во время прошивки она мешает переходнику сбросить плату, и ошибка выглядит точно так же, как при плохом кабеле.
  3. Кабель и драйвер. Кабель без линий данных — классика. Мост на плате бывает CH340 или CP2102, для каждого нужен свой драйвер: инструкция по драйверам.
  4. Снизьте скорость. У плат семейства D1 заводская скорость загрузки 921 600 — на дешёвом кабеле она срывается. Поставьте 115 200.
  5. Помогите плате войти в режим прошивки. На NodeMCU: держите кнопку FLASH, коротко нажмите и отпустите RST, потом отпустите FLASH.
  6. Питание. ESP8266 в момент передачи ест заметно больше, чем даёт слабый порт или переходник. Плата, которая прошивается и тут же перезагружается, обычно недоедает.
  7. Порт занят. Если в ошибке мелькает «Отказано в доступе» — закройте монитор порта и другие программы. Полный разбор ошибок загрузки — дерево причин.

Про ESP-01 отдельно. Здесь три отдельные беды. Первая: вывод CH_PD (он же EN) обязан быть подтянут к 3,3 В — при низком уровне чип просто выключен, и модуль выглядит мёртвым, сколько кабель ни меняй. Вторая: переходник USB должен быть переключён на 3,3 В — пять вольт этот модуль не переживает. Третья: кнопок и автосброса у голого модуля нет, в режим прошивки его переводят руками — соединить GPIO0 с землёй, кратко замкнуть RESET на землю, отпустить RESET, отпустить GPIO0. И питание ему нужно отдельное и крепкое: вывод 3,3 В на дешёвом USB-переходнике модуль в передаче не вытянет.

Ещё одна примета времени: если в чужой инструкции написано искать ошибку espcomm_sync failed — инструкция очень старая. Эту строку печатала программа, которую выбросили из ядра ещё в 2019 году. Сегодня то же самое звучит как Failed to connect to ESP8266.

Монитор порта: загадочные 74880 бод

Сразу после включения чип печатает служебную строку вида rst cause:2, boot mode:(3,6) — по ней видно, почему плата перезагрузилась и в каком режиме стартовала. Но печатает он её на нестандартной скорости 74880, и на привычных 115200 вместо неё будет мешанина символов.

Причина простая: заводская программа внутри чипа считает, что кварц на 40 МГц, а на модулях он на 26 — вот скорость и уезжает. Как только ваш скетч выполнит Serial.begin(115200), всё станет нормально. В первой цифре после boot mode: тройка означает обычный запуск, единица — режим прошивки.

И маленькая, но полезная разница с Arduino Uno: открытие монитора порта не перезагружает ESP8266. Служебные линии к плате как раз подключены — на них держится автоматический вход в режим прошивки, — но собраны в схему, которая срабатывает, только когда эти линии стоят по-разному. Монитор выставляет обе сразу, и схема ничего не делает. Чтобы увидеть загрузочное сообщение, нажмите RST руками. Как вообще устроен монитор порта — в статье монитор порта Arduino.

Wi-Fi для Arduino Uno и Mega 2560: модуль, гибрид или NodeMCU

Запрос понятный: есть Uno, хочется интернета. Путей три, и они очень разные по хлопотам.

  • Готовая плата-гибрид — её продают как «Mega 2560 WiFi R3» или «Uno WiFi». На одной печатной плате два микроконтроллера и переключатели режима. Работает, но переключатели надо понимать, а прошивать приходится по очереди то одну половину, то другую.
  • Модуль ESP-01, подключённый к Uno. Его вешают на последовательный порт и командуют текстовыми AT-командами. Нужен делитель напряжения (у Uno 5 В, у модуля 3,3 В) и отдельное питание — схема ниже. Способ рабочий, но для первого проекта тяжёлый.
  • Просто взять NodeMCU. Одна плата вместо двух, Wi-Fi внутри, программируется теми же скетчами и стоит дешевле Uno. В девяти случаях из десяти это верный ответ.
ARDUINO UNOTX (1)RX (0)GNDделитель1 кОм / 2 кОм5 В → 3,3 Вмодуль отвечает напрямуюобщая земля обязательнаESP-01RXTXGNDотдельные 3,3 Вне меньше 300 мАVCC и CH_PD
Так модуль ESP-01 подключают к Arduino Uno. Три обязательные вещи, без которых он не заработает: делитель на линии от TX платы к RX модуля (у Uno логика 5 В, у модуля 3,3 В), отдельное питание 3,3 В — вывод 3,3 В самой Uno в пике передачи не тянет, — и CH_PD, подтянутый к плюсу: при низком уровне на нём чип просто выключен. Земля у платы и модуля общая. Это схема из документации, живьём мы её не собирали.

Про питание отдельно, потому что на этом спотыкаются чаще, чем на проводах. В момент передачи ESP8266 берёт короткими всплесками до трёхсот миллиампер — вывод 3,3 В на плате Arduino Uno столько не даёт, и модуль перезагружается ровно тогда, когда пытается выйти в сеть. Картина знакомая: «работает десять секунд, потом сброс». Лечится отдельным стабилизатором на 3,3 В и конденсатором рядом с модулем. Та же причина, кстати, у перезагрузок NodeMCU от слабого USB-порта или тонкого кабеля.

Что для этого нужно из железа: сам модуль ESP-01 (артикул 425, 319 ₽), адаптер под него (артикул 1375, 81 ₽) и преобразователь уровней 5 В ↔ 3,3 В (артикул 355, 53 ₽) — он же пригодится, чтобы вешать пятивольтовые модули на любую плату ESP. А если проще взять готовую плату, то самая дешёвая из живых — WeMos D1 mini (артикул 867, 290 ₽): это ровно та плата, про которую вся эта статья, и стоит она вдвое дешевле Arduino Uno.

И не перепутайте с Arduino UNO R4 WiFi — это совсем другая плата, там за Wi-Fi отвечает ESP32-S3, а ядро стоит своё.

Характеристики ESP8266 коротко

ЧипESP8266EX, 80 или 160 МГц (переключается в настройках платы)
Память под скетч1 044 464 байта — сколько бы флеша ни стояло на плате
Оперативная память80 192 байта, из них пустой скетч занимает 28 104
Быстрая память команд65 536 байт, но половину занимает кэш
Флеш на плате4 МБ у NodeMCU и D1 mini, 1 МБ у D1 mini Lite, 16 МБ у Pro
Цифровые выводы11 наружу, из них три участвуют в запуске
Аналоговый входодин, A0, 10 бит
Питание и уровни3,3 В; входы не рассчитаны на 5 В
РадиоWi-Fi 2,4 ГГц; Bluetooth нет вовсе

ESP8266 или ESP32 — что брать

Оба чипа делает одна компания, ESP32 новее и мощнее. Но «новее» не всегда значит «лучше для вас» — вот честные числа, снятые на одной машине.

Что сравниваемArduino UnoESP8266ESP32
Частота16 МГц80 или 160 МГцдва ядра по 240 МГц
Память под скетч32 256 байт1 044 464 байта1 310 720 байт
Оперативная память2 048 байт80 192 байта327 680 байт
Wi-Fiнетестьесть
Bluetoothнетнет вовсеесть
Аналоговые входы6 штук, 10 битодин, A0около 15
Питание и уровни5 В3,3 В3,3 В
Тот же скетч с Wi-Fi238 736 байт (22 %)875 876 байт (66 %)
Сколько занимает ядро на диске257 МБ366 МБ6,4 ГБ

Читается так: если нужен Bluetooth, много аналоговых входов или серьёзные вычисления — берите ESP32. Если нужен датчик, который раз в минуту отправляет показания, — ESP8266 дешевле, проще и занимает на школьном компьютере в семнадцать раз меньше места.

Можно ли взять ESP8266 вместо Arduino Uno

Можно, и часто это разумно — но пять вещей будут другими.

  • 3,3 вольта вместо 5. Датчики и модули на 5 В напрямую подключать нельзя, нужен делитель или преобразователь уровней.
  • Один аналоговый вход вместо шести. Больше датчиков — только через внешнюю микросхему.
  • Меньше свободных выводов, да ещё три из них участвуют в запуске платы.
  • Библиотеки, написанные под AVR, могут не собраться: те, что лезут в регистры ATmega, работать не будут. Зато Servo, Wire и SoftwareSerial уже внутри ядра.
  • Зато памяти в тридцать с лишним раз больше — 1 044 464 байта под скетч против 32 256 у Uno и 80 192 байта оперативной против 2 048 — и Wi-Fi из коробки.

ESP8266 в Trema IDE: что уже работает

Мы делаем русскую среду для школ и кружков и стараемся писать только о проверенном.

  • Плата уже в списке. Ядро ESP8266 3.1.2 лежит на нашем зеркале packages.trema.ru: 25 записей в индексе, у каждого файла мы сверили контрольную сумму. Вставлять ссылку в настройки не нужно — открыли менеджер плат, нашли ESP8266, поставили.
  • Ставится из России без обходных путей.Скачать надо около 120 МБ (ядро, компилятор и python), на диске это разворачивается в 366 МБ. На нашем сервере в России установка заняла 3,7 секунды.
  • Служебные инструменты — с запасным путём. Программа всегда подмешивает второй наш индекс, где лежит тот самый ctags: пока сервер Arduino отвечает, инструмент берётся оттуда, а когда закрыт — с нашего зеркала. Поэтому сборка не встаёт там, где падает чистая Arduino IDE.
  • Ошибки объясняются по-русски. Вместо английских строк появляется карточка: «Плата ESP не входит в режим прошивки» или «Программа не помещается в память платы». Честно: обе карточки пока общие для всех плат ESP — первая советует зажать кнопку BOOT, хотя на NodeMCU и D1 mini она подписана FLASH и обычно не нужна вовсе, а вторая при нехватке быстрой памяти посоветует сократить программу, хотя правильное лечение — переключатель MMU.
  • Библиотеки под рукой. При выбранной плате ESP8266 менеджер библиотек показывает 7 603 библиотеки из нашего каталога — качаются с российского сервера.

Честно о том, чего пока нет. Собирать скетчи для ESP8266 умеет не встроенный компилятор, а Arduino CLI — программа скачивает его по кнопке при первой сборке (рядом есть вторая кнопка: поставить из заранее скачанного архива, если интернета нет). Версия ядра на зеркале одна — 3.1.2, самая свежая; если чужой проект требует старую, её придётся ставить в другой среде. И скорости 74880 бод в мониторе порта у нас пока нет, так что загрузочное сообщение чипа мы прочитать не поможем. Живой прошивки на ESP8266 мы ещё не делали: установка и сборка измерены, всё остальное описано по документации — и мы прямо об этом говорим.

Вопросы

Частые вопросы про ESP8266

Остались вопросы? Напишите нам

Как добавить поддержку ESP8266 в Arduino IDE?

Откройте Файл → Настройки, в поле «Дополнительные ссылки для Менеджера плат» вставьте адрес https://arduino.esp8266.com/stable/package_esp8266com_index.json и нажмите ОК. Затем Инструменты → Плата → Менеджер плат, наберите esp8266 и нажмите «Установить». В Trema IDE этого шага нет: ESP8266 уже в списке плат, потому что платы берутся с российского зеркала.

Нужен ли VPN, чтобы поставить ESP8266 из России?

Нет. Мы проверили с российского адреса: и список плат, и все архивы ESP8266 лежат на GitHub и отдаются на полной скорости. Закрыт только сервер самой Arduino, но ядро ESP8266 с него не качается. Правда, есть побочная беда: без служебной программы ctags с того же закрытого сервера скетч не соберётся — в Trema IDE она берётся с нашего зеркала.

Почему вывод D5 на плате — это на самом деле вывод 14?

Потому что надписи D0…D8 придумали авторы платы NodeMCU в 2014 году, а внутри чипа выводы называются по-другому. Писать в скетче D5 можно — среда сама переведёт. Но у платы LOLIN(WeMos) D1 R1 нумерация совсем другая: там D1 — это вывод передачи в компьютер. Урок для D1 mini на ней работать не будет.

Какой пункт выбирать в списке плат для ESP-01?

Пункта с названием ESP-01 в списке нет вовсе. Берите Generic ESP8266 Module и выставьте размер флеш-памяти руками: 1 МБ для ESP-01S, 512 КБ для старых синих модулей. Учтите, что при этом обозначения D0…D8 перестают существовать и в скетче придётся писать настоящие номера выводов.

Почему пустая мигалка занимает 232 килобайта?

Это нормально. В прошивку ESP8266 всегда целиком линкуется стек Wi-Fi, даже если скетч им не пользуется. Для сравнения: та же мигалка для Arduino Uno весит 924 байта, а добавление настоящей работы с Wi-Fi увеличивает прошивку всего на 6,5 килобайта.

Что делать с ошибкой section .text1 will not fit in region iram1_0_seg?

Это переполнение быстрой памяти команд, и лечится оно пунктом меню, а не выкидыванием библиотек: Инструменты → MMU → 16KB cache + 48KB IRAM. Место под код вырастет с 32 768 до 49 152 байт. Так же выручает соседний пункт 16KB cache + 48KB IRAM and 2nd Heap (shared). А вот 16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared) не помогает — под код там прежние 32 768 байт. Из обычных библиотек эту память заметно ест только SoftwareSerial.

Почему в мониторе порта при включении платы мешанина символов?

Первые строки чип печатает на нестандартной скорости 74880 бод: его заводская программа считает, что кварц на 40 МГц, а на модулях он на 26. После вызова Serial.begin в вашем скетче всё становится нормально. И учтите: открытие монитора порта ESP8266 не перезагружает, поэтому загрузочное сообщение видно только после нажатия RST.

ESP8266 или ESP32 — что взять новичку?

Если нужен Bluetooth, много аналоговых входов или тяжёлые вычисления — ESP32. Если задача обычная (датчик, реле, страничка в браузере) — ESP8266 дешевле и проще. Наглядно: один и тот же скетч с Wi-Fi занимает на ESP8266 22 процента памяти, а на ESP32 — 66, и ядро ESP32 забирает на диске 6,1 ГБ против 358 МБ.

Попробуйте ESP8266 в Trema IDE

Плата уже в списке, платы и библиотеки — с российских серверов, ошибки объясняются по-русски. Дома бесплатно: через неделю попросит бесплатную регистрацию по почте — и всё. Дальше по теме: ESP32 в среде Arduino, плата не видна, не заливается прошивка.