ESP8266 — подключение и обновление прошивки. Модуль Wifi на базе чипа ESP8266. Что нужно делать

25.04.2019

JavaScript must be turned on in order to use this page

Прошивка и запуск модуля ESP8266 (updated: 23 Jun 2018, 22:01:16)

Это общая документация по чипу ESP8266. Обратите внимание, что этот чип считается устаревшим, хотя и очень популярным - на смену ему пришел чип ESP32.

Для начала необходимо определить сколько памяти установлено на модуле ESP8266. Встречаются варианты модулей, с установленной памятью 512 кбайт(4 мегабита) , а так же 4мбайт(32 мегабита). Редко, но попадаются с флеш памятью 1 мбайт(8 мегабит). Почти все разновидности ESP-12 и новые ESP-07 имеют на борту 4 мегабайта. Объем памяти можно определить по маркировке flash чипа, посмотреть в программе Flash Download Tool или на вкладке /debug. Маркировка имеет вид 25QXX, где XX - объем в мегабитах, например 25Q32 имеет на борту 32 мегабита=4 мегабайта.

Определение размера памяти по вкладке ip_adr/debug:

Вкладка debug содержит разную полезную информацию, в том числе и реальный размер чипа флеш памяти в строке Flash real size, а так же размер памяти, установленный в прошивающей программе Flash set size, который важен для правильной поддержки OTA.

Если вы не зарегистрированы в конструкторе, то вы можете скачать собранные прошивки на главной странице, где доступны 2 облегченных варианта прошивки:

Вариант с поддержкой OTA с объемом памяти чипа 1мбайт и выше. Необходимо обязательно выбирать в прошивающей программе размер памяти 1мбайт!! Модули с размером flash памяти 512кб не поддерживаются режимом OTA !!

Вариант без поддержки OTA.Если размер получаемого файла(одним файлом) более 496кб, то требуется поддержка flash памяти не менее 1 мегабайта!! По сравнению с режимом OTA в этом варианте количество включенных опций можно включить значительно меньше.

Возможность дальнейшего обновления прошивки по OTA доступна только у кого есть активированные ключи!

Если у вас имеются проблемы со стартом прошивки, то обязательно смотрим ниже абзац про решение проблем с прошивкой!

Сборка прошивки в конструкторе

Конструктор позволяет собрать прошивку под свои требования, включив в прошивку только те функции и датчики, которые нужны.

Не имеет смысла включать все опции в прошивке - в этом случае прошивка может не собраться так как не влезет в модуль. Лучше прошивку пересобрать снова, если вы хотите испытать другие опции.

Некоторые опции имеют дополнительные настройки, которые находятся в значке-шестеренке. Там можно выбрать доступное количество например термостатов или других опций. При изменении количества из-за динамических настроек могут "слететь" другие опции модуля после последующего обновления. При первоначальной настройке желательно сразу выбрать нужное количество опций, чтобы таких проблем не было.

При первоначальной сборке прошивки рекомендуется воспользоваться опцией OTA , чтобы следующее обновление было возможно через интернет без использования подключения программатора. С опцией OTA количество опций можно включить больше, но требуется чтобы память на модуле была не меньше 1 мегабайта!!

При сборке прошивки можно выбирать разный SDK. Рекомендуемая версия SDK 1.3.0. В новых версиях замечена проблема с режимом точки доступа (Safe Mode)(???) , но нет проблем с надежностью связи с роутером. SDK - это набор библиотек и функций от производителя чипа для работы устройства.

После нажатия кнопки "скомпилировать" через некоторое время конструктор прошивки выдаст ссылки для скачивания:

В режиме без OTA можно прошить файлы прошивки одним файлом - тогда все настройки модуля, если они были сбросятся. Если вы обновляете прошивку и не хотите чтобы настройки удалились, то необходимо обновлять прошивку двумя файлами по адресам, которые указаны в имени файла.

В режиме OTA достаточно залить прошивку одним файлом. Но 0x81000.bin может потребоваться, если вы хотите обновить прошивку по кабелю после использования OTA, когда загружен файл user2.bin - в этом случае обновление прошивки одним файлом не обновит активную прошивку.

Подключение модуля для прошивки

Для прошивки ESP8266 необходим USB-UART переходник или Arduino. ESP8266 необходимо обеспечить напряжение питания 3.3в и током 200..300мА. Питание 3.3в от ARDUINO или от USB-UART подключать не рекомендуется - модуль может работать не стабильно из-за нехватки тока. Рекомендуется использовать стабилизатор вида 1117.

Подключение ESP8266 к USB-UART: Необходимо подключить общие выводы GND(минус). RX у USB-UART на TX ESP, TX у USB-UART на RX ESP. Подключаем так же источник питания 3.3в.

Подключение ESP8266 к Arduino: Необходимо подключить общие выводы GND(минус).RX у Arduino на RX ESP, TX у Arduino на TX ESP. Подключаем так же источник питания 3.3в. RESET у Arduina необходимо подключить к GND.

На модуле ESP8266 вывод CH_EN необходимо подключить к +3.3в для того, чтобы включить чип.

GPIO 0 на время программирования, перед включением питания необходимо подключить к GND(земля). После успешной прошивки GPIO 0 нужно отключить от GND . Если на модуле выведен GPIO 15, то его необходимо подключить на GND через резистор 10кОм на постоянной основе!!

Если у вас модуль esp8266 имеет уже на борту USB-UART (например Wemos, NodeMCU) , то указанные выше действия проводить не требуется.

Прошивка модуля

Для начала необходимо установить драйвера для вашего USB-UART переходника или Arduinы.

Прошивка через Nodemcu Flasher : Устанавливаем на вкладке Advanced Параметр Flash size в соответствии выбранным размером flash памяти (в байтах). Режим работы flash ставим QIO (при использовании GPIO 9/10 - DIO). Остальные параметры не трогаем. Указываем на вкладке Config путь на файл прошивки с адресом 0x0000. На вкладке Operation выбираем COM порт и жмем кнопку FLASH.

Прошивка через Flash download tool : Действия аналогичны.

Прошивка через Flasher for сайт . Программа имеет русскоязычный интерфейс и поддерживается как Windows, так и Linux системы. На данный момент прошивка идет только по 0x0000 адресу файла "Скачать одним файлом (0x00000)". При установленном API ключе возможна автоматическая загрузка заранее собранной прошивки напрямую из конструктора(только с режимом OTA). Для очистки памяти вместо бланка можно использовать опцию "стереть чип перед прошивкой".

Для модулей ESP8285 и модулях с памятью PN25F08B требуется установка режима памяти DOUT !!

Прошивка через esptool. Пример команды esptool.py --port /dev/ttyUSB0 write_flash -fs 8m 0x00000 esp8266.bin . где -fs 8m параметр нужен только для указания размера при одномегабайтовой прошивке.

Прошивка файла ESP INIT DATA

Рекомендуется прошить в модуль файл esp_init_data_default.bin с калибровками по умолчанию, эти настройки влияют на работу wifi и adc. В большинстве случаев модули работают корректно без этого файла. Последние SDK могут вообще не запускаться без данного файла.

Адрес прошивки файла зависит от установленного размера flash памяти:

0x7c000 для 512 kB.

0xfc000 для 1 MB.

0x3fc000 для 4 MB.

0xffc000 для 16 MB.

Так же данные настройки можно загрузить подав GET команду http:///configinit?def=1 , последние SDK сами прописывают данные настройки.

Запуск модуля

При первом включении модуль включается в режим safe mode автоматически так как не содержит имени точки доступа. В режиме safe mode в эфире появится точка с именем WiFi-IoT (в прошивках до 12.10.16 homessmart) , к которой можно подключится используя смартфон или ноутбук.

В режим safe mode еще можно попасть, замкнув между собой RX и TX и перезапустив модуль или нажать 3 раза подрят (с интервалом нажатия около секунды) кнопку RESET на ESP8266.

1. Используя Captive Portal мобильное устройство выведет уведомление о подключении, при нажатии на которое происходит автоматическое открытие главной веб страницы модуля. Можно так же зайти в модуль введяв браузере адрес iot.local (или любое другое, например iot.ru). Captive Portal не поддерживается если прошивка собрана на SDK 0.9.5 !

2. После успешного коннекта заходим вручную по адресу http://192.168.4.1 используя веб браузер.

Далее настраиваем подключение на свой роутер на вкладке main веб интерфейса. Необходимо вбить в поля WiFi options данные своей точки доступа. Для подключения к роутеру выбираем режим "Station mode". После нажатия кнопки set ниже появится IP адрес, на который можно заходить внутри своей беспроводной сети.

Тут же вы можете установить свой логин и пароль на странички настроек веб интерфейса. Длинна логина и пароля не более 8 символов. Пароль затребуется на все вкладки настроек. А при установленной опции "Full Security" и на все GET запросы управления. В режиме safe mode пароль не запрашивается!

На данной вкладке можно задать имя модулю, которое будет отображаться на главной и в системе flymon, а так же в топике на MQTT сервере.

Указанные выше действия выполнять не требуется, если прошивка была собрана с опцией Настройки по умолчанию , где были заранее прописаны параметры роутера и IP адрес. После успешной прошивки и перезагрузки сразу можно заходить на указанный IP адрес модуля внутри своей wi-fi сети.

Решение проблем с прошивкой

Иногда, после сторонних прошивок или мусора модуль может не запустится и необходимо выполнить дополнительные действия. Необходимо затереть flash память по адресу 0x00000. Далее уже прошиваем саму прошивку снова.

У некоторых пользователей даже после зачистки бланком модуль не стартует или стартует только при установленном режиме 512 кб или 4мб, возможно это связано с низким качеством flash памяти или частичной её несовместимостью с чипом ESP8266. По некоторым сведениям от пользователей помогает замена чипа памяти.

Если на главной странице модуля выводится сообщение "Error flash size ! (code 0x1)", то это значит была прошита прошивка 1мегабайт в режиме 512кб. При этом включается режим Safe Mode и возможны сбои в работе модуля из-за таких неверных настроек. Убедитесь, что на модуле установлен необходимый размер памяти - это видно на веб вкладке ИП_АДРЕС/debug в строке Flash real size. Режим объема памяти указывается в прошивающей программе.

Если на главной странице модуля выводится сообщение "Error flash size ! (code 0x2)", то это модуль имеет всего 512кб flash памяти и это значит, что необходимо использовать прошивку без включенного режима 1 мегабайт или не использовать OTA. Можно так же перепаять микросхему flash памяти на более ёмкую.

ВАЖНО!! Если модуль не может получить IP адрес. Висит постоянно статус connect , то рекомендуется вписать IP адрес вручную ниже. Для этого необходимо выбрать режим Static IP и вписать IP модуля и IP шлюза(IP роутера). После этого можно заходить на модуль уже внутри сети по IP адресу, который указали в настройках..

Иногда статус connect может висеть, если тип шифрования на роутере включен, который не поддерживается чипом ESP8266.

Сохранение настроек в файл

Настройки модуля можно сохранить в файл, исключая настройки WI-FI, состояния GPIO, список датчиков DS18B20. Файл необходимо скачать по адресу ИП_АДРЕС/configsave.bin . Записывается обратно в модуль через программатор по адресу 0x3C000 для 512кб прошивки, 0x7C000 - для 1мб. Настройки можно скачать и через esptool.py используя пример ниже подставив нужный адрес.

Скачать настройки WI-FI можно по адресу ИП_АДРЕС/configsave.bin?pg=66 для 512кб, ИП_АДРЕС/configsave.bin?pg=130 для 1 мег. Скачать через esptool.py можно командой esptool.py read_flash 0x7E000 4096 mywifi_settings.bin для 512 кб (Для 1024кб адрес будет 0xfe000).

Полезные ссылки:

Видеоинструкция по настройке от Umka.

После своего появления платы на базе Wifi чипа ESP8266, стали по настоящему народными. Огромные возможности и минимальная цена, которая даже на старте продаж и в розницу не превышала 5$ сделали свое дело. Вокруг чипа организовались сообщества в которых люди делятся информацией и создают программное обеспечение.

В чем же причина такой популярности, помимо низкой цены?

Все дело в том, что платы на ESP8266 это не просто модули для связи по WiFi. Чип по сути, является микроконтроллером со своими интерфейсами SPI, UART, а также портами GPIO, а это значит, что модуль можно использовать автономно без Arduino и других плат с микроконтроллерами.

Информация

Наши китайские товарищи уже производят около двенадцати разновидностей плат на базе ESP8266: с подключением внешней антенны, с керамической антенной, с PCB антенной, без антенны. Также на разных модулях выведено разное количество GPIO. Более подробно, можно прочитать на русскоязычном сайте .

В данном обзоре я буду использовать, одну из самых первых плат ESP-01 . Так же для полноценной работы с чипом потребуется конвертер USB/UART , рекомендую , обзор которого уже был на mysku.

Подключение

Распиновка разъёма ESP-01, представлена на рисунке:

Если в своих проектах вам не хватит двух выведенных GPIO, а заниматься «грязными хаками» нет желания, то я рекомендую сразу приобретать более новые платы, например ESP-07 или ESP-12 . Только имейте ввиду, что данные платы требуют самостоятельной разводки и в продаже для этого есть специальные мининаборы.

Фотографии данных плат


ESP-01 hacked by Dave Allan, как пример. Дополнительно вы получаете 4 GPIO: GPIO14, GPIO12, GPIO13 и GPIO15

Схема подключения:
- ESP-01 VCC к USB/UART VCC (+3.3В);
- ESP-01 GND к USB/UART GND;
- ESP-01 URXD к USB/UART TXD;
- ESP-01 UTXD к USB/UART RXD;
- ESP-01 CH_PD к USB/UART VCC (+3.3В);
- ESP-01 GPIO0 к USB/UART GND - только во время прошивки!..

Прошивка

Для ESP8266, существует SDK и оригинальная прошивка от Espressif Systems, но многих она не устраивает ввиду своей «сырости», поэтому выпускаются не оригинальные прошивки, такие как NodeMCU, Frankenstein и другие.

В данном обзоре будет использоваться не оригинальная прошивка NodeMCU. Список команда и примеры можно посмотреть на .

Обновляем оригинальную «заводскую» прошивку на NodeMCU:
- Загружаем утилиту для прошивания - ;
- Загружаем прошивку - ;
- Подключаем по ESP-01 к USB/UART по схеме которая представлена выше. Не забываем подключить GPIO0 к GND. Вставляем USB/UART в USB порт компьютера;
- Запускаем XTCOM_UTIL.exe, переходим в Tools -> Config Device, выбираем COM-порт к которому подключена плата, ставим скорость порта 57600, жмем Open, потом Connect, программа должна сказать «Connect with target OK!», закрываем окно настроек. Переходим в меню API TEST, выбираем (4) Flash Image Download, указываем путь к файлу «nodemcu_512k_latest.bin», адрес оставляем 0x00000, жмем DownLoad. Должна начаться загрузка прошивки, по окончании будет выдано сообщение;
- Отключаем питание платы, вывод GPIO0 отсоединяем от общего провода, включаем питание. Запускаем терминал Putty, CoolTerm или др. (ВНИМАНИЕ! Меняем скорость порта на 9600), проверяем готовность платы командой
> print(node.chipid())
10013490

Первый скрипт

Если при работе со скриптами у Вас будут проблемы, то рекомендуется подать питание 3.3V не от USB/UART, а от отдельного источника. Напряжение должно быть именно 3.3V, например через модуль стабилизированного питания на AMS1117 3.3V 800ma.

Для написания и загрузки скриптов в ESP8266, будет использоваться небольшая и удобная IDE - :

Наш первый скрипт, будет выключать и включать светодиод с периодичностью в 2 секунды:
- Отключаем питание, к GPIO2 подключаем резистор и светодиод. Включаем питание;
- Запускаем ESPlorer, выбираем нужный COM и скорость порта 9600, нажимаем Open;
- Вставляем код и нажимаем Save To ESP;

Pin = 4 --GPIO2 gpio.mode(pin, gpio.OUTPUT) for i=1, 10, 1 do gpio.write(pin, gpio.LOW) tmr.delay(2000000) gpio.write(pin, gpio.HIGH) tmr.delay(2000000) end
- Для повторного запуска нажимаем DoFile.

Подключаем датчик DHT11

Чтобы продемонстрировать, более продвинутую работу с прошивкой NodeMCU подключим к ESP-01 датчик DHT11:
- DHT11 VCC к USB/UART VCC
- DHT11 GND к USB/UART GND
- DHT11 Out к USB/UART GPIO2

Код от пользователя Pigs Fly с форума ESP8266.com

Works for DHT11 on ESP-07 (version w/16pins) and ESP-01 --Only 20141219 firmware tested. --Data stream acquisition timing is critical. There"s --barely enough speed to work with to make this happen. --Pre-allocate vars used in loop. bitStream = {} for j = 1, 40, 1 do bitStream[j]=0 end bitlength=0 pin = 4; gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, gpio.LOW) tmr.delay(20000) --Use Markus Gritsch trick to speed up read/write on GPIO gpio_read=gpio.read gpio_write=gpio.write gpio.mode(pin, gpio.INPUT) --bus will always let up eventually, don"t bother with timeout while (gpio_read(pin)==0) do end c=0 while (gpio_read(pin)==1 and c<100) do c=c+1 end --bus will always let up eventually, don"t bother with timeout while (gpio_read(pin)==0) do end c=0 while (gpio_read(pin)==1 and c<100) do c=c+1 end --acquisition loop for j = 1, 40, 1 do while (gpio_read(pin)==1 and bitlength<10) do bitlength=bitlength+1 end bitStream[j]=bitlength bitlength=0 --bus will always let up eventually, don"t bother with timeout while (gpio_read(pin)==0) do end end --DHT data acquired, process. Humidity = 0 HumidityDec=0 Temperature = 0 TemperatureDec=0 Checksum = 0 ChecksumTest=0 for i = 1, 8, 1 do if (bitStream > 2) then Humidity = Humidity+2^(8-i) end end for i = 1, 8, 1 do if (bitStream > 2) then HumidityDec = HumidityDec+2^(8-i) end end for i = 1, 8, 1 do if (bitStream > 2) then Temperature = Temperature+2^(8-i) end end for i = 1, 8, 1 do if (bitStream > 2) then TemperatureDec = TemperatureDec+2^(8-i) end end for i = 1, 8, 1 do if (bitStream > 2) then Checksum = Checksum+2^(8-i) end end ChecksumTest=(Humidity+HumidityDec+Temperature+TemperatureDec) % 0xFF print ("Temperature: "..Temperature.."."..TemperatureDec) print ("Humidity: "..Humidity.."."..HumidityDec) print ("ChecksumReceived: "..Checksum) print ("ChecksumTest: "..ChecksumTest)


Прошу прощения за качество видео, снимал на телефон.

HTTP сервер

Пример подключения к Wifi точке доступа и ответ на запрос по HTTP.

Wifi.setmode(wifi.STATION) wifi.sta.config("SSID","password") print(wifi.sta.getip()) srv:listen(80,function(conn) conn:on("receive",function(conn,payload) print(payload) conn:send("

Hello, User.

") end) end)

Эпилог

Чип ESP8266 это безусловно прорыв, прежде всего в соотношении цена/качество. Конечно стоит упомянуть о существующих проблемах в оригинальных и не оригинальных прошивках, но работы ведутся и я надеюсь, что в будущем подобные чипы, будут встроены в каждый чайник. Планирую купить +156 Добавить в избранное Обзор понравился +103 +196

Как проверить ESP8266

Для проверки ESP8266, который вы только что приобрели, потребуется .

Внимание! Допустимый диапазон напряжения питания модуля ESP8266 от 3,0 до 3,6 вольт. Подача повышенного напряжения питания на модуль гарантированно приведет к выходу ESP8266 из строя.

Чтобы проверить ESP8266 ESP-01 достаточно подключить три пина: VCC и CH_PD (chip enable) к питанию 3,3 вольт, а GND к земле. Если у вас не ESP-01, а другой модуль и на нем выведен GPIO15, то дополнительно еще потребуется подключить GPIO15 к земле.

При успешном старте заводской прошивки на модуле ESP8266 загорится красный светодиод (индикатор питания, на некоторых версиях модуля, например ESP-12, может отсутствовать) и пару раз мигнет синий (это индикатор передачи данных от модуля к терминалу по линии TX-RX, может иметь другой цвет) и в вашей беспроводной сети должна появится новая точка доступа с именем «ESP_XXXX», которую вы сможете увидеть с любого WiFi устройства. название точки доступа зависит от производителя прошивки и может быть другим, например AI-THINKER_AXXXXC. Если точка доступа появилась, то можно продолжить эксперименты далее, если нет, то еще раз проверьте питание, CH_PD, GND и если все подключено правильно то, скорее всего, у вас неисправный модуль, но есть надежда, что прошивка в модуле с нестандартными настройками и, возможно, вам поможет перепрошивка.

Как быстро подключить ESP8266

В минимальный набор для подключения и прошивки модуля ESP8266 входит:

Красный — питание 3,3в

Черный — GND

Желтый — на стороне ESP8266 — RX, на стороне USB-TTL — TX

Зеленый — на стороне ESP8266 — TX, на стороне USB-TTL — RX

Оранжевый — CH_PD (CHIP ENABLE) — должен быть всегда подтянут к питанию

Синий — GPIO0 — подключен через выключатель к земле для включения режима перепрошивки модуля. Для обычного старта модуля GPIO0 можно оставить никуда не подключенным.

Розовый на правой схеме — нестабилизированное питание 5-8 вольт

4. Для старта модуля разорвите цепь GPIO0 — GND и можете подавать питание (причем именно в таком порядке: сначала убеждаемся, что GPIO0 «висит в воздухе», затем подаем питание на VCC и CH_PD)

Внимание! В вышеприведенных, реально работающих, примерах подключения ESP8266 используется подключение выводов ESP8266 «напрямую» к земле и питанию, либо «висячее в воздухе», как у нас никуда не подключен RESET, что является абсолютно неправильным и пригодно только для пары первых экспериментов, хотя и вполне работоспособно на подавляющем большинстве модулей. «Напрямую» к питанию подключается только вывод VCC, остальные выводы: CH_PD, RESET, GPIO0, GPIO2, должны быть подтянуты (pullup) к питанию (VCC) через резистор от 4,7 до 50 кОм. «Напрямую», к минусу (общему проводу) питания подключаем только GND, а GPIO0 подтягиваем (pulldown) тоже через резистор до 10k к GND для перевода модуль в режим загрузки прошивки. Если вы планируете и дальше экспериментировать с ESP8266, то сделайте , впрочем так же как и для любых других микроконтроллеров. Детальное описание pullup и pulldown выходит за рамки данной статьи, но вы сможете легко нагуглить описание правильного подключения портов ввода-вывода. « » подключение позволит вам избежать множества «чудес» и проблем и будет неизбежно необходимым при возникновении затруднений с запуском или перепрошивкой модуля ESP8266.

Как правильно подключить ESP8266

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

Схема подключения ESP8266 (без автозагрузки прошивки, прошиваемся предварительно установив перемычку BURN и перезагрузив модуль)

Схема подключения с поддержкой автозагрузки прошивки из Arduino IDE, UDK, Sming. Для Flash Download Tool и XTCOM_UTIL, возможно, потребуется отключение RTS/DTR. Если RTS и DTR вам отключать неудобно, то можно добавить в схему перемычки

На этих схемах не показано подключение ADC и свободных GPIO — их подключение будет зависеть от того, что вы захотите реализовать, но если хотите стабильности, то не забудьте притянуть все GPIO к питанию (pullup), а ADC к земле (pulldown) через подтягивающие резисторы.

Резисторы на 10k могут заменены на другие от 4,7k до 50k, за исключением GPIO15 — его номинал должен быть до 10k. Номинал конденсатора, который сглаживает высокочастотные пульсации, может быть другим.

Соединение RESET и GPIO16 через резистор deep sleep на 470 Ом вам потребуется, если вы будете использовать режим deep sleep: для выхода из режима глубокого сна модуль перезагружает сам себя, подавая низкий уровень на GPIO16. Без этого соединения глубокий сон будет вечным для вашего модуля.

На первый взгляд на этих схемах кажется, что GPIO0, GPIO2, GPIO15, GPIO1 (TX), GPIO3 (RX) заняты и вы не можете их использовать для своих целей, но это не так. Высокий уровень на GPIO0 и GPIO2, низкий на GPIO15 требуются только для старта модуля, а в последующем вы можете использовать их по своему усмотрению, только не забудьте обеспечить требуемые уровни до перезагрузки модуля.

Можно использовать и TX, RX как GPIO1 и GPIO3 соответственно, не забывая о том, что при старте модуля любая прошивка будет дергать TX, отправляя отладочную информацию в UART0 на скорости 74480, но после успешной загрузки вы можете использовать их не только как UART0 для обмена данными с другим устройством, но и как обычные GPIO.

Для модулей, имеющих меньшее количество разведенных пинов, как например, ESP-01 подключение неразведенных пинов не требуется, т.е. на ESP-01 разведены только: VCC, GND, GPIO0, GPIO2, CH_PD и RESET — вот только их и подтягиваете. Нет никакой необходимости припаиваться прямо к микросхеме ESP8266EX и притягивать неразведенные пины, только если вам это .

Данные схемы подключения родились после множества экспериментов, проведенных нашими форумчанами и собраны по крупицам из разрозненной и недоступной изначально документации нашим сообществом, я всего лишь постарался объединить эти знания в одном месте. Множество советов по подключению вы найдете . Там же вы сможете задать интересующие вас вопросы или найти . Если вы увидели ошибку, неточность в этой статье или вам есть что добавить, то .

Внимание! Даже эти схемы нельзя назвать «идеальными». Совершенству нет предела: удобно подключить второй USB-TTL к UART1 (c ESP8266 можно взять только GND и UTXD1, т.е. GPIO2) для подключения отладочного терминала (потребуется второй USB-TTL конвертер) — тогда можно будет прошивать модуль ESP8266 через UART0 без отключения терминала отладки на UART1. Неплохо будет подключить резисторы малого номинала к выводам обоих UART, поставить диод в линию RTS, добавить конденсатор в линию питания для гашения низкочастотных импульсов и т.д. Очень удобно, например, сделано в этой отладочной плате : на все GPIO подключены светодиоды, на ADC подключен фоторезистор, но жаль, что нет кнопки RESET и перемычка только одна на GPIO0.

Правильным будет сказать вам, что не существует идеальной и в тоже время универсальной схемы подключения ESP8266. Все дело в том, что очень многое зависит от прошивки, которую вы собираетесь туда залить. Вышеприведенные схемы рассчитаны на новичков, которые только начинают осваивать ESP8266, для экспериментов. Для реальных проектов, возможно, вам придется немного изменить схему. Например, для нужно подключить RTS к GPIO15, а CTS к GPIO13. Также в реальных проектах рекомендую уделить особое внимание питанию.

Подключение ESP8266 через Arduino

Если у вас под рукой не оказалось USB-TTL конвертера на 3,3в, но есть Arduino со встроенным USB-TTL конвертером, то можно использовать такую схему подключения

На что обратить внимание:

1. Arduino Reset подключен к GND (синий провод) чтобы не запускался микроконтроллер на Arduino, в данном виде мы используем Arduino как прозрачный USB-TTL конвертер

2. RX и TX подключены не «на перекрест», а прямо — RX — RX (зеленый), TX — TX (желтый)

3. Все остальное подключено так же, как и в предыдущих примерах

Внимание! В этой схеме также требуется согласовывать уровни TTL 5 вольт Arduino и 3.3 вольта на ESP8266, однако неплохо работает и так.

Внимание! На Arduino может быть установлен стабилизатор питания, который не выдержит ток, требуемый для ESP8266, поэтому прежде, чем производить подключение сверьтесь с даташитом на тот стабилизатор, который установлен именно у вас. Не подключайте другие энергопотребляющие компоненты одновременно с ESP8266 в связи с риском выхода из строя встроенного в Arduino стабилизатора питания.

С подключением к последовательному порту придется немного поколдовать: в связи с разнообразием прошивок для ESP8266, подключение может осуществляться на разных скоростях. Нужную скорость можно определить путем простого перебора трех вариантов: 9600, 57600 и 115200. Как осуществить перебор? Подключаетесь в терминальной программе к вашему виртуальному последовательному порту выставив следующие параметры: 9600 8N1, затем перезагружаете модуль, отключив CH_PD (chip enable) от питания (USB-TTL при этом остается подключенным к USB) и снова включаете (т.е. просто передергиваете CH_PD, почему не передергиваем питание — читаем , также можно кратковременно замкнуть RESET на землю для перезагрузки модуля) и наблюдаете данные в терминале. Во-первых, светодиоды на ESP8266 должны гореть как описано в начале статьи в разделе . Во-вторых, в терминале вы должны увидеть «мусор» из разных символов, оканчивающийся строкой «ready». Если «ready» мы не видим, то переподключаемся терминалом на другой скорости и снова перезагружаем модуль.

На одном из вариантов скорости «ready» вы все-таки увидите — поздравляем, ваш модуль готов к работе. Если нет, то добро пожаловать — мы постараемся помочь, но предварительно почитайте .

Немного подробнее о «мусоре». Дело в том, что при старте прошивки, UART модуля ESP8266 переключается на скорость передачи 74 880 (вот такие забавные эти китайцы) выдает в UART отладочную информацию, затем переключает скорость порта на 115200 (ну или на 9600 или 57600 в зависимости от версии прошивки), так вот эта отладочная информация и видится нам как мусор, т.к. мы подключаемся к модулю на другой скорости. Можете подключится к ESP8266 на скорости 74 880 ( поддерживает эту скорость) и вы эту отладочную информацию увидите, будет что-то вроде этого:

wdt reset load 0x40100000, len 25052, room 16 tail 12 chksum 0x0b ho 0 tail 12 room 4 load 0x3ffe8000, len 3312, room 12 tail 4 chksum 0x53 load 0x3ffe8cf0, len 6576, room 4 tail 12 chksum 0x0d csum 0x0d

wdt reset

load 0x40100000 , len 25052 , room 16

tail 12

chksum 0x0b

ho 0 tail 12 room 4

load 0x3ffe8000 , len 3312 , room 12

Что делать дальше

Если у вас новый модуль, то, скорее всего, в нем прошита одна из старых кастомных AT прошивок. Скорее всего это какой-нибудь AI-THINKER AT v0.16 SDK v0.9.2. Проверить версию прошивку вы можете командой «AT+GMR», т.е. прямо в терминальной программе набираете AT+GMR без кавычек и жмете Enter. Модуль должен ответить «OK» и выдать версию прошивки (например, «0016000092» — в разных версиях AT прошивок формат вывода версии отличается). Управление модулем ESP8266 AT командами заслуживает отдельной статьи, однако вы легко сможете разобраться с этим и сами, воспользовавшись одним из наших справочников по AT командам:

На момент написания этой статьи актуальная версия прошивки для ESP8266:

Обновление прошивки ESP8266

Модуль ESP8266 замечателен тем, что не требует специального программатора — обновление прошивки производится на том же железе, на котором вы подключаете модуль ESP8266 к компьютеру, т.е. тоже через USB-TTL конвертер (ну или Arduino или RPi). Для обновление прошивки на модуле ESP8266 проделайте следующее:

1. Скачайте новую версию прошивки с нашего сайта из раздела (вот ссылка на на момент написания этой статьи)

2. Скачайте одну из утилит для прошивки ESP8266 в зависимости от вашей операционной системы из раздела с нашего сайта

Цели и причины

Это вторая статья автора об интегральной микросхеме ESP8266, содержащей полнофункциональный 32-битный RISC микроконтроллер и встроенную Wi-Fi схему 802.11 b/g/n. описывала использование Arduino IDE для программирования ESP8266 и содержит важную информацию, которая здесь повторяться не будет. Если вы не читали её, то рекомендуем сделать это.

В интернете нет недостатка в информации об ESP8266; на самом деле, может быть из неё слишком много... неправильной. Разработчики микросхемы, Espressif , по-видимому, решили не только не заниматься производством на стороне, но и избегать непосредственного участия в разработке линейки модулей ESP, которые используют микросхему ESP8266. Вместо этого, они предлагают информацию и услуги поддержки через форум для тех, кто готов с упорством и терпением ходить по лабиринту. Добавление к путанице - это существование другого форума, который, несмотря на то, что назван esp8266.com , не управляется компанией Espressif. Кроме того, существует множество перепродавцов, видеоблоггеров, и писателей, которые также предлагают информацию от качественной до спутанной настолько, что она может быть полностью неправильной.

ESP модули доступны в различных источниках, а прошивки, содержащиеся в чипах ESP8266 на модулях, почти всегда являются устаревшими и часто вызывают подозрения относительно их происхождения. Также иногда подозрительны "обновления" и инструменты, которые доступны в тех же источниках. Следовательно, целью этой статьи является документирование процедуры загрузки последней доступной прошивки непосредственно от Espressif и её установка с использованием инструмента программирования, предоставляемого Espressif.

Подключение оборудования

Чтобы обновить прошивку на любом ESP8266, необходимо правильно подать на него питание и подключить его к компьютеру. Кроме того, необходимо добавить средства сброса микросхемы и перевода её в режим загрузки. На приведенной ниже схеме и фотографии показано рекомендуемое подключение; обратите внимание, что цвета проводов на схеме соответствуют цветам на фотографии. Как вы видите, я буду обновлять прошивку на модуле ESP-01, но ти же самые соединения будут работать и с другими модулями, если используются те же входы/выходы ESP8266, как показано на схеме. Дополнительные сведения смотрите в .

Более надежная схема прошивки приведена в этой статье .


Программа терминала PuTTY

Когда подключение оборудования завершено, следующий шаг - включить ESP8266 и попытаться связаться с ним. Для этого требуется простая терминальная программа; мы будем использовать PuTTY, бесплатную программу, доступную здесь. Вы можете использовать другую терминальную программу, но вам придется учесть различия между ней и PuTTY.

Откройте PuTTY и нажмите на переключатель Serial. Введите номер COM порта (который должен быть меньше 10) и скорость передачи (скорее всего, это будет 115200 или 9600).

В маленьком окне Saved Sessions (Сохраненные сеансы) введите ESP8266 и нажмите кнопку Save (Сохранить) . Окно PuTTY должно быть похоже на изображение ниже.


Нажмите кнопку Open (Открыть) , после чего должно открыться окно сеанса терминала PuTTY.

Включите Caps Lock у себя на компьютере и введите AT , но не нажимайте Enter . Вы должны увидеть AT в окне терминала PuTTY. Если этого не произошло, вы, возможно, выбрали не тот COM порт или неправильную скорость передачи. Закройте PuTTY и начните этот подраздел статье с самого начала. Допустимые скорости передачи: 9600, 19200, 38400, 74880, 115200, 230400, 460800 и 921600; попробуйте по очереди каждую из них, пока не найдете ту, с которой всё заработает.

Когда вы увидите AT в окне терминала PuTTY, удерживая клавишу Ctrl , нажмите клавишу M , а затем J . Отпустите клавишу Ctrl . Вы должны увидеть OK в окне терминала PuTTY, как показано на рисунке ниже.


Обратите внимание, что если вы делаете ошибку при вводе в окне сеанса терминала, возможно, исправить эту ошибку не удастся. Вместо того, чтобы пытаться отредактировать и исправить ошибку, часто лучше просто удерживать клавишу Ctrl и нажимать сначала клавишу M , а затем J , что сгенерирует сообщение об ошибке. Затем вы можете начать снова и ввести правильный текст.

Когда вы увидите первое сообщение OK , это значит, что вы преодолели большое препятствие. Теперь вы знаете, что оборудование подключено правильно, модуль ESP работает, и вы правильно выбрали COM порт и скорость передачи. OK

Теперь снова запустите PuTTY, выберите сохраненный сеанс ESP8266 и нажмите кнопку Load (Загрузить) Open (Открыть)


В первой строке выше вы видите команду AT+GMR , которую вы набрали. Как вы, возможно, знаете или догадались, схема команд, которую мы используем для связи с ESP8266, называется «набор AT команд», потому что все команды начинаются с букв « AT ».

К сожалению, существует множество версий наборов AT команд; все они содержат некоторое количество одинаковых команд, но есть много AT команд, которые не являются стандартными для всех наборов AT команд. Даже в сообществе ESP8266 существует несколько версий. Вторая строка указывает, что это конкретное устройство 8266 запрограммировано прошивкой, которая использует версию 0.25.0.0 AT команд. Где-то есть документ, который определяет команды, которые включены в версию 0.25.0.0, но и без этого документа вы можете использовать метод проб и ошибок для определения поддерживаемых AT команд. В лучшем случае это будет очень утомительный процесс, но, к счастью, есть решение, которое будет объяснено в чуть позже.

Третья строка определяет версию программного обеспечения (SDK), которая использовалась для данного конкретного ESP8266, как версия 1.1.1. Каждый SDK также включает в себя набор AT команд, который является частью прошивки, и подходит для управления этой прошивкой. Очевидно, версия 0.25.0.0 AT команд работает с версией 1.1.1 SDK. Но всё же нужен документ, который описывает AT версию 0.25.0.0, чтобы узнать, какие команды включены. Существует лучший способ, описанный в следующем разделе этой статьи, но перед тем, как перейти к нему, попробуем еще одну AT команду и посмотрим, что произойдет.

Включите Caps Lock у себя на компьютере и введите AT+CWLAP . Когда вы увидите AT+CWLAP в окне терминала PuTTY, удерживая клавишу Ctrl , нажмите сначала клавишу M , а затем J . Отпустите клавишу Ctrl . Через несколько секунд окно терминала должно выглядеть так, как показано на скриншоте ниже.


AT+CWLAP заставляет ESP8266 перечислить все доступные Wi-Fi точки доступа. В приведенном выше случае были найдены две точки доступа: одна называется "ATT936", а вторая - "tracecom 2.4". Разумеется, ваши результаты будут отличаться и должны включать вашу собственную Wi-Fi сеть, а также сети ваших соседей.

Закройте окно сеанса терминала PuTTY и нажмите OK , когда PuTTY спросит, уверены ли вы.

ESP Flash Download Tool

Хотя это редко упоминается в интернете, Espressif, разработчики микросхемы ESP8266, создали некоторую часть программного обеспечения для обновления прошивки в своих чипах. Это ESP Flash Download Tool, и этот инструмент доступен . Скачайте, разархивируйте и установите последнюю версию на вашем компьютере; на момент написания статьи это FLASH_DOWNLOAD_TOOLS_v2.4_150924.rar .

Запустите инструмент, и вы должны будете увидеть два открывшихся окна: окно графического интерфейса (GUI) с полями ввода информации и терминальное окно, в котором ведется лог выполненных действий.

Окно графического интерфейса (GUI) ESP Flash Download Tool

Стоит отметить несколько вещей, но нет поводов для беспокойства:

  • окно (GUI) идентифицируется как V2.3, в то время как окно журнала идентифицируется как V2.4. По-видимому, окно GUI отмечено неправильно;
  • поля выбора COM порта и скорости передачи в окне GUI могут уже содержать данные;
  • поля ввода адресов в окне GUI могут уже содержать данные;
  • окно лога уже может содержать данные.

Получение последней прошивки

У Espressif есть страница, на которой размещается последняя версия прошивки. Перейдите на страницу bbs.espressif.com , нажмите на запись SDKs в списке Downloads , а затем кликните на « latest release » в разделе Announcements . На момент написания статьи на этой странице можно было увидеть следующее:


Последняя версия Non-OS SDK (Software Development Kit) - это то, что нам нужно, и, похоже, что, если вы кликните на " Latest Version: 1.4.0 ", то получите последнюю версию. Но это не совсем так; обратите внимание, что имеется доступный патч, указанный как esp_iot_sdk_v1.4.1_15_10_22 . Это не патч; это исправленная версия прошивки версии 1.4.0. Нам нужен он и bin файлы AT_v0.50. Кликните по очереди на каждом из них и загрузите файлы.

Конечно, к тому времени, когда вы это прочитаете, могут появиться более свежие версии SDK, и их местоположения могут быть изменены, но, по крайней мере, вы знаете, где искать. Просто убедитесь, что внимательно прочитали, чтобы быть уверенным, что скачиваете последнюю версию. Как мы увидели ранее, это не всегда бывает очевидно.

Возможно, вы заметили, что есть раздел для скачивания документов. Все они содержат качественную информацию, но иногда существенная её часть теряется при переводе с китайского на английский. На данный момен не забудьте получить последние версии ESP8266 AT Instruction Set и Espressif IOT SDK User Manual .

Установка прошивки

Запустите ESP flash download tool и убедитесь, что ни в одном чекбоксе в левом верхнем углу окна GUI не поставлена галка. Введите COM порт, который вы используете, и скорость передачи 115200 в полях ввода в нижней части окна. Обратите внимание, что при вводе данных они записываются в окне журнала.

Подайте питание на свою сборку для программирования ESP и подключите её к компьютеру. Нажмите и удерживайте кнопку Reset , а затем нажмите и удерживайте кнопку Flash . Отпустите кнопку Reset , а затем отпустите кнопку Flash . Нажмите кнопку START окне GUI инструмента прошивки ESP. Программа загрузки флэш-памяти должна проверить ESP8266 в вашей сборке и создать отчет, похожий на тот, что приведен ниже. Нажмите и отпустите кнопку Reset на вашем макете, чтобы выйти из режима прошивки ESP8266 и возобновить нормальную работу.


Обратите внимание, что теперь окно GUI содержит информацию об ESP8266, включая размер флэш-памяти (в примере 8 Мбит), тактовую частоту (в примере 26 МГц) и два MAC-адреса для чипа. Такая же информация содержится в окне журнала.

Затем кликните в окне GUI по чекбоксу с надписью " SpiAutoSet ", что заставит инструмент загрузки автоматически выбрать правильные размер флэш-памяти и тактовую частоту.

Теперь нам нужно выбрать файлы для установки в ESP8266 и установить начальный адрес памяти для каждого файла. Чтобы обновить ESP чип, необходимо правильно установить четыре файла. Откройте «Руководство пользователя Espressif IOT SDK» и найдите раздел о записи образов во флэш-память. В версии 1.4 руководства он начинается со страницы 20. Затем найдите подраздел, который описывает версию поддерживаемую Cloud Update (FOTA), и в этом подразделе найдите таблицу о размере флэш-памяти в вашем ESP8266. В этом примере размер флэш-памяти составляет 8 Мбит, что равно 1024 килобайт, следовательно, в таблице 2 на странице 25 руководства содержится информация, необходимая для примера. Посмотрим на рисунок ниже.


Необходимы эти четыре файла: esp_init_data_default.bin , blank.bin , boot.bin и user1.bin . Адрес, по которому должен быть установлен каждый из файлов, отображается рядом с именем файла. Первые три из необходимых файлов находятся в каталоге esp_iot_sdk_v1.4.1_15_10_22 , ранее скачанном с bbs.espressif.com, а четвертый расположен в AT_v0.50 bin files . Перейдите туда, где находятся эти загруженные файлы, и скопируйте пути к ним в поля ввода в верхней части окна GUI программы Flash Download Tool; введите правильный адрес для каждого файла в поле рядом с именем файла. Выполните следующие шаги для каждого файла:

  • кликните внутри поля ввода " set firmware path ";
  • кликните по кнопке... справа от поля ввода;
  • перейдите к месту хранения файла и кликните по файлу. GUI автоматически введет путь к файлу в поле ввода;
  • введите правильный адрес (из таблицы) для каждого файла.

Обратите внимание, что файлы, которые должны быть загружены, могут быть не такими, как те, что указаны в таблице в этом примере, но будут близки к ним.

Теперь кликните на четыре флажка слева от имени каждого из файлов. Окно графического интерфейса программы Flash Download Tool должно быть похоже на рисунок ниже. Дважды проверьте адреса по таблице.

На своем макете прошивки ESP нажмите и удерживайте кнопку Reset , а затем нажмите и удерживайте кнопку Flash . Отпустите кнопку Reset , а затем отпустите кнопку Flash . Нажмите кнопку START окне GUI инструмента прошивки ESP. Должна начаться загрузка, и её прогресс должен быть показан в окне графического интерфейса и окне журнала Flash Download Tool, как показано ниже.


Как показано выше, успешная операция прошивки флэш-памяти приведет к тому, что все файлы будут отправлены в ESP8266, а COM порт будет закрыт.

Проверка успешности прошивки

Когда операция прошивки будет завершена, закройте программу Flash Download Tool. Снимите питание с макета программирования ESP, а затем снова подключите питание.

Снова запустите PuTTY, выберите сохраненный сеанс ESP8266 и нажмите кнопку Load (Загрузить) . Это должно поместить ранее выбранные вами настройки COM порта и скорости передачи в соответствующие окна. Нажмите Open (Открыть) , и откроется новое окно сеанса терминала PuTTY.

Включите Caps Lock у себя на компьютере и введите AT , но не нажимайте Enter . Вы должны увидеть AT в окне терминала PuTTY. Введите символ + , а затем GMR . Когда вы увидите AT+GMR в окне терминала PuTTY, удерживая клавишу Ctrl , нажимите сначала клавишу M , а затем J . Отпустите клавишу Ctrl . В окне терминала PuTTY вы должны увидеть информацию о прошивке ESP8266, аналогичную показанной ниже.


Как вы можете видеть, в ESP8266 очевидно установлена новая прошивка. Она была обновлена с SDK версии 1.1.1 на SDK версии 1.4.0. Кроме того, также была установлена соответствующая версия 0.50.0.0 набора AT команд.

Закройте окно сеанса терминала PuTTY и нажмите OK , когда PuTTY спросит, уверены ли вы.

И напоследок

Пара тренировок, и весь процесс обновления прошивки займет гораздо меньшее время, чем требуется для прочтения данной статьи. Как только вы сделаете это, то будете уверены в том, что находится внутри вашего ESP8266 и сможете сосредоточиться на своем Wi-Fi проекте, вместо угадывания прошивки ESP и надежды на поддержку необходимого набора AT команд.

Настолько велика, что помимо прошивок для использования ESP8266 в качестве WiFi-модуля под управлением внешнего микроконтроллера, существует масса прошивок для использования его и как микроконтроллера с разными целевыми назначениями, в том числе и в сфере интернет вещей. В этом цикле статей мы будем изучать возможности ESP8266 с прошивкой NodeMCU и изучим скриптовый язык LUA .

Что такое ESP8266?

ESP8266 – это микроконтроллер с WiFi интерфейсом. Его можно использовать как WiFi модуль, и как микроконтроллер.

Плюсы ESP8266: WiFi интерфейс, 32-разрядное ядро с достаточной производительностью, низкая цена.
Минусы: По сравнению с другими 32-разрядными микроконтроллерами периферия не вызывает восхищения.

ESP8266 идеально подходит для домашних проектов, интернета вещей. ESP8266 программируется через последовательный порт UART, поэтому для его прошивки не требуется специального программатора. Особенность этого микроконтроллера в том, что он может выполнять программу, расположенную на внешней Flash памяти. Это позволяет производителю “наращивать” объем Флеша, что также является плюсом.

На базе ESP8266 выпускаются разные модули:

ESP-01
ESP-02
ESP-03
ESP-04
ESP-05
ESP-06
ESP-07
ESP-08
ESP-09
ESP-10
ESP-11
ESP-12S
ESP-12E
ESP-12F

Существует различные версии плат с уже запаянными модулями ESP8266, стабилизаторами напряжения, микросхемой для обеспечения работы последовательного порта UART через USB и разведенными на гребенку выводами, кнопками и тому подобное. Для работы с такими платами достаточно подключить их к USB порту компьютера. Никакого дополнительного оборудования не требуется. Это очень удобно. Одна из таких плат – NodeMCU. В примерах я буду использовать плату NodeMCU с модулем ESP-12F. Но, Вы вполне можете взять модуль, скажем ESP-01, подключить к нему UART-USB переходник и работать с ним аналогичным образом. У ESP-01 будет меньше памяти и меньше выводов, которые можно задействовать, но в остальном работа с ним аналогичная.


Что такое NodeMCU?

NodeMCU - открытый бесплатный проект на основе скриптового языка Lua. Прошивка достаточно мощная и позволяет очень быстро реализовывать различные типовые проекты. Например, сегодня, в качестве знакомства, мы сделаем WiFi розетку с управлением с мобильного телефона и с Web-интерфейсом. Прошивка умеет исполнять Lua-скрипты как из последовательного UART порта (аналогично AT-командам) так и из внутренней flash памяти (выполняя скрипты). Lua скрипты сохраняются во Flash во внутренней файловой системе. Файловая система плоская, упрощенная. Т.е. без подкаталогов. Тем не менее – это круто. Не стоит забывать, что ESP8266 – это всего лишь микроконтроллер. Из скриптов так же можно получить доступ к файлам, читать и сохранять различную информацию. NodeMCU модульная. Что с одной стороны позволяет наращивать функционал, а с другой собрать прошивку только из требуемых модулей, не расходуя понапрасну память.

NodeMCU работает с протоколами обмена данными – HTTP, MQTT, JSON, CoAP.
Поддерживаются различные датчики
акселерометры ADXL345,
магнитометры HMC5883L,
гироскопы L3G4200D,
датчики температуры и влажности AM2320, DHT11, DHT21, DHT22, DHT33, DHT44
датчики температуры, влажности, атмосферного давления BME280,
датчики температуры, атмосферного давления BMP085,
множество дисплеев работающих по шинам I2C, SPI . С возможностью работы с разными шрифтами.
TFT дисплеи ILI9163, ILI9341, PCF8833, SEPS225, SSD1331, SSD1351, ST7735,
умные светодиоды и LED контроллеры – WS2812, tm1829, WS2801, WS2812,
поддерживаются интерфейсы – 1-Wire, I2C, SPI, UART,

Также можно задействовать модуль шифрования, планировщик задач, часы реального времени, протокол синхронизации часов через интернет SNTP, таймеры, АЦП канал (один), проигрывать аудио файлы, формировать на выходах ШИМ-сигнал (до 6), использовать сокеты, есть поддержка FatFS, т.е можно подключать SD-карточки и так далее.

Что такое язык Lua?

Lua – это интерпретируемый язык, который, как и большинство современных интерпретируемых языков, может хранить скомпилированные версии скриптов. Это позволяет увеличить скорость работы. Lua позиционируется как мультипарадигмовый. Он не сложный, и если Вы уже программировали на любом языке, то Lua Вы изучите очень быстро. Если Вы только начинаете программировать, тогда Lua удивит Вас своей доступностью для начинающих.

Есть некоторые особенности при работе с Lua на NodeMCU. В основном это связано с конечным объемом памяти микроконтроллера ESP8266. Нужно придерживаться простых правил и выдерживать стиль работы с Lua. Об этих правилах расскажу чуть позже. Если же сохранять такой же стиль, как и при написании программ на С, то у Вас не получиться ощутить всей мощи Lua и прошивки NodeMCU. Когда Вы начинаете писать на Lua, это увлекает, и Вы начинаете воплощать в жизнь все более объемные задачи. Вы теряете ощущение того, что вы работаете с микроконтроллером и невольно нагружаете задачами, которые не по плечу микроконтроллеру. Нужно помнить, что у ESP8266 ограниченные ресурсы и не следует его грузить задачами, которые под силу выполнить микрокомпьютерам или полноценным компьютерам.

Документация по LUA на русском языке: http://www.lua.ru/doc/
Изучаем LUA за 15 минут: http://tylerneylon.com/a/learn-lua/

Где скачать NodeMCU?

Конечно, можно скачать исходные коды NodeMCU (https://github.com/nodemcu/nodemcu-firmware/releases/) и скомпилировать с нужными параметрами. Но мы не будет так делать. Существует сайт https://nodemcu-build.com , на котором можно собрать NodeMCU с необходимыми Вам модулями. Вы просто отмечаете те модули, которые Вам нужно, указываете свой e-mail и нажимаете внизу кнопку “Start ysour build “. Сначала на указанный e-mail приходит письмо о том что сборка началась. А затем извещение об окончании и ссылки для скачивания integer и float версий. Если в своем проекте Вы не будете использовать вычисления с плавающей запятой, тогда качайте “integer “. Не стоит жадничать и включать те модули, которые Вы не собираетесь использовать. В любой момент можно собрать новую прошивку, добавив недостающий модуль. Для примеров я собрал NodeMCU с такими модулями:

Как залить NodeMCU на ESP8266?

Теперь, когда у нас есть файл прошивки NodeMCU, его нужно залить в ESP8266. Прежде всего, при подключении платы NodeMCU к компьютеру должен появиться виртуальный Com порт. Как правило, последние версии Windows установки драйверов не требуют. Ubuntu сразу распознает подключенное устройство.

Прошивка NodeMCU под Windows

git clone https://github.com/themadinventor/esptool.git

Прошить командой:

Sudo python esptool.py --port /dev/ttyUSB0 write_flash 0x00000 The_Path_To_The_NodeMCU_Firmware.bin

/Dev/ttyUSB0 – порт на котором висит ESP8266.
The_Path_To_The_NodeMCU_Firmware.bin – путь к файлу прошивки.

Кстати, esptool можно использовать и под Windows. esptool написан на Pyton, для работы под Windows нужно установить Pyton .

esptool пригодиться нам для заливки бинарных файлов на файловую систему NodeMCU. Можно заливать любые файлы, в том числе скрипты. Скрипты можно писать хоть в Notepad, но я предпочитаю ESPlorer .

ESPlorer, init.lua – пишем первый скрипт

Для написания и заливки скриптов будем использовать программу ESPlorer. Это кроссплатформенная программа написана на Java и так же не требует установки. Работает одинаково как под Windows так и под Ubuntu.

Распаковываем архив.

Под Windows запускаем файл ESPlorer.bat

Sudo java-jar ESPlorer.jar

Указываем порт и скорость 9600 :

И нажимаем “Open “. Увидем следующще

У ESPlorer обнаружилась паршивая особенность. Он не всегда четко подключается к NodeMCU. Если попробовать послать любую команду (кнопкой Send ) в консоли пролетает мусор вместо нормального ответа. Иногда после нескольких повторов все налаживается. Если Вас это беспокоит, попробуйте изменить скорость подключения на 115200.


Приступим к созданию первого скрипта на языке Lua. Скрипт с именем init.lua стартует автоматически после запуска NodeMCU. Создадим файл init.lua .

напечатаем всего одну строчку:

Print("Yes it works!")

Сохраняем файл как init.lua . После сохранения файл выполниться и мы должны увидеть работу первого скрипта.

По умолчанию файл сохраняется и на диск компьютера и заливается на ESP8266.

Теперь о самой большой неприятности, которая есть у NodeMCU. При некоторых критических ошибках (это случается не так часто, но если случается, то запоминается на долго) NodeMCU может перезагружаться. И самое страшное, что может случиться – это циклическая перезагрузка. Это случается если допустить критическую ошибку в скрипте который стартует автоматически. NodeMCU стартует, выполняет “глючный” скрипт, нарывается на критическую ошибку и уходит в перезагрузку. И так до бесконечности.

Для того, чтобы обезопасить себя на этапе изучения NodeMCU, я использую описанный ниже прием. В стартовом скрипте init.lua запускаем таймер, который сработает только один раз и через указанное время (в данном случае через 5 секунд) выполнит процедуру запуска другого скрипта (в данном случае main.lua ). Больше ничего в скрипте init.lua не делаем. Все операции выполняются в скрипте main.lua . Таким образом, если мы допустим ошибку в скрипте main.lua , и NodeMCU уйдет в циклическую перезагрузку, после перезагрузки у нас будет 5 секунд для того чтобы удалить или исправить “глючный” скрипт.

Текст init.lua:

Print ("Waiting ...") tmr.register (0, 5000, tmr.ALARM_SINGLE, function (t) tmr.unregister (0); print ("Starting ..."); dofile ("main.lua") end) tmr.start (0)

Кроме того, такой подход позволяет легко включать в автозагрузку любо нужный скрипт, достаточно в файле init.lua вместо main.lua указать имя другого скрипта. Это очень удобно, когда вы на одной плате тестируете несколько проектов или несколько версий скрипта.

Подключаемся к Wifi или создаем свою Wifi точку

Для подключения к WiFi создаем main.lua и пишем:

WiFi Settup wifi.setmode(wifi.STATION) local cfg={} cfg.ssid="MyWiFi" cfg.pwd="MyWiFiPassword" wifi.sta.config(cfg) cfg = nil collectgarbage()

После успешного подключения модуль получить IP адрес. Узнать его можно с помощью команды:

Wifi.sta.getip()

Если мы хотим, чтобы ESP8266 создал свою собственную WiFi точку:

WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg={} cfg.ssid="ESPWIFI" cfg.pwd="1234567890" wifi.ap.config(cfg) cfg = nil collectgarbage()

Примечание: WiFi точка не поднимется, если пароль короче 8 символов. По умолчанию IP адрес точки всегда 192.168.4.1

Его можно узнать командой:

Wifi.ap.getip()

Что такое collectgarbage() ? Функция collectgarbage – это сборщик мусора. Ее следует вызывать в конце каждого скрипта. Обратите внимание, переменная cfg объявлена как local . Она будет доступна только в текущем скрипте. Если local убрать, то переменная cfg была бы глобальной и доступной в других скриптах.

GPIO. Мигаем светодиодом

Для управления реле (мы ведь собрались делать WiFi розетку) потребуется изучить работу с выводами GPIO . Пока попробуем использовать GPIO вывод в качестве выхода и устанавливать высокий и низкий уровень сигнала. Для наглядности подключим светодиод как показано на схеме.

My_pin_nummber = 1 -- Устанавливаем режим работы как выход gpio.mode (my_pin_nummber, gpio.OUTPUT) -- Задать высокий уровень gpio.write (my_pin_nummber, gpio.HIGH) -- Задать низкий уровень gpio.write (my_pin_nummber, gpio.LOW) -- Мигаем светодиодом 10 раз gpio.serout (1, gpio.HIGH, {+990000,990000}, 10, 1)

Нумерация выводов:

IO index ESP8266 pin
0 GPIO16
1 GPIO5
2 GPIO4
3 GPIO0
4 GPIO2
5 GPIO14
6 GPIO12
7 GPIO13
8 GPIO15
9 GPIO3
10 GPIO1
11 GPIO9
12 GPIO10

D0(GPIO16) can only be used as gpio read/write. No support for open-drain/interrupt/pwm/i2c/ow

Плата NodeMCU

Примечание: Существует несколько версий плат Nodemcu. Распиновка Вашей платы может отличаться.

Websocket

Теперь сделаем сервер, который будет работать на указанном порту (пусть будет 333). Затем мы с помощью терминальной программы подключимся к нашему серверу, указав его IP и порт. И потом будем обмениваться данными.

Скрипт main.lua:

WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg={} cfg.ssid="ESPTEST" cfg.pwd="1234567890" wifi.ap.config(cfg) --Create Server sv=net.createServer(net.TCP) function receiver(sck, data) -- Print received data print(data) -- Send reply sck:send("Recived: "..data) end if sv then sv:listen(333, function(conn) conn:on("receive", receiver) conn:send("Hello!") end) end print("Started.")

Теперь наш скрипт поднимает Wi-Fi точку, создает сервер, который на порту 333 ожидает подключения. В момент подключения сервер отправит клиенту строку “Hello! “, а приняв от клиента данные, вернет ему строку “Recived: ” и дальше все, что он принял.

Теперь мы можем подключиться мобильным телефоном к Wi-Fi точке ESP8266. В принципе, создавать точку не обязательно. Вы можете переписать скрипт и сделать так, чтобы ESP8266 подключался к Вашей WiFi сети. Тогда Вам нужно узнать его IP и далее использовать его вместо 192.168.4.1, который далее используется в примерах.

Но нам еще нужна терминальная программа для подключения на IP адрес ESP8266 (192.168.4.1) и указанный порт (333). На обычном компьютере можно установить PuTTY . Для мобильных телефонов под Android я использую JuiceSSH .

Передача данных с мобильного телефона с помощью JuiceSSH

Устанавливаем и запускаем RoboRemoFree

Создаем подключение к серверу. Желательно чтобы мобильный телефон/планшет был подключен к той-же WiFi сети, где находиться сервер. В данном случае наш ESP8266. Заходим в “Menu”, выбираем пункт “connect”

Выбираем тип подключения “Internet (TCP)”

Указываем IP и порт

Выбираем интерфейс. Программа позволяет создавать несколько интерфейсов с разными органами управления.

Затем переходим в режим редактирования интерфейса

Нажимаем на свободном пространстве и выбираем, что мы хотим установить. Мы будем использовать кнопки. Выбираем “button”

После чего на интерфейс будет установлена кнопка. Ее можно перемещать и изменять ее размеры.

Чтобы изменить название на кнопке, нужно нажать не ней и выбрать пункт “Set text”

Затем укажем еще один параметр – “set press action”. Зададим “1”. При нажатии кнопки будет отправлена указанная строка по созданному нами подключению. Т.е. Наш ESP8266 получит символ “1” и включит светодиод.

Аналогично создадим кнопку “Off” и установим set press action “0”.

Наш интерфейс готов. Выходим из режима редактирования, выполнив пункт меню “don’t edit ui”.

Если подключение к серверу (ESP8266) было успешным, можно пользоваться. По нажатию кнопки “On” светодиод должен загореться, по нажатию кнопки “Off” светодиод должен погаснуть.

Web интерфейс

Есть и другой путь – можно сделать Web интерфейс и управлять светодиодом еще и через браузер.

Тот же скрипт + Web интерфейс:

WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg={} cfg.ssid="ESPTEST" cfg.pwd="1234567890" wifi.ap.config(cfg) --Set Pin mode my_pin_nummber = 1 gpio.mode(my_pin_nummber, gpio.OUTPUT) --Create Server sv=net.createServer(net.TCP) function receiver(sck, data) if string.sub (data, 0, 1) == "1" then gpio.write(my_pin_nummber, gpio.HIGH) else if string.sub (data, 0, 1) == "0" then gpio.write(my_pin_nummber, gpio.LOW) end end print(data) end if sv then sv:listen(333, function(conn) conn:on("receive", receiver) conn:send("Hello!") end) end --Create HTTP Server http=net.createServer(net.TCP) function receive_http(sck, data) local request = string.match(data,"([^\r,\n]*)[\r,\n]",1) if request == "GET /on HTTP/1.1" then gpio.write(my_pin_nummber, gpio.HIGH) end if request == "GET /off HTTP/1.1" then gpio.write(my_pin_nummber, gpio.LOW) end sck:on("sent", function(sck) sck:close() end) local response = "HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n".. "NodeMCU on ESP8266".. "

NodeMCU on ESP8266

".. "
".. "On Off".. "" sck:send(response) end if http then http:listen(80, function(conn) conn:on("receive", receive_http) end) end print("Started.")

Небольшое пояснение как работает web-сервер вообще, и наш скрипт в частности. Стандартный порт для web-сервера – 80. Т.е. когда Вы в браузере набираете http://192.168.4.1/ , то браузер подключается к серверу (192.168.4.1) на порт 80 и отправляет запрос. Запрос выглядит примерно так:

GET / HTTP / 1.1 Host: 192.168.4.1 User-Agent: Mozilla / 5.0 (Windows NT 5.1; rv: 2.0.1) Gecko / 20100101 Firefox Accept: text / html, application / xhtml + xml, application / xml; q = 0.9, * / *; q = 0.8 Accept-Language: ru-RU, ru; q = 0.8, en-US; q = 0.5, en; q = 0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1

Для нас представляет интерес первая строка запроса: “GET / HTTP/1.1 “. В ней указан URL. Если в браузере набрать http://192.168.4.1/on , тогда в первой строке запроса будет “GET /on HTTP/1.1 “. А если в браузере набрать http://192.168.4.1/off тогда будет “GET /off HTTP/1.1 “. Именно эту строку и анализирует скрипт и в зависимости от полученного URL включает или отключает светодиод.

Далее скрипт отправляет html страничку. Но после отправки нужно разорвать подключение. Поскольку отправка занимает некоторое время, а ждать окончания отправки технически глупо, на событие “sent ” (отправлено) подключим функцию со строкой sck:close() . Это делается в строке: sck:on(“sent”, function(sck) sck:close() end). П осле чего выполняется отправка html страницы sck:send(response). С крипт продолжает работу. Когда ответ будет полностью отправлен, сработает sck:close() .

Страницы большого размера таким образом отправить не получится. Весомое содержимое нужно отправлять кусками. Подробнее об этом будет рассказано в другой статье.

Подключаем реле с нагрузкой

Внимание! Напряжение более 40 Вольт опасно для жизни человека! Будьте внимательны и аккуратны, собирая схему и подключая бытовые приборы. Не прикасайтесь к токоведущим частям.

А теперь вместо светодиода подключим модуль реле, а в качестве нагрузки – скажем лампу, обогреватель, компрессор для аквариума, вентилятор и т.п.

При подключении реле могут быть нюансы. Если блок реле с оптической развязкой (с оптопарой), то, скорее всего, Вам ничего переделывать не придется. Если блок реле без оптической развязки, как у меня, тогда придется переделать работу с GPIO, поскольку во первых реле включается низким уровнем, а не высоким, а во вторых высокий уровень ESP8266 – это 3.3В, для 5-ти вольтового блока реле этого не достаточно, поэтому мне пришлось настроить выход как OPENDRAIN, после чего все заработало как надо.

Финальная версия скрипта выглядит так:

WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg={} cfg.ssid="ESPTEST" cfg.pwd="1234567890" wifi.ap.config(cfg) --Set Pin mode my_pin_nummber = 1 --gpio.mode(my_pin_nummber, gpio.OUTPUT) gpio.mode(my_pin_nummber, gpio.OPENDRAIN) --Create Server sv=net.createServer(net.TCP) function receiver(sck, data) if string.sub (data, 0, 1) == "1" then --gpio.write(my_pin_nummber, gpio.HIGH) gpio.write(my_pin_nummber, gpio.LOW) else if string.sub (data, 0, 1) == "0" then --gpio.write(my_pin_nummber, gpio.LOW) gpio.write(my_pin_nummber, gpio.HIGH) end end print(data) end if sv then sv:listen(333, function(conn) conn:on("receive", receiver) conn:send("Hello!") end) end --Create HTTP Server http=net.createServer(net.TCP) function receive_http(sck, data) print(data) local request = string.match(data,"([^\r,\n]*)[\r,\n]",1) if request == "GET /on HTTP/1.1" then --gpio.write(my_pin_nummber, gpio.HIGH) gpio.write(my_pin_nummber, gpio.LOW) end if request == "GET /off HTTP/1.1" then --gpio.write(my_pin_nummber, gpio.LOW) gpio.write(my_pin_nummber, gpio.HIGH) end sck:on("sent", function(sck) sck:close() collectgarbage() end) local response = "HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n".. "NodeMCU on ESP8266".. "

NodeMCU on ESP8266

".. "
".. "On Off".. "" sck:send(response) end if http then http:listen(80, function(conn) conn:on("receive", receive_http) end) end print("Started.")

Теперь мы можем включать и выключать “розетку” с мобильного телефона с помощью программы RoboRemoFree или с помощью браузера. Разумеется, с обычного компьютера через браузер тоже можно управлять.



Все это хорошо, но что дальше? Если у нас будет 5, 10, 20 подобных устройств? Как их объединить, чтобы не надо было подключаться к каждому устройству отдельно. Для этого существует протокол MQTT, но это будет отдельная тема. А пока мы изучим возможности ESP8266 и NodeMCU.

Некоторые правила работы с языком Lua на NodeMCU

1. Не пишите длинные скрипты. Размер памяти ESP8266 не бесконечен. Разбивайте программу на функциональные модули и делайте их в виде отдельных скриптов, запуская их с помощью dofile() . Например, код подключения к Wifi:

WiFi Settup wifi.setmode (wifi.STATION) local cfg = {} cfg.ssid = "MyWiFi" cfg.pwd = "MyWiFiPassword" wifi.sta.config (cfg) cfg = nil collectgarbage ()

можно вынести в отдельный скрипт “wifi.lua ” и выполнить его из основного скрипта командой dofile(“wifi.lua”) .

2. Переменные, которые используются только в текущем скрипте объявляйте как local . В конце скрипта, когда переменная уже не нужна, присваивайте ей значение nil и явно вызывайте сборщик мусора collectgarbage()

Похожие статьи