Платы · статья
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-12E | NodeMCU 1.0 (ESP-12E Module) | Самая ходовая плата. Пунктов «V2» и «V3» в списке искать бесполезно — таких нет: это названия партий разных продавцов, внутри у обеих один модуль ESP-12E. |
| NodeMCU V0.9, NodeMCU V1, ESP-12 | NodeMCU 0.9 (ESP-12 Module) | Первая ревизия 2014 года, сегодня встречается редко. Флеш тот же — 4 МБ. |
| Wemos D1 mini, LOLIN D1 mini | LOLIN(WEMOS) D1 R2 & mini | Один пункт сразу на две платы: маленькую mini и D1 R2 в форме Uno. |
| D1 mini Lite | LOLIN(WEMOS) D1 mini Lite | Чип ESP8285, флеш всего 1 МБ — большие скетчи не влезут. |
| D1 mini Pro | LOLIN(WEMOS) D1 mini Pro | 16 МБ флеша и разъём для внешней антенны. |
| Дешёвая копия D1 mini | LOLIN(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 на чипе ESP8285 | Generic 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-кабель — и плата появляется в списке портов. Три вещи, на которых спотыкаются:
- Кабель должен уметь передавать данные. «Зарядный» кабель не даст ни порта, ни ошибки — просто ничего не произойдёт.
- Нужен драйвер моста. На NodeMCU и Wemos стоит CH340 или CP2102. Порт не появился — ставим драйвер.
- Плату придётся выбрать руками. Сама она не определится никогда — по причине из врезки выше.
Распиновка: цифры на плате — не номера выводов
Главный источник ошибок. Надписи D0…D8 придумали авторы платы NodeMCU ещё в 2014 году, а внутри чипа выводы называются иначе. Скетч работает с настоящими номерами, и D5 — это вывод 14.
| Подпись на плате | Настоящий вывод | Чем занят | Можно ли брать |
|---|---|---|---|
D0 | GPIO16 | особенный вывод | осторожноНет прерываний и нет подтяжки вверх. Его соединяют с RST для выхода из глубокого сна — но на время прошивки эту перемычку надо снимать, иначе плата не войдёт в режим загрузки. |
D1 | GPIO5 | SCL шины I2C | свободенСвободен, если не пользуетесь I2C: это вывод SCL по умолчанию. Шина здесь программная, так что Wire.begin(SDA, SCL) переносит её на любую свободную пару. |
D2 | GPIO4 | SDA шины I2C | свободенТо же самое: по умолчанию здесь SDA, но привязки к железу нет — шину можно перенести. |
D3 | GPIO0 | выбор режима загрузки | осторожноВ момент включения должен быть в высоком уровне. Кнопку сюда ставить можно — на NodeMCU здесь и стоит заводская кнопка FLASH. Беда, если уровень удерживается низким именно в момент подачи питания: тогда чип уходит в режим прошивки вместо запуска скетча. |
D4 | GPIO2 | встроенный светодиод | осторожноТоже участвует в выборе режима: при включении должен быть высоким. Встроенный светодиод подключён к питанию и не мешает, а вот внешняя нагрузка, тянущая D4 к земле, сорвёт запуск. |
D5 | GPIO14 | SCK шины SPI | свободенСамый удобный свободный вывод. |
D6 | GPIO12 | MISO шины SPI | свободенСвободен. |
D7 | GPIO13 | MOSI шины SPI | свободенСвободен. |
D8 | GPIO15 | выбор режима загрузки | осторожноПри включении обязан быть в низком уровне — на плате он к земле уже притянут. Опасна не земля, а подтяжка вверх: модуль, который тянет D8 к 3,3 В, не даст плате стартовать. Частый случай — вывод выбора SD-карты: он по умолчанию именно здесь. |
RX / D9 | GPIO3 | приём по USB | занятЗанят разговором с компьютером. Имя D9 у NodeMCU означает именно его, у Wemos D1 mini такого имени нет, а у платы D1 R1 D9 — это совсем другой вывод, GPIO2. |
TX / D10 | GPIO1 | передача по 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 обычный — здесь нет. |
Хорошая новость: 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 МБ при заводской настройке
И маленькая тонкость про проценты: строка среды «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'.
Как из коробки
Меню MMU: 32KB cache + 32KB IRAM (balanced)
Если не хватило
Меню MMU: 16KB cache + 48KB IRAM (IRAM)
Лечится она не выкидыванием библиотек, а пунктом меню: Инструменты → 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».
Не заливается прошивка: разбор по строкам
Самая частая жалоба выглядит так:
Смысл: плата не вошла в режим прошивки или её вообще нет на этом порту. Проверяйте по порядку.
- Тот ли порт. Выньте кабель, посмотрите, какой порт исчез, вставьте обратно. У ESP8266, в отличие от Arduino Leonardo, порт при прошивке не пропадает и не меняет номер — им владеет отдельная микросхема-переходник.
- Снимите перемычку D0–RST, если вы её ставили ради глубокого сна. Во время прошивки она мешает переходнику сбросить плату, и ошибка выглядит точно так же, как при плохом кабеле.
- Кабель и драйвер. Кабель без линий данных — классика. Мост на плате бывает CH340 или CP2102, для каждого нужен свой драйвер: инструкция по драйверам.
- Снизьте скорость. У плат семейства D1 заводская скорость загрузки 921 600 — на дешёвом кабеле она срывается. Поставьте 115 200.
- Помогите плате войти в режим прошивки. На NodeMCU: держите кнопку FLASH, коротко нажмите и отпустите RST, потом отпустите FLASH.
- Питание. ESP8266 в момент передачи ест заметно больше, чем даёт слабый порт или переходник. Плата, которая прошивается и тут же перезагружается, обычно недоедает.
- Порт занят. Если в ошибке мелькает «Отказано в доступе» — закройте монитор порта и другие программы. Полный разбор ошибок загрузки — дерево причин.
Про 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. В девяти случаях из десяти это верный ответ.
Про питание отдельно, потому что на этом спотыкаются чаще, чем на проводах. В момент передачи 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 Uno | ESP8266 | ESP32 |
|---|---|---|---|
| Частота | 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-Fi | — | 238 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 в 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, плата не видна, не заливается прошивка.
