Хочешь создать умный дом, но не знаешь как? Присмотрись к Node-REDCutehamster.gif! Так же не забывай поддержать наш справочникCutehamster.gif.

ESP8266:Примеры/Как собрать веб-сервер на базе ESP8266

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 3377 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Как собрать веб-сервер на базе ESP8266[1]

В этой статье рассказывается, как создать автономный веб-сервер на базе WiFi-модуля ESP8266. Этот веб-сервер позволит удаленно (при помощи устройства, подключенного к той же сети, что и ESP8266) управлять двумя светодиодами. Если вы не знаете, что такое ESP8266, то ознакомительную статью можно почитать по этой ссылке.

Справочная информация

Основы программирования на Lua

Это скриптовый язык программирования, написанный на C. Разработка этого проекта началась в 1993 году силами Роберту Иерузалимски, Луиша Энрике де Фигейреду и Валдемара Келе, работавшими тогда в подразделении Tecgraf при Католическом университете Рио-де-Жанейро.

Более подробно об этом языке программирования можно почитать в «Википедии».

Прошивка NodeMCU для ESP8266 основана на Lua, поэтому если вы хотите писать собственные скрипты для ESP8266, вам важно знать основы этого языка.

Переменные

Переменные в языке Lua не делятся по типу данных, но делятся по области видимости. Это значит, что переменные в Lua могут быть глобальными или локальными.

  • Глобальные переменные. Все переменные по умолчанию считаются глобальными (если в коде специально не задано, что они локальные).
pin = 3
test = "It works!"
  • Локальные переменные. Если переменная задана локальной, область ее видимости будет ограничена лишь ее функцией.
local pin = 3
local test = "It works!"
  • Поля таблиц. Это особый тип переменных, в которых может храниться все, за исключением «nil» (мы это затрагивать не будем).

Примечание: Lua – это язык, чувствительный к регистру. Поэтому переменная «PIN» – это не то же самое, что «Pin» или «pin».

Типы данных (типы значений)

Lua – это язык с динамической типизацией, поэтому у переменных нет типов данных. Типы данных есть только у значений. Значения могут храниться в переменных, передаваться в виде параметров и возвращаться в виде результатов.

В таблице ниже показаны типы данных для значений в языке Lua.

Тип значения Описание
Строка (string) Массив символов
Число (number) Действительное (двойной точности с плавающей запятой) число
Булево значение (boolean) Значение «true» или «false». Как правило, используется для проверки выполнения условий
Функция (function) Функция, написанная на Lua
Неопределенное значение (nil) В такой переменной не хранится никаких данных
Таблица (table), пользовательские данные (userdata) и поток (thread) Эти три типа данных мы затрагивать не будем

Вот примеры некоторых из этих типов значений:

  1. print(type("Hello world!"))- строка
  2. print(type(7))              -- число
  3. print(type(true))           -- булево значение
  4. print(type(print))          -- функция
  5. print(type(nil))            -- неопределенное значение

Примечание: Работая с ESP8266 и прошивкой NodeMCU, вы изредка будете встречать тип данных «nil». Это будет значить лишь, что такая переменная не определена. Также, если вы хотите удалить какое-то значение в какой-то переменной, просто присвойте ей значение «nil».

Комментарии

Комментарии – это просто текст, в котором программист объясняет, как работает его код. Если какой-то фрагмент кода помечен как комментарий, то ESP-модуль проигнорирует его и не будет обрабатывать. Комментарии начинаются с двух тире («--»). Вот два типа комментариев:

  • Однострочные комментарии:
print("Hello World!")- комментарий в одну строчку
  • Многострочные комментарии:
--[[
print("Hello World!") – это многострочный комментарий
--]]

Операторы

Оператор – это символ, который говорит интерпретатору выполнить определенное математическое или логическое действие. В язык Lua встроено много операторов разных типов:

  • Арифметические операторы;
  • Операторы сравнения;
  • Логические операторы;
  • Прочие операторы;

Читая таблицы и примеры ниже, представьте, что имеете дело с двумя переменными: «А», в которой хранится значение «1», и «B», в которой хранится значение «2».

  1. A = 1
  2. B = 2
Арифметические операторы
Оператор Пример Результат
+ A + B 3
- A - B -1
* A * B 2
/ B / A 2
 % B % A 0
^ B^2 4
- -A -1
Операторы сравнения
Оператор Пример Результат
== (A == B) false
~= (A ~= B) true
> (A > B) false
< (A < B) true
>= (A >= B) false
<= (A <= B) true
Логические операторы
Оператор Пример Результат
and (и) (A and B) false
or (или) (A or B) true
not (не)  !(A and B) true
Оператор конкатенации

Теперь представьте, что у нас две новые переменные:

  1. a = "Hello!"
  2. b = "World!"
Оператор Пример Результат
.. a..b "Hello World!"

Циклы

Цикл позволяет выполнить блок кода несколько раз, пока выполняется заданное условие. Во фрагменте кода ниже – пока значением в переменной «boolean_value» является «true».

  1. -- цикл while
  2. while boolean_value
  3. do
  4.  -- код будет выполняться, пока в «boolean_value» будет «true»
  5. end
  6.  
  7. -- и цикл for
  8. for min, max, increment
  9. do
  10.   -- код будет выполняться, пока не будет достигнуто макс. значение
  11. end

Операторы if… else

Операторы if... else (т.е. «если... иначе») – один из самых важных инструментов для управления программой. Они используются следующим образом:

  1. if boolean_value then
  2.     -- если в переменной «boolean_value» значение «true»
  3. else
  4.     -- если в переменной «boolean_value» значение «false»
  5. end

Названия этих операторов говорят сами за себя. Если выполнено условие «boolean_value=true», то программа выполнит код, идущий после «if». Но если условием является «boolean_value=false», то программа выполнит код, идущий после «else».

Функции

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

Ниже показано, как создать новую функцию, принимающую один параметр (температуру в градусах Кельвина) и преобразующую это значение в градусы Цельсия и Фаренгейта.

  1. function displayTemperature(kelvin)
  2.   celsius = kelvin – 273.15
  3.   print("Temperature in Celsius is: ", celsius)
  4.  
  5.   fahrenheit = (celsius*9/5+32)
  6.   print("Temperature in Fahrenheit is: ", fahrenheit)
  7. end
  8.  
  9. k = 294- температура в градусах Кельвина
  10.  
  11. displayTemperature(k)- эта строчка вызывает функцию, созданную выше


Загрузка прошивки NodeMCU на ESP8266

NodeMCU – это прошивка, позволяющая программировать модуль ESP8266 при помощи LUA-скрипта, и это очень похоже на программирование платы Arduino. Благодаря LUA-скрипту, установленному на ESP8266, можно устанавливать WiFi-соединение, управлять GPIO-контактами, превратить ESP8266 в веб-сервер и т.д.

Подключение к 3,3-вольтовому программатору FTDI

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

Esp8266 pinout h-569x236 3.png

Чтобы подключить ESP8266 к программатору FTDI, нужны следующие контакты:

  • Контакт RX на ESP8266 – к контакту TX на программаторе
  • Контакт TX – к контакту RX
  • Контакт CH_PD – к контакту 3.3V
  • Контакт GPIO 0 – к контакту GND
  • Контакт VCC – к контакту 3.3V
  • Контакт GND – к контакту GND
ESP-ftdi 4.png

Загрузка флэшера NodeMCU на Windows

Подключив ESP8266 к программатору FTDI, загрузите флэшер NodeMCU (это файл формата «*.exe»):

Всю необходимую информацию о флэшере NodeMCU можно найти в его GitHub-репозитории.

Загрузка прошивки на ESP8266

Откройте флэшер, который только что загрузили. Должно открыться примерно вот такое окно:

Nodemcu flaser.png

Обратите внимание на вкладку «Advanced» – здесь находятся дополнительные настройки; если нужно, поменяйте здесь что-нибудь. Затем вернитесь на вкладку «Operation» и нажмите на кнопку «Flash». В ту же секунду должен начаться процесс загрузки прошивки. Если все загрузится правильно, в левом нижнем углу флэшера появится круглая зеленая иконка с галочкой внутри.

Схема для проекта

Для этого проекта вам понадобятся, кроме модуля ESP8266, источник питания (например, батарея) и два светодиода.

ESP-web-server bb ESP8266 Web Server Tutorial 1.png

Как загрузить код на ESP8266

Для загрузки LUA-скриптов на ESP8266 рекомендую использовать программу ESPlorer IDE, написанную пользователем 4refr0nt. Чтобы скачать и установить ее, проделайте следующее:

  1. Кликните здесь, чтобы скачать ZIP-архив с ESPlorer IDE
  2. Распакуйте скачанный архив
  3. Перейдите в папку «dist» (она находится по маршруту «ESPlorer-master\ESPlorer\dist»)
  4. Запустите файл «ESPlorer.jar». Это программа на JAVA, поэтому на вашем компьютере должна быть установлена JAVA
  5. Откройте ESPlorer IDE

В результате должно открыться вот такое окно:

Esplorer-start ESP8266 Web Server Tutorial 2.png

Теперь настала очередь для загрузка LUA-скрипта. Для этого проделайте следующее:

  1. Подключите программатор FTDI к компьютеру
  2. Выберите порт, к которому подключен программатор
  3. Нажмите кнопку «Open/Close»
  4. Выберите вкладку «NodeMCU+MicroPython»
  5. Создайте новый файл под названием «init.lua»
  6. Нажмите кнопку «Save to ESP»

Все элементы программы, необходимые для этих действий, выделены на картинке ниже красным цветом:

Esplorer tab ESP8266 Web Server Tutorial 3.png

Код

Теперь при помощи ESPlorer IDE загрузите на ESP8266 скрипт, показанный ниже. Файл должен быть назван «init.lua». Этот файл также можно загрузить отсюда.

  1. wifi.setmode(wifi.STATION)
  2. wifi.sta.config("YOUR_NETWORK_NAME","YOUR_NETWORK_PASSWORD")
  3. print(wifi.sta.getip())
  4. led1 = 3
  5. led2 = 4
  6. gpio.mode(led1, gpio.OUTPUT)
  7. gpio.mode(led2, gpio.OUTPUT)
  8. srv=net.createServer(net.TCP)
  9. srv:listen(80,function(conn)
  10.     conn:on("receive", function(client,request)
  11.         local buf = "";
  12.         local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
  13.         if(method == nil)then
  14.             _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
  15.         end
  16.         local _GET = {}
  17.         if (vars ~= nil)then
  18.             for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
  19.                 _GET[k] = v
  20.             end
  21.         end
  22.         buf = buf.."<h1> ESP8266 Web Server</h1>";
  23.         buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
  24.         buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";
  25.         local _on,_off = "",""
  26.         if(_GET.pin == "ON1")then
  27.               gpio.write(led1, gpio.HIGH);
  28.         elseif(_GET.pin == "OFF1")then
  29.               gpio.write(led1, gpio.LOW);
  30.         elseif(_GET.pin == "ON2")then
  31.               gpio.write(led2, gpio.HIGH);
  32.         elseif(_GET.pin == "OFF2")then
  33.               gpio.write(led2, gpio.LOW);
  34.         end
  35.         client:send(buf);
  36.         client:close();
  37.         collectgarbage();
  38.     end)
  39. end)

Примечание: Не забудьте поменять данные во 2-ой строчке. Впишите туда данные для своей WiFi-сети (название сети и пароль к ней).

Доступ к веб-серверу

Перезапустившись, ESP8266 напечатает в мониторе порта ESPlorer IDE собственный IP-адрес. В моем случае это «192.168.1.82». Впишите этот IP-адрес в адресную строку браузера и нажмите  ↵ Enter . В результате, если все настроено правильно, вы должны получить доступ к веб-серверу, позволяющему управлять двумя светодиодами.

Web-server-esp8266 ESP8266 Web Server Tutorial 4.png

Вот так проект выглядит в действии:

[Видео – https://www.youtube.com/watch?v=ONKM5lSthNY]

См.также

Внешние ссылки

  1. randomnerdtutorials.com - ESP8266 Web Server Tutorial