ESP8266:Примеры/Как наладить коммуникацию между двумя ESP8266: различия между версиями
Myagkij (обсуждение | вклад) |
(нет различий)
|
Версия от 19:34, 31 марта 2019
![]() |
Черновик |
Как наладить коммуникацию между двумя ESP8266[1]
Эта статья рассказывает, как настроить коммуникацию между двумя модулями ESP8266.
Как это работает
Первый ESP8266 будет настроен как точка доступа (сервер), а второй – как станция (клиент). Между ними будет установлено беспроводное соединение, и клиент будет отправлять серверу сообщение «Hello, World!»
![](/ruwiki/images/e/e5/Esp-client-vs-server.jpg)
Перед тем, как продолжить, пройдите вот эти руководства:
- Как начать работать с трансиверным WiFi-модулем на базе ESP8266
- Как загрузить прошивку на ESP8266 при помощи NodeMCU на Windows
Прошивку NodeMCU нужно загрузить на оба ESP8266.
Необходимые компоненты
![](/ruwiki/images/d/d6/ESP01v0.jpg)
Справочная информация
Основы программирования на 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) | Эти три типа данных мы затрагивать не будем |
Вот примеры некоторых из этих типов значений:
print(type("Hello world!")) –- строка
print(type(7)) -- число
print(type(true)) -- булево значение
print(type(print)) -- функция
print(type(nil)) -- неопределенное значение
Примечание: Работая с ESP8266 и прошивкой NodeMCU, вы изредка будете встречать тип данных «nil». Это будет значить лишь, что такая переменная не определена. Также, если вы хотите удалить какое-то значение в какой-то переменной, просто присвойте ей значение «nil».
Комментарии
Комментарии – это просто текст, в котором программист объясняет, как работает его код. Если какой-то фрагмент кода помечен как комментарий, то ESP-модуль проигнорирует его и не будет обрабатывать. Комментарии начинаются с двух тире («--»). Вот два типа комментариев:
- Однострочные комментарии:
print("Hello World!") –- комментарий в одну строчку
- Многострочные комментарии:
--[[ print("Hello World!") – это многострочный комментарий --]]
Операторы
Оператор – это символ, который говорит интерпретатору выполнить определенное математическое или логическое действие. В язык Lua встроено много операторов разных типов:
- Арифметические операторы;
- Операторы сравнения;
- Логические операторы;
- Прочие операторы;
Читая таблицы и примеры ниже, представьте, что имеете дело с двумя переменными: «А», в которой хранится значение «1», и «B», в которой хранится значение «2».
A = 1
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 |
Оператор конкатенации
Теперь представьте, что у нас две новые переменные:
a = "Hello!"
b = "World!"
Оператор | Пример | Результат |
---|---|---|
.. | a..b | "Hello World!" |
Циклы
Цикл позволяет выполнить блок кода несколько раз, пока выполняется заданное условие. Во фрагменте кода ниже – пока значением в переменной «boolean_value» является «true».
-- цикл while
while boolean_value
do
-- код будет выполняться, пока в «boolean_value» будет «true»
end
-- и цикл for
for min, max, increment
do
-- код будет выполняться, пока не будет достигнуто макс. значение
end
Операторы if… else
Операторы if... else (т.е. «если... иначе») – один из самых важных инструментов для управления программой. Они используются следующим образом:
if boolean_value then
-- если в переменной «boolean_value» значение «true»
else
-- если в переменной «boolean_value» значение «false»
end
Названия этих операторов говорят сами за себя. Если выполнено условие «boolean_value=true», то программа выполнит код, идущий после «if». Но если условием является «boolean_value=false», то программа выполнит код, идущий после «else».
Функции
Функции – отличный способ организации кода. Если вы хотите сделать в программе что-либо несколько раз, вам необязательно по несколько раз прописывать этот код. Можно просто создать отдельную функцию, содержащую этот код, а затем вызывать ее, когда вам нужно.
Ниже показано, как создать новую функцию, принимающую один параметр (температуру в градусах Кельвина) и преобразующую это значение в градусы Цельсия и Фаренгейта.
function displayTemperature(kelvin)
celsius = kelvin – 273.15
print("Temperature in Celsius is: ", celsius)
fahrenheit = (celsius*9/5+32)
print("Temperature in Fahrenheit is: ", fahrenheit)
end
k = 294 –- температура в градусах Кельвина
displayTemperature(k) –- эта строчка вызывает функцию, созданную выше
Схема подключения 3,3-вольтового программатора FTDI
Чтобы загрузить код на ESP8266, вам нужно настроить между ним и программатором FTDI последовательное соединение. Сделайте это и для клиента, и для сервера.
![](/ruwiki/images/c/cd/ESP-Schematics_%283.3V_FTDI_Programmer%29.png)
Установка и загрузка ESPlorer IDE
Для загрузки LUA-файлов на ESP8266 рекомендую использовать программу ESPlorer IDE, написанную пользователем 4refr0nt. Чтобы установить ее, сделайте следующее:
- Кликните здесь, чтобы скачать ZIP-архив с ESPlorer IDE
- Распакуйте скачанный архив
- Перейдите в главную папку
- Запустите файл «ESPlorer.jar». Это программа на JAVA, поэтому на вашем компьютере должна быть установлена JAVA.
- Откройте ESPlorer IDE
![](/ruwiki/images/5/53/Esplorer-start.png)
Скрипт для сервера
Не забудьте, опять же, что прошивку NodeMCU нужно записать на оба ESP8266. Затем скопируйте и вставьте в ESPlorer IDE код, показанный ниже.
В этом скрипте ESP-сервер выступает точкой доступа с собственным SSID (test) и паролем (12345678). Этот сервер устанавливает соединение, потом начинает его прослушивать и, если получает сообщение, то печатает его в мониторе порта.
-- Автор – Руи Сантос (Rui Santos)
-- Более подробно о проекте на http://randomnerdtutorials.com
-- Сервер ESP8266
print("ESP8266 Server") -- "Сервер ESP8266"
wifi.setmode(wifi.STATIONAP);
wifi.ap.config({ssid="test",pwd="12345678"});
print("Server IP Address:",wifi.ap.getip()) -- "IP-адрес сервера:"
sv = net.createServer(net.TCP)
sv:listen(80, function(conn)
conn:on("receive", function(conn, receivedData)
print("Received Data: " .. receivedData)
-- "Полученные данные: "
end)
conn:on("sent", function(conn)
collectgarbage()
end)
end)
Загрузка скрипта на ESP8266
Откройте ESPlorer IDE, если еще не открыли, а затем проделайте следующее:
- Подключите программатор FTDI к компьютеру
- Выставьте скорость передачи данных на 9600 бод
- Выберите порт, к которому подключен программатор FTDI (к примеру, COM3)
- Нажмите на кнопку «Open/Close»
- Нажмите на вкладку «NodeMCU+MicroPython»
- Скопируйте LUA-скрипт в ESPlorer IDE
Затем просто кликните на кнопку «Save to ESP» и сохраните файл под названием «init.lua». Все элементы, необходимые для этих действий, выделены на картинке ниже красным цветом:
![](/ruwiki/images/b/b1/Esplorer_Uploading_Your_Lua_Script.png)
Скрипт для клиента
Загрузите на клиентский ESP прошивку NodeMCU (если еще не загрузили). Скопируйте и вставьте в ESPlorer IDE код показанный ниже.
В этом скрипте клиентский ESP работает как станция, которая постоянная ищет точку доступа. Когда клиент находит сервер, между ними устанавливается соединение, и клиент начинает каждые пять секунд отправлять серверу сообщение «Hello, World!»
-- Автор – Руи Сантос (Rui Santos)
-- Более подробно о проекте на http://randomnerdtutorials.com
-- Клиент ESP8266
print("ESP8266 Client") -- "Клиент ESP8266"
wifi.sta.disconnect()
wifi.setmode(wifi.STATION)
wifi.sta.config("test","12345678") –- подключаемся к серверу
wifi.sta.connect()
print("Looking for a connection") -- "Поиск соединения"
tmr.alarm(1, 2000, 1, function()
if(wifi.sta.getip()~=nil) then
tmr.stop(1)
print("Connected!") -- "Подключились!"
print("Client IP Address:",wifi.sta.getip())
-- "IP-адрес клиента:"
cl=net.createConnection(net.TCP, 0)
cl:connect(80,"192.168.4.1")
tmr.alarm(2, 5000, 1, function()
cl:send("Hello World!")
end)
else
print("Connecting...") -- "Подключение..."
end
end)
Загрузите этот скрипт на клиентский ESP, следуя тем же указаниям, что и в подразделе «Загрузка скрипта на ESP8266» (см. выше).
Демонстрация
Итак, если все настроено правильно, клиент должен по беспроводной связи подключиться к серверу и передать ему сообщение «Hello, World!» В результате коммуникация будет выглядеть следующим образом:
![](/ruwiki/images/8/84/Data-received-esp8266.jpg)
В левом окне показано окно для вывода данных в ESPlorer IDE, а в правом – последовательная коммуникация в PuTTY.org.