ESP8266 прошивка, программирование в Arduino IDE. Микроконтроллер ESP8266: подключение и настройка

Помощь 05.06.2019

Настолько велика, что помимо прошивок для использования 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()

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

Рекомендуем почитать

Наверх