ESP8266 — китайский микроконтроллер (далее МК) от производителя Espressif с поддержкой WiFi-интерфейса. Часто этот МК позиционируют только как WiFi-модуль, который работает в связке с другими МК. Однако встроенных возможностей МК серии ESP достаточно для реализации большого количества проектов.
В большинстве случаев этот МК применяют в системах автоматизации быта и IoT (Internet of Things — Интернете вещей). Управлять всем этим можно не только с браузера, но и из приложений на Android/iOS/Desktop, хотя первый вариант имеет больше «кроссплатформенности», т. к. сейчас браузер есть почти на всём — от часов до телевизоров. Если МК будет применяться там, куда не достаёт WiFi-сеть, либо её там попросту и не должно быть (дачи, теплицы), то ESP8266 может работать в режиме точки доступа. У этого МК уже существует более мощный и продвинутый брат — ESP32.
Примечание В этой статье не будут рассмотрены практические примеры применения ESP8266. Речь пойдёт об основных преимуществах и возможностях этого МК.
У этого МК нет встроенной flash-памяти, поэтому он работает с внешней flash-памятью по интерфейсу SPI. В большинстве популярных версий МК её объём варьируется от 512 Кбайт до 4 Мбайт. При желании и умении микросхему памяти можно будет перепаять на версию до 32 Мбайт.
Разновидности МК серии ESP и их плат
Существует около полутора десятка версий МК серии ESP и огромное количество плат с ними. Рассмотрим самые популярные из них.
Микроконтроллеры
ESP-01
Микроконтроллер ESP-01. Источник
Считается самым популярным из серии. Имеет 8 разведённых контактов (VCC, GND, UTXD, URXD, CH_PD, GPIO0, GPIO2, GPIO6) и PCB-антенну (печатный проводник на самой плате). Из разведённых выводов тут присутствуют только 3 GPIO, но не стоит видеть в этом одни минусы. Если нужно будет управлять одним реле или получать данные с датчика температуры, вам не понадобятся все выводы МК, достаточно будет лишь пары. К тому же, существуют платы и шилды с возможностью простой коммутации именно к этой версии МК. Например такая:
Плата WiFi-реле. Источник
ESP-03
Плата ESP-03. Источник
Здесь появляется керамическая антенна. Она считается немного эффективней своего печатного собрата. Также на плате разведены все доступные выводы GPIO. В этой статье описана разница между типами антенн.
ESP-07
Плата ESP-07. Источник
В этой версии в глаза сразу бросается металлический экран (который перед этим появляется на ESP-06). На борту керамическая антенна и разъём для внешней антенны.
ESP-12
Разные варианты микроконтроллера ESP-12. Источник
В свою очередь, существует несколько вариантов этой версии: ESP-12S, ESP-12F, ESP-12E. Вторая и третья версии имеют на торце дополнительно 6 разведённых контактов.
Платы
WeMos D1 mini
Плата WeMos D1 mini. Источник
Имеет распайку девяти GPIO-контактов. На плате имеется небезызвестный мост CH34x (такие часто ставят на клоны Arduino). Установлен МК с 4 Мбайт flash-памяти. Недостаток для некоторых — придётся самому паять контакты на плату (идут в комплекте). Конструкционно совместима с различными выпускаемыми шилдами реле/датчиками.
NodeMCU v0.9/v1
Плата NodeMCU v0.9. Источник
Первое поколение плат серии NodeMCU. На ней распаяны все 11 GPIO-портов. Некоторые из них обладают дополнительными функциями (UART, I2C, SPI, PWM, ADC). Хотя на плате впаяны контакты, она занимает всю ширину беспаечной макетной платы, что затрудняет работу на ней. МК имеет 4 Мбайт flash-памяти. Также имеется мост CH340.
NodeMCU v3
Плата NodeMCU v3. Источник
Финальная версия платы этой серии. Существует и v2 «Amica», которая меньше по габаритам. v3 носит название «LoLin» и отличается от предыдущей версии только размерами и незначительными деталями (например дополнительной распайкой шины питания). Кроме традиционного моста CH340/CH341 на платы ставят чип CP2102, так что внимательней с выбором драйвера на них.
Характеристики
Все эти (и не только эти) микроконтроллеры выполнены на чипсете ESP8266EX, а следовательно, характеристики у них одинаковые:
- Протоколы: 802.11 b/g/n/e/i.
- Диапазон частот: 2.4 ГГц – 2.5 ГГц.
- Процессорное ядро: Tensilica L106 32 разряда.
- Диапазон напряжений питания: 2.5 В – 3.6 В.
- Среднее потребление тока: 80 мA.
- Режимы WiFi: Station/SoftAP/SoftAP+Station.
- Безопасность: WPA/WPA2.
- Шифрование: WEP/TKIP/AES.
- Обновление прошивки: через UART, по радиоканалу (OTA — Other The Air).
- Сетевые протоколы: IPv4, TCP/UDP/HTTP/FTP.
- Поддержка WiFi Direct (P2P), P2P Discovery, P2P GO (Group Owner) mode, GC (Group Client) mode, P2P Power Management.
- Встроенные аппаратные ускорители: CCMP (CBC-MAC, режим счётчика), TKIP (MIC, RC4), WAPI (SMS4), WEP (RC4), CRC.
- Поддержка LUA-скриптов.
Как работать с ESP8266?
Есть два способа работы с ним: управление через AT-команды и автономная работа со своей прошивкой. В первом случае ESP8266 работает только в паре с другими МК, во втором — может работать независимо (хотя никто не запрещает присоединить её к другому МК).
Конференция C++ Russia 2020 Moscow
27–28 апреля, Москва и онлайн, 10 750–138 000 ₽
tproger.ruСобытия и курсы на tproger.ru
«Из коробки» МК поставляется с прошивкой для работы через AT-команды. Для этого ESP8266 подключается к любому другому МК по UART-интерфейсу. Для демонстрации работы AT-команд ESP8266 можно подключить к компьютеру через USB-UART переходник и запустить монитор последовательного порта (например из Arduino IDE). Про то, как работать с этими командами, можно прочитать в этой статье.
Прошивка
В большинстве случаев намного удобней прошивать МК и работать с ним со своей прошивкой. Однако тут тоже есть свои нюансы. Вот 3 варианта событий:
- У вас «голый» ESP8266, например ESP-01. Вам потребуется USB-UART переходник, который нужно подключить к МК. Этот переходник обязательно должен быть на 3-вольтовой логике, т. к. иначе можно легко отправить ваш МК в кибер-Вальхаллу. Про процесс подключения можно прочитать здесь.
- Второй случай идентичен первому, кроме того, что вместо переходника можно использовать любую плату Arduino. Достаточно специальным образом подключить ESP8266 к UART-контактам Arduino, а её саму «отключить», замкнув контакт аппаратного сброса (RESET) на землю. Естественно, питать ESP8266 нужно будет от шины питания 3.3 В. В этом случае в качестве переходника USB-UART будет выступать мост (чаще всего CH340) на самой плате Arduino. Этот процесс также описан в статье выше.
- Лучший вариант — это плата с USB-UART мостом на борту (как NodeMCU, WeMos и прочие). В этом случае ничего дополнительного делать не нужно — просто подключайте плату через USB.
В чём прошивается?
Существует несколько софтов для прошивки МК. Например NodeMCU Flasher (которая подходит не только для плат NodeMCU) или ESPTool (необходим Python).
Однако в этой статье работа с МК и процесс прошивки будут рассмотрены в Arduino IDE.
Изначально среда Arduino IDE не предназначена для работы с МК серии ESP. Чтобы это исправить, идём в Файл → Настройки и в поле Дополнительные ссылки для Менеджера плат вставляем эту ссылку:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Потом открываем Инструменты → Плата → Менеджерплат и в открывшемся списке в самом низу находим плату «esp8266 by ESP8266 Community» (если с этим возникли трудности — используем поиск вверху окна). Устанавливаем последнюю версию платы (около 150 Мбайт).
После установки в списке плат появится немалое количество плат. Если не нашли свою плату или не знаете её названия — выбирайте Generic ESP8266 Module. Теперь можно выбрать свой МК в списке COM-портов.
Теперь что касается скорости передачи. У ESP8266 две скорости передачи: основная — её вы указываете при инициализации последовательного порта, и скорость, на которой передаётся отладочная информация. Она передаётся сразу после подачи питания на МК. Обычно это скорости 115200 бод и 74800 бод 0 соответственно.
Основы
Если вы не владеете базовыми знаниями работы с платформой Arduino, наверстать упущенное можно здесь:
Arduino: выбор платы, подключение и первая программаtproger.ru
После скачивания платы ESP8266 с помощью менеджера, в примерах появится большое количество скетчей. Рассмотрим один из них (Файл → Примеры → ESP8266WebServer → HelloServer):
#include <esp8n> #include <wificlient> <esp8266webserver> "........"; // Указываем имя существующей точки доступа const char* password = "........"; // Указываем пароль существующей точки доступа ESP8266WebServer server(80); void handleRoot() { // Обработчик запроса клиента по корневому адресу // Отправляем клиенту server.send(200, "text/plain", "Привет от ESP8266!"); } void handleNotFound() { // Обрабатываем небезызвестную ошибку 404 String message = "File Not Foundnn"; message += "URI: "; message += server.uri(); message += "nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "nArguments: "; message += server.args(); message += "n"; for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "n"; } server.send(404, "text/plain", message); } void setup(void) { Serial.begin(115200); WiFi.mode(WIFI_STA); // Устанавливаем Wi-Fi модуль в режим клиента (STA) WiFi.begin(ssid, password); // Устанавливаем ssid и пароль от сети, подключаемся while (WiFi.status() != WL_CONNECTED) { // Ожидаем подключения к Wi-Fi delay(500); Serial.print("."); } // Выводим информацию о подключении Serial.println(""); Serial.print("Подключено к "); Serial.println(ssid); Serial.print("IP адрес: "); Serial.println(WiFi.localIP()); // Устанавливаем обработчики. Можно сделать двумя способами: server.on("/", handleRoot); server.on("/inline", []() { server.send(200, "text/plain", "Отличная работа!"); }); server.onNotFound(handleNotFound); // Вызывается, когда обработчик не назначен // Запускаем сервер server.begin(); Serial.println("HTTP-сервер запущен"); } void loop(void) { server.handleClient(); } </esp8n>
Что делает этот скетч? МК подключается к вашей WiFi-сети и запускает сервер. В монитор последовательного порта выведется локальный IP-адрес (к примеру, 192.168.0.105
). Вбиваем этот IP в адресную строку браузера, после чего в нём должна отобразиться строка «Привет от ESP8266!». Таким же образом можно проверить адрес /inline
.
Ознакомиться с API МК можно в их официальном репозитории.
Распределение памяти
Как уже говорилось — встроенной памяти чипсет не имеет, а поэтому используется внешняя — от 512 Кбайт до 4 Мбайт. Эта память распределена на следующие разделы:
- скетчи (память для прошивки);
- файловая система SPIFFS;
- OTA-Update (прошивка, переданная «по воздуху»);
- EEPROM (да-да, её у МК тоже нет, поэтому она имитируется на flash-памяти);
- конфигурация WiFi.
Файловая система SPIFFS
Во внешней flash-памяти явно есть свои «плюшки». Одна из них — файловая система. Как это ни странно, в неё можно с лёгкостью записать файлы (как на какой-нибудь накопитель). На аппаратном уровне это можно было бы реализовать подключив к МК модуль SD-карт. Однако это решение требует свободных портов (которых иногда может не быть). Поэтому SPIFFS является очень полезным в данном плане.
Для чего? На МК часто заливаются веб-странички, медиа-файлы и прочее. Если HTML-страницу в 20 строк ещё приемлемо хранить в коде, то что делать с большими сайтами? При каждом изменении менять в коде? А с изображениями как? Сериализовать (бывает и такое) и тоже вставлять в код? Вот в таких случаях и спасает файловая система.
Размер файловой системы (от 32 Кбайт до 15 Мбайт) зависит от самого объема flash-памяти и от конфигурации, выставленной в Инстурменты → Flash size. Например, конфигурация 4M (2M SPIFFS)
предназначена для МК с общим объёмом flash-памяти 4 Мбайт, 2 Мбайт из которых будут выделены под файловую систему.
SPIFFS не работает с папками — она содержит только список файлов. Соответственно, если загрузить в неё папку style, в которой будет файл header.css, то в файловую систему систему запишется файл с именем /style/header.css. Об этом стоит помнить, потому что длина файлового имени не должна превышать 31 символ (читается 32, но символ с кодом 0 отведён под завершение строки). В этот 31 символ, естественно, входят все слэши, точки перед расширением и само расширение. Поэтому придётся воздержаться от многоуровневых структур и длинных имён файлов/папок.
Для загрузки файлов в файловую систему МК потребуется инструмент ESP8266FS, который интегрируется в Arduino IDE. Инструкция по установке:
- Качаем инструмент по ссылке выше.
- В папке Arduino IDE создайте папку tools (если её там ещё нет).
- В папку tools распакуйте скачанный архив. Должно быть так:…/Arduino/tools/ESP8266FS/tool/esp8266fs.jar.
- После запуска среды в папке скетча (Скетч → Показать папку скетча) нужно создать папку data. Её содержимое будет непосредственно загружаться в файловую систему.
- После кликаем в Инструменты → ESP8266 Sketch Data Upload, чтобы загрузить данные в файловую систему. После успешной загрузки в панели статуса высветится «SPIFFS Image Uploaded». Перед процессом загрузки в файловую систему обратите внимание: если открыт монитор последовательного порта — закрываем его.
Как работать с SPIFFS и файлами в ней, можно узнать в этой статье.
Энергонезависимая память EEPROM
Уже упоминалось, что сам чипсет не имеет энергонезависимой памяти, поэтому она имитируется через внешнюю flash-память. Из-за этого работа с ней немного отличается от стандартной. Перед считыванием или записью данных нужно инициализировать EEPROM, указав при этом выделяемую под неё память (от 4 до 4096 байт) функцией EEPROM.begin(size)
. Привычная функция EEPROM.write(addr, value)
записывает данные не на саму энергонезависимую память, а в оперативную. Чтобы внесённые данные записались в память, нужна функция EEPROM.commit()
(или же EEPROM.end()
, чтобы заодно очистить данные из оперативной памяти). Метод EEPROM.read(addr)
возвращает байт из памяти по адресу.
Прошивка «по воздуху» OTA-Update
ESP8266 имеет возможность обновления прошивки по сети WiFi. Это удобно, если МК находится в труднодоступном месте. Кроме того, прошивки «по воздуху» чаще всего быстрее, чем по проводу.
Вам потребуется установленный Python.
Потом в скетч нужно добавить файл: #include <arduinoota>
. Инициализинастраиваем OTA следующими строками:
ArduinoOTA.setHostname("Host-ESP");// Имя хоста ArduinoOTA.setPassword((const char *)"password");// Пароль для подключения к хосту. Если не нужен — комментируем эту строку ArduinoOTA.begin();// Инициализация
После этого достаточно в метод loop()
добавить строку: ArduinoOTA.handle()
.
Прошиваем МК по проводу. В случае успешной загрузки в списке портов появится новый хост с именем «esp8266-xxxxxx», где esp8266 — указанное выше имя хоста, а xxxxxx — локальный IP-адрес МК. Выбираем его. Теперь МК можно прошивать «по воздуху».
За время своего еще недолгого существования ESP8266 успел мутировать во множество модификаций различных размеров и форм, обладающих разными возможностями. Вот и сейчас из Поднебесной мне приехала платка на её основе, которую раньше не приходилось держать в руках. В чем-то интересная, в чем-то забавная. Давайте разбираться. Эта плата имеет имя собственное: Witty. Да уж, остроумия создателям, китайской компании Gizwits, точно не занимать. Вообще, Gizwits позиционирует себя как провайдер решений для умного дома, что бы это не означало. Кроме всего прочего, у этой компании есть свое облако для интернета вещей, которое предполагает в том числе и удаленное управление. Соответственно, есть и поддержка некоторого количества беспроводных устройств. В том числе и ESP 8266 в таком нестандартном исполнении. Для тех, кому лень читать, видеоверсия этого материала:
Модуль
Самое интересное в конструкции этого модуля то, что он состоит из двух отдельных плат: собственно самой платы-контроллера и вспомогательной, служащей для прошивки и общения с компьютером. Рассмотрим их отдельно. Сразу видно, что собран модуль на основе ESP-12. В описании указано, что используется последняя на момент выхода этого материала модель ESP-12F. Так ли это, я сказать не могу, так как визуально различить ESP-12E и ESP-12F затруднительно. Разведены все выводы у ESP-12, причем разведены c шагом в одну десятую дюйма, что позволит без проблем монтировать его на распространённые макетки. Также на модуле установлены: — датчик освещенности. Простой фоторезистор, подключенный к аналоговому входу через делитель; — RGB светодиод формата SMD5050; — кнопка, судя по всему подключенная к GPIO4.Неочевидный момент На ноге Vcc нашего модуля находится не 3.3В, как можно было бы предположить, а 5В. Причем идут они непосредственно от LM1117, что позволяет питать от ноги Vcc существенные нагрузки. Если же нужен 3.3В, взять их можно с ноги CH_PD. На Нижней стороне платы мы видим: — microUSB-разъем, использующийся для питания; — преобразователь 1117, понижающий приходящие с microUSB 5В до рабочих 3.3В; — обвеску для светодиодов, и датчик освещенности.Вторая плата Похоже, она планировалась как Shield для прошивки. На ней виден еще один microUSB-разъем, микросхема ch340 — конвертер USB-UART и кнопки, подписанные как RESET и FLASH. Таким образом, можно предположить, что по задумке производителя вся проводная коммуникация с этим модулем должна проходить через этот Shield. Странно тогда, почему этот Shield сделан не сквозным, чтобы дать возможность посадить его непосредственно на макетку. Получается, для каждого обновления прошивки модуль придется вынимать со схемы, что не особо удобно. Еще один сюрприз ждет нас при попытке установить данный модуль в макетку. Модуль занимает всю ширину бредборда. Соответственно, коммутировать что-то проводами с dupont-разъемами становится затруднительно. А точнее, и вовсе невозможно. Единственное решение, которое приходит мне в голову, это соединить несколько макеток параллельно и подключать модуль сразу к обоим.
Первый запуск
С конструкцией разобрались, теперь подадим на модуль питание через microUSB платы и посмотрим, что произойдет. Загорелся светодиод — значит, модуль работает. Удобно, не нужны никакие дополнительные блоки питания, ведь 500 миллиампер, которые выдает usb-порт, модулю должно хватить. После запуска модуля я рассчитывал увидеть новую сеть, которую по умолчанию создают все 8266 на стандартной прошивке, но этого не произошло, новых сетей в радиусе видимости не обнаружено. Странно… Подключившись к модулю по проводу с помощью утилиты ESPlorer (я по привычке использую его для общения с платой), получил в консоль что-то невразумительное. Похоже — прошивка нестандартная. Ну что ж, подключаться к китайскому облаку я не собираюсь, поэтому прошью модуль чем-то более подходящим. Например, NodeMCU. Для этого снова собираем бутерброд из двух плат и подключаем его уже через microUSB-порт нижнего модуля. Порадовало, что прошивка прошла успешно, без каких-либо проблем. Главное — вовремя нажать кнопку FLASH.Помогите объяснить Во время первых запусков(примерно 2-3 часа экспериментов) модуль существенно грелся. Экран чипа через минуту после старта был по ощущениям примерно 39-40 градусов и температура продолжала расти(через 20 мнут непрерывной работы дохолида до уровня «едва могу прикоснуться»). Стало интеесно, что будет, поэтому я оставил модуль поджариваться и занялся другими делами. Через некоторое время я потрогал модуль — он был комнатной температуры(что типично доя ESP-12) и с тех пор не греется. У кого есть идеи, с чем это может быть связано — напишите, пожалуйста в комментариях.
Работа
Итак, модуль реагирует на команды, подключился к моему wi-fi — вроде бы все в порядке. Что делают в первую очередь с любимым новым модулем или контроллером? Правильно! Мигают светодиодом! Не будем же и мы отступать от традиции. Разглядывая дорожки на плате и экспериментируя я установил, что для управления свечением светодиода используются следующие выходы: GPIO12 — зеленый GPIO13 — синий GPIO15 — красный Причем производитель не удосужился поставить ограничивающие резисторы различного номинала для каждого из цветов, поэтому на полной яркости красный намного тусклее остальных. Впрочем, данные выходы поддерживают ШИМ. И если это кому-то критично, он может подстроить яркость свечения самостоятельно. Теперь черед датчика освещенности. Как и следовало ожидать, этот датчик подключен к единственному аналоговому входу ESP-8266 — adc pin. Показания меняются в соответствии с изменениями освещенности. Вот только светочувствительный резистор, который используется в этом модуле, меняет свои параметры в весьма широком диапазоне. Поэтому при подключении его к ESP-8266 через простейший делитель, как сделано в этом модуле, датчик будет показывать освещенность лишь в узком диапазоне. Чуть темнее — 0, чуть ярче — максимум.
Выводы.
Достоинства Witty: 1. Модуль собран и готов к работе. Не нужно шаманить с подключением, гадать, хватит ли питания. Просто подключили по MicroUSB и вперед! 2. Прошивальщик в комплекте. Не нужно подключать сторонний USB-UART, выводить только лишь для прошивки специальную кнопку. 3. Встроенный датчик освещенности. 4. Размер. Более компактна, чем NodeMCU board. Хотя и занимает всю ширину макетки.Недостатки: 1. Размер. Все-таки, хотелось бы иметь хоть один ряд отверстий в breadboard свободным. 2. Требуется демонтаж с макетки для каждой прошивки(или подключение по Tx, Rx, что убивает идею удобного подключения) 3. Светодиод запараллелен с тремя GPIO Выходами. Либо не использовать их, либо светомузыка.Для кого она: Я бы рекомендовал эту плату тем, кто только планирует знакомство с ESP-8266, хочет вообще понять, нужен ли ему этот контроллер. Таким образом, порог вхождения становится минимальным. Никаких шаманств с подключением, питанием и прочими капризами ESP-8266, которые у многих отбивают охоту продолжать знакомство с контроллером. Также она будет полезна как часть набора для быстрого прототипирования(зачем, собственно, брал её я) или для устройств разового применения(сделал-поработал-разобрал) Ссылка на магазин, где я его брал (не реклама):ru.aliexpress.com/item/Free-Shipping-SMD-Resistor-0805-51R-5-resistor-smd-resistor-51R-5000pcs-reel-in-stock-if/1882818309.htmlМое первое знакомство с Ардуино началось, как ни странно, с модуля ESP8266 Witty Cloud. Все в нем хорошо, но есть нюансы… 1. Для прошивки необходимо демонтировать ESP из собранной схемы. 2. ESP плохо дружит с макетной платой. Первый нюанс «лечится» припаиванием гребенки типа «мама» к прошивочному модулю Witty. «Лишние» ноги запараллелены с GND или VCC, и будут очень кстати при подключении нескольких модулей. Второй нюанс можно подправить «добавлением» еще одной макетной платы. Но все равно получается или/или. На этом тему можно было бы закрывать, но тут приехало пополнение ESP-12F. Первым делом дружим ESP с прошивочным модулем Witty. Добавляем гребенку «мама-мама» для удобства подключения ESP без прошивочного модуля. Гребенка «мама-мама» смотрится не очень, поэтому решаю сразу припаять «маму»: Но как тогда прошивать с помощью Witty, наверное как то так: В стандартной гребенке передвинул пластиковое основание к центру. Прошивается на ура, но как-то громоздко, поэтому решил минимизировать обвес. 1 SMD резистор на 10кОм между GND и GPIO15, другой обычный резистор на 10кОм между VCC CP_PD/EN. Перед прошивкой, делаем ресет с замыкнутым GPIO0 на землю. Конвертер 5В → 3,3В на AMS1117 не помешает. Френдлим ESP-12 с макеткой. Вот такая вот экзотика.Используемые источники:
- https://tproger.ru/articles/about-esp8266/
- https://habr.com/post/391403/
- https://habr.com/post/400997/