ESP8266 NodeMCU распиновка (pinout)
Распиновка (pinout) NodeMCU V2 (Amica, DOIT) полностью совпадает с распиновкой ESP8266 NodeMCU V3 (LoLin). Исключение составляют зарезервированные выводы RSV (на рисунке вверху слева). У NodeMCU V3 на них заведена «земля» и напряжение 5V с USB-разъема.

Описание и назначение выводов NodeMCU V2 ESP8266
GND — общий, «земля»
Выводы питания
Vin — вывод для подключения внешнего источника питания 5V. Стабилизатор AMS1117-3.3 позволяет подавать питание на Vin в широком диапазоне от 5 до 10 V. Хотя стабилизатор допускает подачу более высокого напряжения (до 15 V), но без дополнительного охлаждения может возникать перегрев чипа.
3.3V — контакт выходного напряжения внутрисхемного стабилизатора. Может быть использован для питания подключаемых к плате датчиков. Суммарная максимальная нагрузка всех выводов 3.3V не должна превышать 300мА.
Выводы GPIO
GPIO (General Purpose Interput Output) — контакты общего назначения для ввода/вывода данных. Могут быть сконфигурированы как входы или выходы и программно назначены на различные функции. Распиновка представлена на рисунке.
Выводы управления
RST (Reset) — вывод используется для сброса микроконтроллера ESP8266.
EN (Chip Enable) — при подаче на вывод сигнала высокого уровня, микроконтроллер ESP8266 переходит в рабочий режим, при сигнале низкого уровня — в режим низкого энергопотребления (режим энергосбережения).
WAKE — вывод используется для пробуждения чипа ESP8266 из режима глубокого сна (deep-sleep mode).
АЦП (ADC)
ADC0 / TOUT — вывод встроенного 10-разрядного аналого-цифрового преобразователя (АЦП). Преобразованные значения лежат в интервале 0-1023.
Плата разработки NodeMCU V2 имеет внутренний делитель напряжения, входной диапазон АЦП составляет 0 — 3,3 В.
UART
UART — асинхронный последовательный интерфейс устанавливает связь с другими устройствами по шине UART.
SPI
SPI (Serial Peripheral Interface) — последовательный периферийный интерфейс. NodeMCU имеет два SPI (SPI и HSPI) в ведущем и подчиненном режимах.
SDIO
SDIO — интерфейс безопасных цифровых входов/выходов, предназначен для коммутации с внешней флэш-памятью стандарта SD по последовательной шине.
Reserved
FLASH
Кнопка Flash на NodeMCU подключает к земле GPIO0. Ее можно использовать как обычную кнопку. Если программно подтянуть вывод GPIO0 с помощью внутреннего подтягивающего резистора к высокому уровню, то появление низкого уровня на этом выводе будет означать, что кнопка нажата.
Интерфейс I2C — последовательная асимметричная шина. I2C используется для подключения датчиков и периферийных устройств. NodeMCU ESP8266 не имеет аппаратных выводов I2C, но интерфейс можно реализовать программно. Поддерживаются как I2C Master, так и I2C Slave. Обычно в качестве контактов I2C используются следующие выводы.
PWM (pulse-width modulation) — широтно-импульсная модуляция (ШИМ) управляет мощностью методом пульсирующего включения и выключения вывода. NodeMCU поддерживает программный ШИМ на выводах, обозначенных на рисунке изгибающейся линией.

CLK (GPIO6), SDO (GPIO7), CMD (GPIO11), SD1 (GPIO8), SD2 (GPIO9) и SD1 (GPIO10) — вывода подключены к Flash чипу в модуле ESP-12E, не рекомендуется использовать.
Выводы GPIO6-GPIO11 (SDIO) привязаны к встроенной памяти и не рекомендуются к использованию в других целях, кроме подключения внешней памяти. Все цифровые контакты ввода/вывода, за исключением GPIO16, поддерживают обработку прерываний.
TX (GPIO1), RX (GPIO3) — контакты для загрузки прошивки и связи с компьютером, не рекомендуется использовать.
Материалы по теме:
Размещение этой статьи на других сайтах как полностью, так и частично разрешено только после согласования с администрацией myROBOT.RU
Arduino.ru

Если я не буду использовать режим deep sleep то и резистор на GPIO_16 не нужен и я могу использовать этот пин?
Для чего нужна подтяжка GPIO_2 к питанию? (у кого-то на схемах есть, у кого-то нет).

Эти пины можно использовать на вход/выход?
- Войдите на сайт для отправки комментариев
Сб, 14/05/2022 — 21:34

Зарегистрирован: 28.06.2017
Второй аппаратный UART (Serial1) работает только на передачу?
SoftSerial поддерживается на всех пинах?
- Войдите на сайт для отправки комментариев
Сб, 14/05/2022 — 21:36
Зарегистрирован: 19.10.2016
Там табличка — какие пины стоит юзать.
- Войдите на сайт для отправки комментариев
Сб, 14/05/2022 — 22:27

Зарегистрирован: 28.06.2017
Хорошая статья, Спасибо.
GPIO2: pin is high on BOOT, boot failure if pulled LOW
Про GPIO2 поняла, подтяжка чтобы не было ошибки.
А про эти пины что? Как вход/выход?
GPIO_10 HIGH at Boot
GPIO_9 HIGH at Boot
- Войдите на сайт для отправки комментариев
Сб, 14/05/2022 — 22:32

Зарегистрирован: 17.08.2016
на nodemcu я всю правую строну использую, кроме RX-TX: TFT, датчик температуры-влажности, кнопка, проблем нет работает месяцами
- Войдите на сайт для отправки комментариев
Сб, 14/05/2022 — 22:37

Зарегистрирован: 28.06.2017

А второй uart ? gpio_15 подтянут к gnd
- Войдите на сайт для отправки комментариев
Сб, 14/05/2022 — 22:45

Зарегистрирован: 17.08.2016
только завтра могу все пины расписать, здесь ни скетча ни девайса нет, если не изменяет память на пинах ниже земли висит дисплей, да, тактовая 160 мегагерц используется
- Войдите на сайт для отправки комментариев
Сб, 14/05/2022 — 23:30
Зарегистрирован: 19.10.2016
Irinka пишет:
GPIO_10 HIGH at Boot
Я так понимаю, что на буте некоторые пины переводятся в указанный режим. Так что, если они чем-то управляют, то возможны спецэффекты при загрузке. Релюшка будет щелкать и тп.
- Войдите на сайт для отправки комментариев
Вс, 15/05/2022 — 00:06

Зарегистрирован: 28.06.2017
ua6em пишет:
только завтра могу все пины расписать, здесь ни скетча ни девайса нет, если не изменяет память на пинах ниже земли висит дисплей, да, тактовая 160 мегагерц используется
- Войдите на сайт для отправки комментариев
Вс, 15/05/2022 — 00:07

Зарегистрирован: 28.06.2017
sadman41 пишет:
Irinka пишет:
GPIO_10 HIGH at Boot
Я так понимаю, что на буте некоторые пины переводятся в указанный режим. Так что, если они чем-то управляют, то возможны спецэффекты при загрузке. Релюшка будет щелкать и тп.
Это да, там так же указано
GPIO4 and GPIO5 are the most safe to use GPIOs if you want to operate relays.
- Войдите на сайт для отправки комментариев
Вс, 15/05/2022 — 00:09

Зарегистрирован: 28.06.2017
Мне нужно узнать про uart (буду подключать sim800), а платки ещё в пути, нет возможности попробовать.
- Войдите на сайт для отправки комментариев
Вс, 15/05/2022 — 13:10

Зарегистрирован: 17.08.2016
Irinka пишет:
Мне нужно узнать про uart (буду подключать sim800), а платки ещё в пути, нет возможности попробовать.
UART не использую,
NODEMCU
D8 — TFT-LED
D7 — TFT-SDA
D6 — BUTTON
D5 — TFT-SCK
D4 — TFT-A0
D3 — TFT-RESET
D2 — LED_BUILTIN
D1 — DHT-11
D0 — TFT-CS
- Войдите на сайт для отправки комментариев
Пнд, 16/05/2022 — 21:36

Зарегистрирован: 28.06.2017
Спасибо. Жду платку для грандиозных экспериментов XDDD
- Войдите на сайт для отправки комментариев
Пнд, 16/05/2022 — 21:39

Зарегистрирован: 17.08.2016
Irinka пишет:
Спасибо. Жду платку для грандиозных экспериментов XDDD
мне с оказией досталась SIM800A а у неё не UART а RS-232 на выход )))
- Войдите на сайт для отправки комментариев
Пнд, 16/05/2022 — 21:44

Зарегистрирован: 28.06.2017
Я покупала SIM800L, дешёвые.
Хочется попробовать SIM800C, но пока всё никак что-то.
- Войдите на сайт для отправки комментариев
Пнд, 16/05/2022 — 21:54

Зарегистрирован: 07.09.2017
Зачем? В жизни вы разницы между L C модулями не заметите, по стабильности, командам они одинаковы, разница (ну какую я только в практике заметил) только в логике включения и сброса.
- Войдите на сайт для отправки комментариев
Пнд, 16/05/2022 — 22:11

Зарегистрирован: 28.06.2017
Можно использовать uart0 и для прошивки и для работы с sim800 по такой схеме?

- Войдите на сайт для отправки комментариев
Втр, 17/05/2022 — 10:31

Зарегистрирован: 18.08.2018
ИМХО не ту линию разделили. Tx от SIM800 «коротит» на Tx USB-UART. Если SIM800 выставит «0», а USB-UART «1» .
- Войдите на сайт для отправки комментариев
Втр, 17/05/2022 — 12:32

Зарегистрирован: 07.09.2017
Komandir пишет:
ИМХО не ту линию разделили. Tx от SIM800 «коротит» на Tx USB-UART. Если SIM800 выставит «0», а USB-UART «1» .
а мне кажеться нормально все соеденено, и конечно одновременно только одно устройство может передавать данные, и вообще USB-UART цеплять параллельно модему так себе затея. если уж нужно контролировать что шлется в модем, то стОит TX USB-UART совсем отключить.
- Войдите на сайт для отправки комментариев
Втр, 17/05/2022 — 21:58

Зарегистрирован: 28.06.2017
Нужно не для контроля, sim800 будет постоянно подключен к uart, а usb ttl будет только подключаться для прошивки
- Войдите на сайт для отправки комментариев
Втр, 17/05/2022 — 21:59

Зарегистрирован: 28.06.2017
не хочу делать переключатель подключения конвертера и модема
- Войдите на сайт для отправки комментариев
Втр, 17/05/2022 — 22:09

Зарегистрирован: 17.08.2016
Irinka пишет:
не хочу делать переключатель подключения конвертера и модема
по хорошему надо бы, хотя бы джампера
- Войдите на сайт для отправки комментариев
Втр, 17/05/2022 — 22:17
Зарегистрирован: 07.04.2021
Irinka пишет:
Нужно не для контроля, только подключаться для прошивки
Чем ОТА не устраивает?
- Войдите на сайт для отправки комментариев
Чт, 19/05/2022 — 15:02

Зарегистрирован: 28.06.2017
Об этом я не подумала, можно оставить один пин, который будет отвечать за разрешение OTA прошивки.
- Войдите на сайт для отправки комментариев
Чт, 19/05/2022 — 15:31

Зарегистрирован: 17.08.2016
Irinka пишет:
Об этом я не подумала, можно оставить один пин, который будет отвечать за разрешение OTA прошивки.
- Войдите на сайт для отправки комментариев
Чт, 19/05/2022 — 16:53

Зарегистрирован: 28.06.2017
#include #include #include #include const char* ssid = «YOUR_SSID»; const char* password = «YOUR_PASSWORD»; const byte OTA_PIN = 2; byte Flag_OTA = false; void setup() < pinMode(OTA_PIN, INPUT); if (OTA_PIN) < Flag_OTA = true; WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) < delay(5000); ESP.restart(); >ArduinoOTA.begin(); > > void loop()
- Войдите на сайт для отправки комментариев
Чт, 19/05/2022 — 17:54

Зарегистрирован: 17.08.2016
понятно ))) (слона то я и не приметил)
- Войдите на сайт для отправки комментариев
Чт, 19/05/2022 — 20:14
Зарегистрирован: 27.12.2016
Научите ESP шить по ота через WEB, тогда и этот пин будет вам освобожден.
- Войдите на сайт для отправки комментариев
Чт, 19/05/2022 — 21:48

Зарегистрирован: 17.08.2016
Научите ESP шить по ота через WEB, тогда и этот пин будет вам освобожден.
я так понял Иринке надо иметь возможность блокировать прошивку через OTA
- Войдите на сайт для отправки комментариев
Пт, 20/05/2022 — 13:39

Зарегистрирован: 28.06.2017
Да да, нужно отключать вай фай
- Войдите на сайт для отправки комментариев
Пт, 20/05/2022 — 15:28

Зарегистрирован: 17.08.2016
Irinka пишет:
Да да, нужно отключать вай фай
правильные мысли видимо приходят глядя на вашу аватарку )))
Сами рисовали?
- Войдите на сайт для отправки комментариев
Вс, 22/05/2022 — 11:56

Зарегистрирован: 28.06.2017
- Войдите на сайт для отправки комментариев
Вс, 22/05/2022 — 12:39

Зарегистрирован: 17.08.2016
Irinka пишет:
вот. а обнадёжили в своих талантах. и как мне теперь с этой душевной травмой жить? )))
- Войдите на сайт для отправки комментариев
Ср, 25/05/2022 — 09:50

Зарегистрирован: 28.06.2017
warning: move_uploaded_file(tmp/1111.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in /usr/local/www/data/general/data/www/arduino.ru/includes/file.inc on line 629. warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/var/tmp/phpzRFNak' to 'tmp/1111.jpg' in /usr/local/www/data/general/data/www/arduino.ru/includes/file.inc on line 629. Ошибка закачки файла. Невозможно переместить закачанный файл.
Не получилось порадовать новой аватаркой
- Войдите на сайт для отправки комментариев
Ср, 25/05/2022 — 11:14

Зарегистрирован: 28.06.2017

Я не поняла, минимальное напряжение логической единицы это 0,75 Вольт или 3,3*0,75=2,5 Вольт
- Войдите на сайт для отправки комментариев
Ср, 25/05/2022 — 11:21

Зарегистрирован: 17.08.2016
Irinka пишет:
Я не поняла, минимальное напряжение логической единицы это 0,75 Вольт или 3,3*0,75=2,5 Вольт
это стандартное напряжение логическое единицы 0,75 от напряжения питания
- Войдите на сайт для отправки комментариев
Ср, 25/05/2022 — 11:23

Зарегистрирован: 17.08.2016
Irinka пишет:
warning: move_uploaded_file(tmp/1111.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in /usr/local/www/data/general/data/www/arduino.ru/includes/file.inc on line 629. warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/var/tmp/phpzRFNak' to 'tmp/1111.jpg' in /usr/local/www/data/general/data/www/arduino.ru/includes/file.inc on line 629. Ошибка закачки файла. Невозможно переместить закачанный файл.
Не получилось порадовать новой аватаркой
и эта устраивает, а как старого футуролога даже интригует )))
- Войдите на сайт для отправки комментариев
Ср, 25/05/2022 — 11:27

Зарегистрирован: 28.06.2017
То есть при питании 3,3 Вольт, при 2 Вольтах на входе должен быть стабильный LOW
- Войдите на сайт для отправки комментариев
Модуль Wi-Fi ESP8266 (ESP-01): подключение, прошивка и распиновка

Модуль ESP-01 с чипом ESP8266 предназначен для связи устройства с беспроводными сетями по WiFi.
Видеообзор
Общие сведения
ESP-01 — плата-модуль WiFi на базе популярного чипсета ESP8266EX . На борту платы находится микросхема Flash-памяти объёмом 2 МБ, чип ESP8266EX, кварцевый резонатор, два индикаторных светодиода и миниатюрная антенна из дорожки на верхнем слое печатной платы в виде змейки. Flash-память необходима для хранения программного обеспечения. При каждом включении питания, ПО автоматически загружается в чип ESP8266EX.
По умолчанию модуль настроен на работу через «AT-команды». Управляющая плата посылает команды — Wi-Fi модуль выполняет соответствующую операцию.
Но внутри чипа ESP8266 прячется целый микроконтроллер, который является самодостаточным устройством. Прошивать модуль можно на разных языках программирования. Но обо всё по порядку.
Работа с AT командами
Подключение и настройка
В стандартной прошивке Wi-Fi модуль общается с управляющей платой через «AT-команды» по протоколу UART.
На всех платах Iskra и Arduino присутствует хотя бы один аппаратный UART — HardwareSerial. Если же по каким то причинам он занят другим устройством, можно воспользоваться программным UART — SoftwareSerial.
HardwareSerial
На управляющей плате Iskra JS и платах Arduino с микроконтроллером ATmega32U4 / ATSAMD21G18 данные по USB и общение через пины 0 и 1 осуществляется через два раздельных UART . Это даёт возможность подключить Wi-Fi модуль к аппаратному UART на пинах 0 и 1 .
Список поддерживаемых плат:

Для примера подключим модуль Wi-Fi к платформе Iskra Neo.
Прошейте управляющую платформу кодом ниже.
Код прошивки
// serial-порт к которому подключён Wi-Fi модуль #define WIFI_SERIAL Serial1 void setup() { // открываем последовательный порт для мониторинга действий в программе // и передаём скорость 9600 бод Serial.begin(9600); while (!Serial) { // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с Wi-Fi модулем на скорости 115200 бод WIFI_SERIAL.begin(115200); } void loop() { // если приходят данные из Wi-Fi модуля - отправим их в порт компьютера if (WIFI_SERIAL.available()) { Serial.write(WIFI_SERIAL.read()); } // если приходят данные из компьютера - отправим их в Wi-Fi модуль if (Serial.available()) { WIFI_SERIAL.write(Serial.read()); } }
SoftwareSerial
Некоторые платы Arduino, например Uno, прошиваются через пины 0 и 1 . Это означает невозможность использовать одновременно прошивку/отладку по USB и общение с Wi-Fi модулем. Решение проблемы — программный UART . Подключите пины TX и RX ESP-модуля к другим контактам управляющей платы и используйте библиотеку SoftwareSerial.

Для примера подключим управляющие пины Wi-Fi модуля TX и RX — на 8 и 9 контакты управляющей платы. Прошейте управляющую платформу кодом ниже.
Код прошивки
// библиотека для работы программного Serial #include // создаём объект для работы с программным Serial // и передаём ему пины TX и RX SoftwareSerial mySerial(8, 9); // serial-порт к которому подключён Wi-Fi модуль #define WIFI_SERIAL mySerial void setup() { // открываем последовательный порт для мониторинга действий в программе // и передаём скорость 9600 бод Serial.begin(9600); while (!Serial) { // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с Wi-Fi модулем на скорости 115200 бод WIFI_SERIAL.begin(115200); } void loop() { // если приходят данные из Wi-Fi модуля - отправим их в порт компьютера if (WIFI_SERIAL.available()) { Serial.write(WIFI_SERIAL.read()); } // если приходят данные из компьютера - отправим их в Wi-Fi модуль if (Serial.available()) { WIFI_SERIAL.write(Serial.read()); } }
HardwareSerial Mega
На платах форм-фактора Arduino Mega 2560 аппаратный UART, который отвечает за передачу данных через пины 1 и 0 , отвечает также за передачу по USB. Это означает невозможность использовать одновременно UART для коммуникации с Wi-Fi модулем и отладки по USB.
Но на платах такого форм-фактора есть ещё дополнительно три аппаратных UART:
Serial1: пины 19(RX1) и 18(TX1) ;
Serial2: пины 17(RX2) и 16(TX2) ;
Serial3: пины 15(RX3) и 14(TX3) .
Список поддерживаемых плат:

Подключите Wi-Fi модуль к объекту Serial1 на пины 18 и 19 на примере платы Mega 2560 Прошейте управляющую платформу кодом ниже.
Код прошивки
// serial-порт к которому подключён Wi-Fi модуль #define WIFI_SERIAL Serial1 void setup() { // открываем последовательный порт для мониторинга действий в программе // и передаём скорость 9600 бод Serial.begin(9600); while (!Serial) { // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с Wi-Fi модулем на скорости 115200 бод WIFI_SERIAL.begin(115200); } void loop() { // если приходят данные из Wi-Fi модуля - отправим их в порт компьютера if (WIFI_SERIAL.available()) { Serial.write(WIFI_SERIAL.read()); } // если приходят данные из компьютера - отправим их в Wi-Fi модуль if (Serial.available()) { WIFI_SERIAL.write(Serial.read()); } }
Примеры работы
Рассмотрим несколько примеров по работе с «AT-командами»
Тестовая команда «AT»
Откройте монитор порта. Настройте скорость соединения — 9600 бод. Конец строки — NL & CR . Введите команду AT и нажмите «Отправить». Это — базовая команда для проверки работы Wi-Fi модуля.
В ответ получим «OK»:
Если ответа нет или появляются непонятные символы — проверьте правильность подключения и настройки скорости обмена данными.
Настройка режима работы
Wi-Fi модуль умеет работать в трёх режимах:
ESP8266. Начало работы, особенности


В этом уроке поговорим о микроконтроллере ESP8266 и платах на его основе. Как с ними работать и чем они отличаются от Arduino на базе МК AVR. ESP8266 – китайский микроконтроллер за 2 доллара с большим объемом памяти и WiFi связью на борту. Официальная документация:
- https://github.com/esp8266/Arduino/blob/master/doc/reference.rst
- https://arduino-esp8266.readthedocs.io/en/latest/
Купить на Aliexpress
Дёшево купить Wemos Mini можно тут: ссылка, ссылка, ссылка. Рекомендуется брать версию как слева на картинке выше, на базе полного чипа ESP-12.
Уроки по работе с esp8266
Конкретные уроки по работе с платой и WiFi библиотеками публикуются на сайте набора GyverKIT, так как уроки на этом сайте являются общими по программированию Arduino, без углубления в сторонние библиотеки.
Характеристики
- Напряжение питания: 3.3V (2.5-3.6V)
- Ток потребления: 300 мА при запуске и передаче данных, 35 мА во время работы, 80 мА в режиме точки доступа
- Максимальный ток пина – 12 мА.
- Flash память (память программы): 1 МБ
- Flash память (файловое хранилище): 1-16 МБ в зависимости от модификации
- EEPROM память: до 4 кБ
- SRAM память: 82 кБ
- Частота ядра: 80/160 МГц
- GPIO: 11 пинов
- ШИМ: 10 пинов
- Прерывания: 10 пинов
- АЦП: 1 пин
- I2C: 1 штука (программный, пины можно назначить любые)
- I2S: 1 штука
- SPI: 1 штука
- UART: 1.5 штуки
- WiFi связь
Начало работы
Для работы с платами на основе esp8266 нужно установить ядро и драйвер.
- Идём в Файл/Настройки/Дополнительные ссылки для менеджера плат. Вставляем ссылку https://arduino.esp8266.com/stable/package_esp8266com_index.json.
- Инструменты/Плата/Менеджер плат…, ищем в поиске esp8266 и устанавливаем. В списке плат появится семейство плат на базе esp8266.
- На большинстве плат стоит USB конвертер CH340, как на всех китайских Ардуинах. Если вы ещё не устанавливали драйвер – читать здесь.
Настройки платы
Для работы с любой платой (даже самодельной) можно выбрать пункт Generic esp8266, будет доступен полный набор настроек. Для работы с Wemos Mini выбираем LOLIN Wemos D1 R2 mini. Настроек станет меньше, а к пинам платы можно будет обращаться в программе по их подписям на плате (Dn). Основные настройки:
- Upload speed: скорость загрузки прошивки. Можно смело поднимать до 921600.
- CPU Frequency: частота тактирования процессора. Для большинства задач хватит стандартных 80 МГц. На 160 МГц будет работать шустрее, но могут быть сбои.
- Flash Size: распределение памяти, настройка имеет вид xMB (FS:xMB OTA:~xKB). Размер памяти под программу не меняется – это всегда 1 МБ.
- Первое число: полный объём микросхемы памяти (в основном 4MB, на Wemos и NodeMCU стоят такие).
- Второе число: объём под файловое хранилище.
- Третье число: объём под OTA (обновление по воздуху) – всегда меньше 1 МБ.
- Что выбрать? У Wemos самый ходовой – первый вариант: 4MB (FS:2MB OTA:~1019KB).
- DOUT: медленный, но совместим со всеми модификациями esp8266.
- QIO: более быстрый, но будет работать не на всех чипах.
- Only Sketch: стереть только программу.
- Sketch + WiFi Settings: стереть программу и настройки WiFi (логин-пароль последнего подключения и т.д.).
- All Flash Contents: полностью очистить память.
Нумерация пинов
У самого чипа esp8266 все выводы пронумерованы цифрами. На распиновке они подписаны как GPIOn, где n – номер. На плате (NodeMCU, Wemos Mini) пины подписаны как Dn и эти номера не совпадают с номерами GPIO! При работе например с Wemos можно использовать как нумерацию выводов GPIO ( digitalWrite(5, LOW) ), так и D-нумерацию пинов на плате ( digitalWrite(D1, LOW) ) – если выбрана плата Wemos. Новички очень часто в этом путаются, будьте внимательны. Также GPIO1 и GPIO3 подписаны на плате как TX и RX, по этим названиям к ним тоже можно обращаться ( digitalWrite(TX, LOW) ).

Особенности пинов
У esp8266 много системных пинов, с которыми нужно быть очень внимательным.

- К целому ряду пинов подключена внешняя Flash память, в общем случае их использовать нельзя (если очень нужно – ищите информацию). На плате NodeMCU визуально гораздо больше пинов, чем на Wemos Mini, но по факту “безопасных” для использования пинов там ровно столько же.
- С оставшимися пинами тоже не всё гладко: некоторые из них требуют наличия определенного логического уровня на момент включения микроконтроллера (подача питания, перезагрузка). Если к этим пинам подключить что-то, дающее противоположный сигнал – esp не запустится. Вот распиновка с нужным уровнем сигнала при запуске:
- На плате (NodeMCU, Wemos и других) эти пины уже подтянуты резисторами к нужному напряжению, поэтому нужно несколько раз подумать, что вы к ним подключаете и как оно повлияет на напряжение на пине. Например, можно подключить энкодер, он прижмёт системный пин к GND и esp не запустится.
- На GPIO16/D0 нельзя подключать прерывания ( attachInterrupt() ) и включать ШИМ сигнал ( analogWrite() ).
- Максимальный ток с GPIO – 12 мА.
- Светодиод LED_BUILTIN находится на пине GPIO2 и его поведение инвертировано: при подаче LOW он включается и наоборот.
- При старте контроллера почти все пины делают скачок до высокого уровня, подробнее – в этой статье. Единственными “спокойными” пинами являются D1 (GPIO5) и D2 (GPIO4). Если контроллер управляет напрямую какими-то железками (реле, транзистор, или является “кнопкой” для другого устройства), то лучше использовать именно эти пины!
- На этих же пинах сидит I2C, но шину можно переназначить на любые другие пины через Wire.begin(sda, scl) .
Особенности работы WiFi
WiFi реализован синхронно, его обработчик должен постоянно вызываться во время работы программы не реже, чем каждые 20 мс (если WiFi используется в программе). Обработка WiFi происходит в следующих местах:
- Автоматически в конце каждой итерации loop()
- Внутри любого delay()
- Внутри функции yield()
Если у вас есть участки программы, которые долго выполняются, то нужно разместить вызовы yield() до и после тяжёлых блоков кода. Также в чужих скетчах можно встретить delay(0) , по сути это и есть yield() .
По тем же причинам не рекомендуется использовать задержку delayMicroseconds() более чем на 20’000 мкс.
Отличия от AVR Arduino
Деление на 0
В отличие от AVR, деление на 0 приводит к критической ошибке и перезагрузке микроконтроллера. Стараемся этого избегать.
min() и max()
В ядре esp8266 функции min() и max() реализованы как функции, а не как макросы, поэтому должны использоваться с данными одного типа. Использование переменных разного типа приведёт к ошибке компиляции.
map()
В функции map(val, min, max, to min, to max) нет защиты от деления на 0, поэтому если min равен max – микроконтроллер зависнет и перезагрузится. Если min и max задаются какими-то внешними условиями – проверяйте их равенство вручную и исключайте вызов map() с такими аргументами.
Типы данных
- Тип int является синонимом long ( int32_t ) и занимает 4 байта. В AVR int это int16_t , то есть 2 байта.
- Тип char является синонимом byte – принимает значения 0.. 255 в отличие от -128.. 127 в AVR.
- Тип double имеет полную двойную точность – 8 байт. В AVR это 4 байта.
- Указатель занимает 4 байта, так как область памяти тут 32-битная. В AVR – 2 байта.
Функция analogRead()
ESP8266 имеет крайне убогий одноканальный АЦП.
- Сам АЦП в esp8266 может измерять напряжение в диапазоне 0.. 1.0V. На платах (NodeMCU, Wemos Mini) стоит делитель напряжения, который расширяет диапазон до более удобных 3.3V.
- Разрешение – 10 бит, т. е. значения 0.. 1023 как на Arduino
- Частый вызов analogRead() замедляет работу WiFi. При вызовах чаще нескольких миллисекунд WiFi полностью перестаёт работать.
- Результат analogRead() имеет кеширование до 5 мс, то есть полученные данные могут запаздывать на это время.
- АЦП может использоваться для измерения напряжения питания МК: для этого нужно вызвать ADC_MODE(ADC_VCC); до void setup() , а само напряжение питания можно получить из ESP.getVcc() .
Функция analogWrite()
- Работает на всех пинах, кроме GPIO16.
- Разрядность ШИМ по умолчанию 8 бит (0.. 255) на версиях ядра 3.x. На ранних версиях – 10 бит (0.. 1023). Скажем спасибо индусам за совместимость.
- Разрядность можно настроить в analogWriteResolution(4. 16 бит) .
- Частоту можно настроить в analogWriteFreq(100.. 40000 Гц) .
Аппаратные прерывания
- Настраиваются точно так же, через attachInterrupt() .
- Работают на всех пинах, кроме GPIO16.
- Функция-обработчик должна быть объявлена с атрибутом IRAM_ATTR :
void setup() < attachInterrupt(1, myIsr, RISING); >IRAM_ATTR void myIsr()
Либо с ICACHE_RAM_ATTR (на старых версиях ядра), вот так:
void ICACHE_RAM_ATTR myIsr() < >void setup()Функция yield()
В реализации esp8266 функция yield() выполняет другую задачу и использовать её как на AVR не получится. Скажем спасибо индусам за совместимость
EEPROM
EEPROM в esp8266 является эмуляцией из Flash памяти, поэтому мы можем выбрать нужный размер.
- Перед началом работы нужно вызвать EEPROM.begin(4.. 4096) с указанием размера области памяти в байтах.
- Для применения изменений в памяти нужно вызвать EEPROM.commit() .
- В некоторых версиях SDK отсутствует EEPROM.update() и EEPROM.length() .
- У Flash памяти небольшой ресурс – всего около 10’000 перезаписей. У фирменной памяти Winbond (можно найти на некоторых моделях ESP-12 и прочих) – около 50’000 перезаписей.
В остальном работа с библиотекой EEPROM.h ничем не отличается.
Важно: EEPROM реализован следующим образом: после запуска EEPROM.begin(4.. 4096) содержимое EEPROM указанного размера дублируется в оперативной памяти. После любого изменения и вызова EEPROM.commit() стирается весь блок Flash памяти (4 кБ) и записывается заново. Таким образом ресурс “EEPROM” памяти у ESP вырабатывается довольно быстро и весь сразу, а не по ячейкам.
Serial (UART)
- В отличие от реализации для AVR, можно изменить размер буфера на приём: Serial.setRxBufferSize(размер) в байтах. Вызывать перед Serial.begin() , по умолчанию 256 байт.
- Можно настроить работу только на приём или только на отправку для освобождения пина: Serial.begin(скорость, SERIAL_8N1, режим) , где режим:
- SERIAL_TX_ONLY – только отправка
- SERIAL_RX_ONLY – только приём
- SERIAL_FULL – приём и отправка (по умолчанию)
Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])