ESP8266 NodeMCU Прошивка. Делаем WiFi розетку

Содержание

Популярность WiFi-модулей на базе ESP8266 настолько велика, что помимо прошивок для использования 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/

Где скачать 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

Заходим по этой ссылке: https://github.com/nodemcu/nodemcu-flasher. И из папки Win32/Release (для 32-битной Windows), или из папки Win64/Release (для 64-битной Windows) качаем файл ESP8266Flasher.exe. Эта программа не требует установки. Просто запускаем ее. Переходим в закладку "Config", нажимаем "шестеренку" чтобы выбрать файл прошивки.

Возвращаемся на закладку "Operation" указываем порт, и нажимаем кнопку "Flash".

После нажатия "Flash" должны увидеть МАС-адреса и примерно такую картину.

Ждем пока прошивка завершиться. В нижнем углу должна появиться зеленая галочка.

После этого нужно выключить и снова включить ESP8266. Прошивка завершена.

Если после нажатия кнопки "Flash" процес прошивки не начался (не появились МАС-адреса), нажмите кнопку "reset" на плате и повторите попытку.

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

/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

Примечание: далее описанна робота с ESPlorer v0.1. Внешний вид новых версий может иметь не принципиальные отличия.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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. Распиновка Вашей платы может отличаться.

Websocket

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

Теперь наш скрипт поднимает 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

Установим JuiceSSH и создадим подключение на IP 192.168.4.1, порт 333.

Сразу после подключения должны увидеть такую картину:

Отправим ему радостное "Yes" и должны получить ответ.

Теперь доработаем скрипт так, чтобы получив "1", он включал светодиод, а получив "0" — выключал.

Доработанная версия скрипта main.lua:

Попробуйте отправить "1" и "0". Светодиод должен загораться и гаснуть. Разумеется, управлять светодиодом через терминальную программу очень неудобно. Но в дальнейшем именно терминальная программа позволит Вам отлаживать более сложные проекты.

Работа с RoboRemoFree

В Интернете можно найти массу программ под Android, которые помогают организовать интерфейс для такого рода задач, не прибегая к программированию. Я покажу, как это можно сделать с помощью RoboRemoFree.

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

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

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

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

Далее в меню выбираем пункт "interface"

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

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

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

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

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

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

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

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

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

Web интерфейс

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

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

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

Для нас представляет интерес первая строка запроса: "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, после чего все заработало как надо.

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

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

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

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

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

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

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

Статья про MQTT будет позже, в самом конце цикла статей про NodeMCU. Про то как сохранять настройки через web-интерфейс можно подсмотреть в этом проекте: http://www.avislab.com/blog/gps-tracker-esp8266_ru/ Подробно про web тоже будет статья позже.

Если Хотите настраивать устройство через UART, посмотрите статью http://www.avislab.com/blog/esp8266-nodemcu-uart_ru/ там описан вариант ввода параметров. Останется только их сохранить и использовать в скриптах.

Здравствуйте не могу запустить пример, тот в котором светодиод загорается при отправке 0 і 1, пишет


Источник: blog.avislab.com