ESP8266:Примеры/Как наладить коммуникацию между двумя ESP8266: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
(не показаны 4 промежуточные версии 2 участников) | |||
Строка 2: | Строка 2: | ||
{{Перевод от Сubewriter}} | {{Перевод от Сubewriter}} | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Как наладить коммуникацию между двумя ESP8266<ref>[https://randomnerdtutorials.com/how-to-make-two-esp8266-talk/ randomnerdtutorials.com - How to Make Two ESP8266 Talk]</ref>= | =Как наладить коммуникацию между двумя ESP8266<ref>[https://randomnerdtutorials.com/how-to-make-two-esp8266-talk/ randomnerdtutorials.com - How to Make Two ESP8266 Talk]</ref>= | ||
Строка 45: | Строка 43: | ||
* '''Глобальные переменные.''' Все переменные по умолчанию считаются глобальными (если в коде специально не задано, что они локальные). | * '''Глобальные переменные.''' Все переменные по умолчанию считаются глобальными (если в коде специально не задано, что они локальные). | ||
::<syntaxhighlight lang="lua | ::<syntaxhighlight lang="lua"> | ||
pin = 3 | pin = 3 | ||
test = "It works!" | test = "It works!" | ||
Строка 52: | Строка 50: | ||
* '''Локальные переменные.''' Если переменная задана локальной, область ее видимости будет ограничена лишь ее функцией. | * '''Локальные переменные.''' Если переменная задана локальной, область ее видимости будет ограничена лишь ее функцией. | ||
::<syntaxhighlight lang="lua | ::<syntaxhighlight lang="lua"> | ||
local pin = 3 | local pin = 3 | ||
local test = "It works!" | local test = "It works!" | ||
Строка 59: | Строка 57: | ||
* '''Поля таблиц.''' Это особый тип переменных, в которых может храниться все, за исключением '''«nil»''' (мы это затрагивать не будем). | * '''Поля таблиц.''' Это особый тип переменных, в которых может храниться все, за исключением '''«nil»''' (мы это затрагивать не будем). | ||
{{Примечание1|1=[[Lua]] – это язык, чувствительный к регистру. Поэтому переменная '''«PIN»''' – это не то же самое, что '''«Pin»''' или '''«pin»'''.}} | |||
==== Типы данных (типы значений) ==== | ==== Типы данных (типы значений) ==== | ||
Строка 67: | Строка 65: | ||
В таблице ниже показаны типы данных для значений в языке [[Lua]]. | В таблице ниже показаны типы данных для значений в языке [[Lua]]. | ||
{| class="wikitable" style="margin:0 auto;" | {| class="wikitable" style="margin:0 auto" style="margin:0 auto;" | ||
|- | |- | ||
! Тип значения !! Описание | ! Тип значения !! Описание | ||
Строка 86: | Строка 84: | ||
Вот примеры некоторых из этих типов значений: | Вот примеры некоторых из этих типов значений: | ||
<syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
print(type("Hello world!")) –- строка | print(type("Hello world!")) –- строка | ||
print(type(7)) -- число | print(type(7)) -- число | ||
Строка 94: | Строка 92: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{Примечание1|1=Работая с [[ESP8266]] и прошивкой [[NodeMCU]], вы изредка будете встречать тип данных '''«nil»'''. Это будет значить лишь, что такая переменная не определена. Также, если вы хотите удалить какое-то значение в какой-то переменной, просто присвойте ей значение '''«nil»'''.}} | |||
==== Комментарии ==== | ==== Комментарии ==== | ||
Строка 102: | Строка 100: | ||
* Однострочные комментарии: | * Однострочные комментарии: | ||
::<syntaxhighlight lang="lua | ::<syntaxhighlight lang="lua"> | ||
print("Hello World!") –- комментарий в одну строчку | print("Hello World!") –- комментарий в одну строчку | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 108: | Строка 106: | ||
* Многострочные комментарии: | * Многострочные комментарии: | ||
::<syntaxhighlight lang="lua | ::<syntaxhighlight lang="lua"> | ||
--[[ | --[[ | ||
print("Hello World!") – это многострочный комментарий | print("Hello World!") – это многострочный комментарий | ||
Строка 124: | Строка 122: | ||
Читая таблицы и примеры ниже, представьте, что имеете дело с двумя переменными: '''«А»''', в которой хранится значение '''«1»''', и '''«B»''', в которой хранится значение '''«2»'''. | Читая таблицы и примеры ниже, представьте, что имеете дело с двумя переменными: '''«А»''', в которой хранится значение '''«1»''', и '''«B»''', в которой хранится значение '''«2»'''. | ||
<syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
A = 1 | A = 1 | ||
B = 2 | B = 2 | ||
Строка 131: | Строка 129: | ||
===== Арифметические операторы ===== | ===== Арифметические операторы ===== | ||
{| class="wikitable" style="margin:0 auto;" | {| class="wikitable" style="margin:0 auto" style="margin:0 auto;" | ||
|- | |- | ||
! Оператор !! Пример !! Результат | ! Оператор !! Пример !! Результат | ||
Строка 152: | Строка 150: | ||
===== Операторы сравнения ===== | ===== Операторы сравнения ===== | ||
{| class="wikitable" style="margin:0 auto;" | {| class="wikitable" style="margin:0 auto" style="margin:0 auto;" | ||
|- | |- | ||
! Оператор !! Пример !! Результат | ! Оператор !! Пример !! Результат | ||
Строка 171: | Строка 169: | ||
===== Логические операторы ===== | ===== Логические операторы ===== | ||
{| class="wikitable" style="margin:0 auto;" | {| class="wikitable" style="margin:0 auto" style="margin:0 auto;" | ||
|- | |- | ||
! Оператор !! Пример !! Результат | ! Оператор !! Пример !! Результат | ||
Строка 186: | Строка 184: | ||
Теперь представьте, что у нас две новые переменные: | Теперь представьте, что у нас две новые переменные: | ||
<syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
a = "Hello!" | a = "Hello!" | ||
b = "World!" | b = "World!" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{| class="wikitable" style="margin:0 auto;" | {| class="wikitable" style="margin:0 auto" style="margin:0 auto;" | ||
|- | |- | ||
! Оператор !! Пример !! Результат | ! Оператор !! Пример !! Результат | ||
Строка 202: | Строка 200: | ||
Цикл позволяет выполнить блок кода несколько раз, пока выполняется заданное условие. Во фрагменте кода ниже – пока значением в переменной '''«boolean_value»''' является '''«true»'''. | Цикл позволяет выполнить блок кода несколько раз, пока выполняется заданное условие. Во фрагменте кода ниже – пока значением в переменной '''«boolean_value»''' является '''«true»'''. | ||
<syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
-- цикл while | -- цикл while | ||
while boolean_value | while boolean_value | ||
Строка 220: | Строка 218: | ||
Операторы '''if... else''' (т.е. «если... иначе») – один из самых важных инструментов для управления программой. Они используются следующим образом: | Операторы '''if... else''' (т.е. «если... иначе») – один из самых важных инструментов для управления программой. Они используются следующим образом: | ||
<syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
if boolean_value then | if boolean_value then | ||
-- если в переменной «boolean_value» значение «true» | -- если в переменной «boolean_value» значение «true» | ||
Строка 236: | Строка 234: | ||
Ниже показано, как создать новую функцию, принимающую один параметр (температуру в градусах Кельвина) и преобразующую это значение в градусы Цельсия и Фаренгейта. | Ниже показано, как создать новую функцию, принимающую один параметр (температуру в градусах Кельвина) и преобразующую это значение в градусы Цельсия и Фаренгейта. | ||
<syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
function displayTemperature(kelvin) | function displayTemperature(kelvin) | ||
celsius = kelvin – 273.15 | celsius = kelvin – 273.15 | ||
Строка 273: | Строка 271: | ||
В этом скрипте [[ESP]]-сервер выступает точкой доступа с собственным '''SSID (test)''' и '''паролем (12345678)'''. Этот сервер устанавливает соединение, потом начинает его прослушивать и, если получает сообщение, то печатает его в мониторе порта. | В этом скрипте [[ESP]]-сервер выступает точкой доступа с собственным '''SSID (test)''' и '''паролем (12345678)'''. Этот сервер устанавливает соединение, потом начинает его прослушивать и, если получает сообщение, то печатает его в мониторе порта. | ||
<syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" > | ||
-- Автор – Руи Сантос (Rui Santos) | -- Автор – Руи Сантос (Rui Santos) | ||
-- Более подробно о проекте на http://randomnerdtutorials.com | -- Более подробно о проекте на http://randomnerdtutorials.com | ||
Строка 315: | Строка 313: | ||
В этом скрипте клиентский [[ESP]] работает как станция, которая постоянная ищет точку доступа. Когда клиент находит сервер, между ними устанавливается соединение, и клиент начинает каждые пять секунд отправлять серверу сообщение '''«Hello, World!»''' | В этом скрипте клиентский [[ESP]] работает как станция, которая постоянная ищет точку доступа. Когда клиент находит сервер, между ними устанавливается соединение, и клиент начинает каждые пять секунд отправлять серверу сообщение '''«Hello, World!»''' | ||
<syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="lua" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" > | ||
-- Автор – Руи Сантос (Rui Santos) | -- Автор – Руи Сантос (Rui Santos) | ||
-- Более подробно о проекте на http://randomnerdtutorials.com | -- Более подробно о проекте на http://randomnerdtutorials.com | ||
Строка 355: | Строка 353: | ||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 362: | Строка 358: | ||
<references /> | <references /> | ||
{{Навигационная таблица/ | {{Навигационная таблица/Портал/ESP8266}} | ||
[[Категория:ESP8266]] | [[Категория:ESP8266]] |
Текущая версия от 12:59, 18 июня 2023
Как наладить коммуникацию между двумя ESP8266[1]
Эта статья рассказывает, как настроить коммуникацию между двумя модулями ESP8266.
Как это работает
Первый ESP8266 будет настроен как точка доступа (сервер), а второй – как станция (клиент). Между ними будет установлено беспроводное соединение, и клиент будет отправлять серверу сообщение «Hello, World!»
Перед тем, как продолжить, пройдите вот эти руководства:
- Как начать работать с трансиверным WiFi-модулем на базе ESP8266
- Как загрузить прошивку на ESP8266 при помощи NodeMCU на Windows
Прошивку NodeMCU нужно загрузить на оба 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 – это язык с динамической типизацией, поэтому у переменных нет типов данных. Типы данных есть только у значений. Значения могут храниться в переменных, передаваться в виде параметров и возвращаться в виде результатов.
В таблице ниже показаны типы данных для значений в языке 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)) -- неопределенное значение
Комментарии
Комментарии – это просто текст, в котором программист объясняет, как работает его код. Если какой-то фрагмент кода помечен как комментарий, то 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 последовательное соединение. Сделайте это и для клиента, и для сервера.
Установка и загрузка ESPlorer IDE
Для загрузки LUA-файлов на ESP8266 рекомендую использовать программу ESPlorer IDE, написанную пользователем 4refr0nt. Чтобы установить ее, сделайте следующее:
- Кликните здесь, чтобы скачать ZIP-архив с ESPlorer IDE
- Распакуйте скачанный архив
- Перейдите в главную папку
- Запустите файл «ESPlorer.jar». Это программа на JAVA, поэтому на вашем компьютере должна быть установлена JAVA.
- Откройте ESPlorer IDE
Скрипт для сервера
Не забудьте, опять же, что прошивку 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». Все элементы, необходимые для этих действий, выделены на картинке ниже красным цветом:
Скрипт для клиента
Загрузите на клиентский 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!» В результате коммуникация будет выглядеть следующим образом:
В левом окне показано окно для вывода данных в ESPlorer IDE, а в правом – последовательная коммуникация в PuTTY.org.
См.также
Внешние ссылки
ESP8266 AT-команды | |
---|---|
Список AT-команд | |
Базовые команды |
|
Команды для WiFi |
|
Команды для TCP/IP |
|