ESP8266:Примеры/Как наладить коммуникацию между двумя ESP8266

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

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


Как наладить коммуникацию между двумя ESP8266[1]

Эта статья рассказывает, как настроить коммуникацию между двумя модулями ESP8266.

Как это работает

Первый ESP8266 будет настроен как точка доступа (сервер), а второй – как станция (клиент). Между ними будет установлено беспроводное соединение, и клиент будет отправлять серверу сообщение «Hello, World!»

Перед тем, как продолжить, пройдите вот эти руководства:

Прошивку NodeMCU нужно загрузить на оба ESP8266.

Необходимые компоненты

  • Два модуля ESP8266
  • Один программатор FTDI

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

Основы программирования на 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 последовательное соединение. Сделайте это и для клиента, и для сервера.

Установка и загрузка ESPlorer IDE

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

  1. Кликните здесь, чтобы скачать ZIP-архив с ESPlorer IDE
  2. Распакуйте скачанный архив
  3. Перейдите в главную папку
  4. Запустите файл «ESPlorer.jar». Это программа на JAVA, поэтому на вашем компьютере должна быть установлена JAVA.
  5. Откройте 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, если еще не открыли, а затем проделайте следующее:

  1. Подключите программатор FTDI к компьютеру
  2. Выставьте скорость передачи данных на 9600 бод
  3. Выберите порт, к которому подключен программатор FTDI (к примеру, COM3)
  4. Нажмите на кнопку «Open/Close»
  5. Нажмите на вкладку «NodeMCU+MicroPython»
  6. Скопируйте 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.

См.также

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