Arduino.ru
Есть два модуля ESP8266. Соеденил их между собой по WI-FI. Но вот не как не разберусь как передать данные с одного модуля на другой. Задача передать данные с датчиков с одногомодуля на другой. Делал при помощи AT команд на прошивках которые идут с модулями все работает. Но в Arduino запутался и уперся в стену.
Нашел что есть такие команды. Посмотрите правильно ли я понял их синтаксис написания.
udp.beginPacketMulticast(addr, port, WiFi.localIP()) эу пишем в передающем модуле
addr — это IP адрес принимающего модуля
port — открытый порт
WiFi.localIP() — IP модуля передающего данные
udp.beginMulticast(WiFi.localIP(), multicast_ip_addr, port) — эту пише в принимающем модуле.
WiFi.localIP() — IP модуля принимающего
multicast_ip_addr — IP адрес откуда принимаем
port — открытый порт
Этими командами мы настравиваем прием и передачу, а вот как передавать , какими командами?
Т.к должно же быть указанно откуда эти данные брать.
Как указывается конец передачи ? Этого я не смог найти. И где можно более подробно прочитать про команды передачи данных иодуля ESP8266 по WI-FI.
Esp 12e как передавать данные между модулями
Насколько я помню, соединить 2 готовых девайса по UART посредством ESP8266 (с родной прошивкой) не так-то просто, т.к. прошивка соединяемых устройств должна быть адаптирована под использование ESP8266.
Если адаптировать прошивку соединяемых оконечных устройств нет возможности (или желания), то придётся прошивать сами модули ESP8266.
Например, этими прошивками:
После перешивки и предварительной настройки (параметры соединений запоминаются) пару ESP8266 можно использовать как прозрачный удлинитель UART (transparent bridge).
EP8266. Управление устройствами по MQTT протоколу

За последние несколько лет устройства Интернета вещей (IoT) стали неотъемлемой частью нашей повседневной жизни. От умных домов, умных ламп до умных приборов; создатели и разработчики используют эту технологию для создания сети подключенных устройств, которая делает нашу повседневную жизнь немного более захватывающей. Все это стало возможным благодаря простоте связи. Существует множество возможных способов обмена данными между устройствами, но в коммерческих продуктах и продуктах для хобби обычно используется один протокол — Message Queuing Telemetry Transport (MQTT).
В этом проекте мы будем использовать бесплатный и популярный брокер Eclipse MQTT и узнаем, как подключить устройство Интернета вещей (в нашем случае это модуль NodeMCU) к брокеру MQTT и передавать данные между брокером MQTT и NodeMCU.
Описание протокола MQTT
Прежде чем мы продолжим, лучше иметь четкое представление о протоколе MQTT (Message Queuing Telemetry Transport) . Это облегченный протокол обмена сообщениями, который использует метод публикации / подписки и транслирует сообщения между несколькими устройствами. Используя протокол MQTT, мы также можем отправлять / получать данные и управлять различными устройствами вывода, такими как считывание данных с датчиков и т. д. Он разработан поверх TCP, поэтому он быстрее, чем аналогичные протоколы, такие как HTTP. Помимо этого, он имеет много других преимуществ. Это его очень легкий вес, поэтому он не потребляет лишнюю память, он может работать с очень низкой пропускной способностью сети, кроме того, он имеет встроенный надежный протокол безопасности. Эти функции делают его подходящим для многих приложений.
Как работает MQTT?
Общая схема работы по протоколу MQTT представлена на рисунке ниже

Теперь разберем ее более подробно. Для начала разберемся с терминологией:
Клиент MQTT:
Клиент MQTT — это любое устройство (это может быть микроконтроллер или сервер), которое выполняет функции MQTT и взаимодействует с центральным сервером, который известен как “брокер”. Брокер обрабатывает обмен данными между подключенными клиентами.
Издатель MQTT:
Когда клиент хочет отправить какую-либо информацию, клиент известен как “Издатель”. Издатель будет публиковать информацию по определенной теме. “Тема” — это путь, по которому мы можем публиковать / подписывать сообщения. Затем брокер отправляет информацию, опубликованную пользователем, клиентам (также известным как подписчики), которые подписались на эту конкретную тему.
Подписчик MQTT:
Подписчик MQTT подписывается на разделы брокера MQTT для чтения сообщений, отправляемых брокером.
Как мы видим на схеме сенсор-клиент передает MQTT брокеру какие-либо данные. Для брокера она в данный момент является Издателем. Далее приложение-клиент подключается к брокеру и считывает эти данные. Оно является Подписчиком. Если же приложение будет отправлять какие-либо данные на сервер, то оно станет издателем, а устройство читающее эти данные — подписчиком. С этим, надеюсь, все понятно
Брокер Eclipse Mosquitto
Eclipse Mosquitto — это брокер MQTT с открытым исходным кодом, который отличается малым весом и подходит для использования на устройствах Интернета вещей для связи. Протокол MQTT обеспечивает упрощенный способ передачи информации с использованием модели публикации / подписки. Если вы хотите узнать больше об этой теме, вы можете посетить официальный веб-сайт mosquito.
Настройка брокера Eclipse Mosquitto:
Чтобы установить связь с брокером, нам нужно сначала настроить его. В этом проекте приложение для Android используется для публикации и подписки на информацию с помощью брокера. Следующие шаги дадут вам лучшее представление о процессе настройки.
Шаг 1:
Сначала загрузите любой mqtt клиент доступный в Google Play Store / App Store, и установите его. В этом проекте используется приложение с именем “MQTT client”, внешний вид которого представлен ниже.

Шаг 2:
Нажмите на знак “+”, чтобы просмотреть список дополнительных опций в приложении, где мы собираемся добавить нового брокера. При нажатии на кнопку появляется новый экран, как показано ниже.

Шаг 3:
После этого в обязательном поле необходимо заполнить данные о брокере. Сначала нажмите на переключатель “Enabled". В этом проекте используется брокер Eclipse MQTT. Параметры, которые необходимо заполнить, приведены ниже:
Nick Name: укажите имя, которое вы предпочитаете
Host: mqtt.eclipse.org
Port: 1883
Client ID: укажите любой идентификатор, какой захотите
Вышеуказанные данные должны быть заполнены в соответствующих полях. Все остальные поля не являются обязательными и могут быть оставлены пустыми. После успешного завершения нажмите кнопку Сохранить, чтобы сохранить данные брокера.

После завершения процесс настройки приложения Android завершен, и теперь мы можем перейти к аппаратной части.
Пример использования
Далее мы подробно разберем как использовать полученные знания
Необходимые компоненты
Полный список необходимых деталей описан ниже. .
- NodeMCU
- Светодиод
- Макетная плата
- Провода для подключения
- Кабель для программирования
Принципиальная схема
Принципиальная схема для примера приведена ниже:

Загрузка скетча в ESP8266 для установления связи с брокером
Простой скетч обеспечивает все необходимые коммуникации между брокером MQTT и ESP8266. В этом разделе мы подробно рассмотрим, как работает это работает.
Настройка Arduino IDE и загрузка скетча
Если вы загружаете код в NodeMCU в первый раз, вам необходимо сначала настроить Arduino IDE. Чтобы сделать это, просто следуйте простой инструкции, приведенной ниже.
Сначала откройте Arduino IDE, затем перейдите в меню Файл–> Настройки.
Затем скопируйте приведенный ниже URL-адрес и вставьте его в поле "Дополнительные ссылки для Менеджера плат" и нажмите "Ок".

Затем перейдите в меню Инструменты> Плата> Менеджер плат. В окне менеджера введите ESP8266 в поле поиска и нажмите enter. Затем выберите последнюю версию из выпадающего списка и нажмите "Установить".

Наконец, после завершения установки перейдите в меню Инструменты -> Плата -> и выберите NodeMCU 1.0 (модуль ESP-12E). Теперь вы можете программировать NodeMCU с помощью Arduino IDE.
Код программы
Поскольку мы завершили настройку Arduino IDE, теперь мы можем загрузить скетч в NodeMCU. Но сначала давайте разберемся как всё это работает
Во-первых, подключаем библиотеки “ESP8266WiFi.h” для использования ESP8266 и “PubSubClient.h” для MQTT.
Библиотеку ESP8266WiFi мы автоматически скачали на предыдущем шаге, а PubSubClient необходимо загрузить из репозитория GitHub.
Затем определите сетевые учетные данные, такие как ваше имя пользователя и пароль Wi-Fi. Замените учетные данные “admin” и “12345678” на свои.
Затем создаются экземпляры для классов WiFiClient и PubSubClient, которые будут использоваться во всей программе.
В разделе setup() мы сначала вызываем WiFi.begin() , вызов этого метода приведет к подключению ESP к вашей точке доступа.
Далее мы проверяем сетевое подключение с помощью метода WiFi.status(). После успешного подключения на последовательный монитор выводится сообщение с SSID подключенной сети.
Теперь нам нужно указать адрес брокера. Для этого мы использовали метод setServer; этот метод принимает два аргумента, которые мы предопределили ранее. Теперь, если мы хотим получать сообщения с сервера, нам нужно создать функцию обратного вызова. Для этого мы используем метод setCallback (обратного вызова) .
Для подключения используется функция connect (ClientID) . Здесь ClientID — это имя клиента, и оно должно быть уникальным. Если он подключен, на последовательном мониторе может отображаться сообщение об успешном завершении.
Далее вызывается client.subscribe() , встроенную функцию MQTT, которая используется для подписки на определенную тему. В даном примере используется “esp / test” в качестве имени темы для подписки.
Теперь вызывается функция MQTTcallback, чтобы проверить, доступна ли какая-либо обновленная информация или нет. Если доступны новые данные, эта функция обрабатывает полученные данные и печатает сообщение в мониторе последовательного порта с исходным сообщением и названием темы, в которой получено сообщение.
Затем преобразовывается сообщение в строку, чтобы ее можно было сравнить и проверить на наличие каких-либо действий. В этом примере светодиод включается / выключается с помощью команд MQTT, как показано в приведенном ниже коде.
Наконец, публикуется информация в теме. Используется функция client.publish(). В этом примере проверяется статус кнопки, если кнопка нажата, то публикуется сообщение в теме “esp / test1”, как показано ниже.
Полный код программы представлен ниже
Тестирование программы

Для окончательного тестирования мы собираемся использовать приложение для Android, которое настроили ранее.
Откройте клиентское приложение MQTT и убедитесь, что ваш мобильный телефон имеет активное подключение к Интернету. Кроме того, точка доступа, к которой подключен NodeMCU, должна иметь активное подключение к Интернету. Как только все будет подключено, мы собираемся отправить строку “Hello from ESP8266” из модуля ESP, которая появится в приложении Android, и мы получим уведомление. Далее отправим строку из приложения для Android, которая включит светодиод, подключенный к плате ESP8266.
Шаг 1: (Подписка на тему):
Нажмите на сохраненный MQTT в приложении, который мы настроили ранее. Появится всплывающее окно, на котором будет предложено “Подписаться на тему”.Ранее мы настроили тему как “esp / test1”. Итак, в приложении для Android мы напишем “esp / test1”. Нажмите “Подписаться”, при этом появится экран, подобный приведенному ниже, где будет написано "Сообщение не получено" из конкретной темы.

Теперь нажмите кнопку "Connected", которая подключена к NodeMCU. Теперь, согласно нашему коду, в теме будет опубликовано сообщение “Hello from ESP8266”, и на экране появится уведомление с полученным сообщением, как показано ниже.

Шаг 2: Публикация в теме:
Теперь, чтобы опубликовать в теме, нажмите на кнопку приложения со СТРЕЛКОЙ ВВЕРХ, и откроется экран, как показано ниже.

Теперь в поле Темы напишите “esp / test”, а в поле сообщения напишите “on” или “off”, чтобы включить и выключить светодиод соответственно. Например, если в теме опубликовано значение “on”, то светодиод будет включен, а если в теме опубликовано значение "off", то светодиод будет выключен.
Невозможно передать данные между двумя ESP8266
мой сервер запускается правильно, и клиент подключается к серверу, но когда я отправляю данные с клиента на сервер, я ничего не получил. Я google о передаче данных между клиентом и сервером, но ничего не происходит для передачи данных клиента с использованием кодирования Arduino.
Вот мой код в Arduino
код на стороне сервера
код на стороне клиента
может ли кто-нибудь предложить мне, как передавать данные с клиента на сервер
Esp 12e как передавать данные между модулями
Для универсального пульта, над проектом которым я работал, не хватало ретранслятора IR кодов. Сигналы WiFI пробивают стены, а вот с инфракрасными лучами сложнее — только прямая видимость или, в крайнем случае, отраженный сигнал. Поскольку такая задача может иметь и самостоятельное значение, то я буду описывать ее как отдельный, самостоятельный проект.

| Hardware/железо | Software/программы | Описание |
| ESP8266 12E ведущий |
#include ESP8266WiFi.h #include ESP8266mDNS.h #include pgmspace.h //PROGMEM |
/> |
| IR приемник | #include IRremoteESP8266.h | GPIO2 (pin D4) |
| второй комплект | ||
| ESP8266 12E ведомый |
#include ESP8266WiFi.h #include ESP8266mDNS.h #include pgmspace.h //PROGMEM |
/> |
| IR излучатель | #include IRremoteESP8266.h | GPIO15 (pin D8) |
В программе ведущего модуля (ESP_reciver_trans.ino) измените подключение излучателя, например, также на GPIO15 (pin D8), как и у ведомого модуля. Эта инициализация у меня осталась от универсального пульта, где был дефицит со свободными ножками. Когда излучатель подключен к GPIO0, то это мешает запуску модуля после его прошивки — приходится все время переключаться.
Сам проект, по сути, простой и понятный, но я столкнулся с некоторыми проблемами, о решении которых и пойдет речь.
Первая и непонятная проблема связана с raw массивами. При повторном декодировании IR сигнала программа сбрасывалась и перезапускалась. Пришлось ввести промежуточную временную переменную temp_int_array[76]
Формирование IR массива
String temp_str = "";
unsigned int temp_int_array[76];
//подпрограмма формирования последовательности импульсов и передачи на излучатель
//cod_len — длина массива, вычисляется при декодировании IR сигнала
void send_ircod() < //max_len — запиши значение, чтобы не было ошибки компиляции
for (int i = 0; i temp_int_array[i] = irSignal[i] * USECPERTICK;//в оригинале: USECPERTICK — MARK_EXCESS;
//формирование строки для wifi
temp_str += String(irSignal[i]);
temp_str += ‘;’;
>
//Serial.println( temp_str); //test
irsend.sendRaw( temp_int_array , cod_len, 38);
>
В конечном итоге получилось так
Формирование IR массива
В программе (смотри скетч) под комментариями есть предложения разработчиков библиотеки по коррекции значений массива, четных и нечетных импульсов. Для информации я их оставил, но сам не использовал.
Следующая проблема вскрылась при опробовании излучателя на основном модуле. Проблема связана, скорее всего, с IR библиотекой. Считывание raw массива необходимо производить с индекса = 1, а на излучатель библиотека считывает массив с нулевого индекса (в предыдущем примере for (int i = 0; i .
Далее, я обратил внимание, что посылая на декодер одну и ту же команду, импульсы на излучателе становились с каждым разом длиннее. Пришлось включить осциллограф и убедиться в этом. Оказалось, что, несмотря на фиксированный, заданный в программе, размер массива, запись в цикле увеличивает этот массив, как бы смещая указатель массива. Пришлось обойти эту проблему, предварительно обнуляя массив irSignal[i]
Получение кодов IR массива
Может я решил эту задачу не самым оптимальным способом, но на данном этапе такой способ мне понятнее — это передача строковой переменной. Для этого значения последовательности импульсов записаны в строку, разделенные точкой с запятой (;). Строка для передачи выглядит примерно так:
Добавив служебные метки, информацию о последовательности (длина кодовой последовательности, частота) пересылаем на IP адрес другого (ведомого) модуля:
Ведомый модуль, получив такое сообщение, выделяет последовательность и преобразует ее в массив чисел для излучателя.
Получение кодов IR массива
//обнуление массива
for (int i = 0; i 76; i++) temp_int_array[i] = (char)0;
//=================
int count_arr = 0;
ind1 = priem.indexOf(‘;’); //обязательно перед циклом
while (ind1 = 0) <
temp_str = priem.substring(0, ind1); //записали цифровое значение импульса)
priem.remove(0, ind1 + 1); //удалили считанную часть
temp_int = temp_str.toInt();
temp_int_array[count_arr] = (unsigned int)temp_int;
// (unsigned int)temp_str.toInt;
count_arr += 1;
ind1 = priem.indexOf(‘;’);
>
//посылаем массив на излучатель паетом из трех посылок
for (int i = 0; i 2; i++) <
irsend.sendRaw( temp_int_array , cod_len, cod_khz );
delay(47);//47-пауза между кодовыми посылками (samsung)
>

При отладке IR канала я обнаружил, что наименьшее расхождение с несущей частотой (38 КГц) получается при cod_khz=43. На осциллограмме показана разница частот. Кроме того, у Sony импульсы не меандр. Это тоже можно регулировать, но уже в библиотеке: IRremoteESP8266.cpp
В основном модуле я жестко задал значение коэффициента несущей частоты cod_khz=43. Других частот, на других пультах, у меня не было.

Теперь о формировании самих кодовых импульсов. Здесь тоже пришлось подгонять. На рисунке, сверху вниз: реальный код с пульта SONY, подогнанный код с указанными коэффициентами и красным цветом полученный через библиотеку код без коррекции. Видно, что код без коррекции несколько растянут.
Формирование кодовых импульсов происходит в основном модуле. Есть три варианта, можете выбрать любой:
for (int i = 0; i // irSignal[i] = int_temp * USECPERTICK + MARK_EXCESS; //вариант разработчиков библиотеки
// irSignal[i] = int_temp * USECPERTICK + MARK_EXCESS /2 ; //максимально близкий к оригиналу
irSignal[i] = int_temp * USECPERTICK; //оптимальный
> else < //нечетные, Space
// irSignal[i] = int_temp * USECPERTICK — MARK_EXCESS; //вариант разработчиков библиотеки
// irSignal[i] = int_temp * USECPERTICK — 150; //максимально близкий к оригиналу
irSignal[i] = int_temp * USECPERTICK — 45 ; //оптимальный — подогнал по осциллографу
>
>
temp_str += String(irSignal[i]) + ‘;’;
>
Когда я начал практически использовать пульт, то оказалось, что одной посылки кода недостаточно, необходимо передавать пакет из двух-трех посылок. После того, как я это реализовал, все заработало отлично!

В программе пульту ретранслятора присвоен статический IP адрес 192.168.0.166. На пульте есть общий выключатель ретранслятора и четыре строки с IP адресами WiFi модулей с излучателями IR сигналов.
На каждой панели с IP адресом имеются две кнопки: слева — выбор для изменения в окне редакции, справа — разрешение на ретрансляцию.
Запись каждой панели можно изменить и передать в память модуля: переменные ex_TD[1] — ex_TD[4]. Также в памяти модуля хранятся состояния флажков панелей: переменные cb_TD[1] — cb_TD[4]. Состояние общего выключателя фиксируется в переменной cb_TD[0]. Далее, по желанию можно их запомнить, используя EEPROM или SD card. Главное, что все эти данные доступны и могут быть использованы, в зависимости от конфигурации оборудования.
Можно опросить состояние заявленных модулей разово — кнопка слева на панеле опроса, или автоматически через заданный промежуток времени. Поскольку на определение возможности соединения с заявленными модулями необходимо время, то информация о доступных модулях на пульте отобразится только при следующем опросе. То есть при первом запросе информация собирается, а передается в браузер только при следующем опросе и готовится новая информация о состоянии.
Не увлекайтесь установкой автоматического опроса, чтобы не увеличивать время реакции модуля на ваши действия.
И последнее, чтобы ретранслятор работал для модуля 192.168.0.130 без загрузки страницы в браузер, следует в программе установить: boolean cb_TD[5] = <1, 1, 0, 0, 0>; //[0] — это выключатель
В составе универсального пульта данные для ретранслятора могут иметь два различных источника:
— "живой сигнал", поступающий непосредственно от IR приемника и декодируемый библиотекой;
— сигнал, записанный на SD карту для какого-либо IR пульта.
В каждом из этих случаев сигнал в виде преобразованной raw последовательности может ретранслироваться на другие ESP модули только при разрешенных условиях, которые предварительно выставляются на пульте "transponder".
В режиме сканирования IR команд и записи их на SD карту, ретрансляция IR команд запрещена.
Желая сохранить установки пульта в памяти или на SD карте, я столкнулся с проблемой кодирования строковых переменных при передачи Get запросов от браузера после нажатия на кнопкку "ЗАПИСАТЬ".
Если передать " проба", то в ESP8266 получим вот такую последовательность "%20%D0%BF%D1%80%D0%BE%D0%B1%D0%B0" . Если попытаться ее записать обратно, то она так и будет выглядеть в искаженном виде. Немного подергавшись, в том числе и в Инете, я написал декодер под Win1251. Но это меня не устроило, так как требовалась кодировка utf-8. Чтобы текстовые файлы с SD карты правильно отображались в браузере, файлы должны быть в utf-8 кодировке. Пришлось еще немного повозиться написать функции String decode_(String mm) и int decode_int(char ch2, char ch2).
String decode_(String mm) <
String result_win = "";
String result = "";
char inChar;
mm.replace("%20", " "); //декодировать все пробелы
for (int i = 0; i mm.length(); i++) <
inChar = mm[i];
if (inChar == ‘%’) <
ind2 = decode_int(char(mm[i + 1]), char(mm[i + 2]));
//Serial.print(":ind2:" );
//Serial.println(ind2);
if (ind2 == 208) < //вылавливаем русский код
result += char(ind2); //utf-8 — первый байт
ind2 = decode_int(char(mm[i + 4]), char(mm[i + 5])); //чтение второго байта после %
result += char(ind2); //utf-8 -второй байт
//ind2 = decode_int(char(mm[i + 4]), char(mm[i + 5])) + 48;
ind2 += 48; //win-1251
i += 3; //прошли еще три символа
> else <
if (ind2 == 209) < //вылавливаем русский код, начиная с р
result += char(ind2); //utf-8 — первый байт
ind2 = decode_int(char(mm[i + 4]), char(mm[i + 5])); //чтение второго байта после %
result += char(ind2); //utf-8 -второй байт + 112
ind2 += 112; //win-1251
i += 3; //прошли еще три символа
>
>
result_win += char(ind2); //преобразовали в Win1251
i += 2; //прочли группу с первыми двумя символами
> else < //все остальные, кроме русских, символы
result += inChar;
result_win += inChar; //преобразовали в Win1251
>
>
return result; //строка в кодировке utf-8
//result_win — строка в кодировке Win1251
>
int decode_int(char ch2, char ch2) <
//123%D0%B6%D0%96zZ == 123жЖzZ
//сюда попадает только пара символов после % int result;
if (ch2> 57) < //D from D0
result = (ch2 — 55) * 16;
> else <
result = (ch2 — 48) * 16;
>
if (ch2> 57) <
result = result + (ch2 — 55);
> else < //0 from D0
result = result + (ch2 — 48);
>
return result;
>
С помощью чего можно реализовать прямую передачу данных с одного WIFI модуля ESP на другой?
Всем привет. Необходимо напрямую общаться между двумя модулями ESP12 без роутера, на одном из модулей висит датчик. Данные с этого датчика необходимо принимать другим ESP модулем и выводить в серийный порт. Получилось сделать это на TKDClient, но скорость передачи очень низкая, если ставлю delay<1000, то вообще ничего не приходит. Наслышан что существуют протоколы Socket, TCP/IP, UDP. Как их можно реализовать? Писал в Arduino IDE!
Как наладить коммуникацию между двумя ESP8266 [1]
Эта статья рассказывает, как настроить коммуникацию между двумя модулями ESP8266.
Как это работает
Первый ESP8266 будет настроен как точка доступа (сервер), а второй – как станция (клиент). Между ними будет установлено беспроводное соединение, и клиент будет отправлять серверу сообщение «Hello, World!»

Перед тем, как продолжить, пройдите вот эти руководства:
Прошивку NodeMCU нужно загрузить на оба ESP8266.
Необходимые компоненты
- Два модуля ESP8266
- Один программатор FTDI

Справочная информация
Основы программирования на Lua
Это скриптовый язык программирования, написанный на C. Разработка этого проекта началась в 1993 году силами Роберту Иерузалимски, Луиша Энрике де Фигейреду и Валдемара Келе, работавшими тогда в подразделении Tecgraf при Католическом университете Рио-де-Жанейро.
Более подробно об этом языке программирования можно почитать в «Википедии».
Прошивка NodeMCU для ESP8266 основана на Lua, поэтому если вы хотите писать собственные скрипты для ESP8266, вам важно знать основы этого языка.
Переменные
Переменные в языке Lua не делятся по типу данных, но делятся по области видимости. Это значит, что переменные в Lua могут быть глобальными или локальными.
- Глобальные переменные. Все переменные по умолчанию считаются глобальными (если в коде специально не задано, что они локальные).
- Локальные переменные. Если переменная задана локальной, область ее видимости будет ограничена лишь ее функцией.
- Поля таблиц. Это особый тип переменных, в которых может храниться все, за исключением «nil» (мы это затрагивать не будем).
Lua – это язык, чувствительный к регистру. Поэтому переменная «PIN» – это не то же самое, что «Pin» или «pin».
Типы данных (типы значений)
Lua – это язык с динамической типизацией, поэтому у переменных нет типов данных. Типы данных есть только у значений. Значения могут храниться в переменных, передаваться в виде параметров и возвращаться в виде результатов.
В таблице ниже показаны типы данных для значений в языке Lua.
| Тип значения | Описание |
|---|---|
| Строка (string) | Массив символов |
| Число (number) | Действительное (двойной точности с плавающей запятой) число |
| Булево значение (boolean) | Значение «true» или «false». Как правило, используется для проверки выполнения условий |
| Функция (function) | Функция, написанная на Lua |
| Неопределенное значение (nil) | В такой переменной не хранится никаких данных |
| Таблица (table), пользовательские данные (userdata) и поток (thread) | Эти три типа данных мы затрагивать не будем |
Вот примеры некоторых из этих типов значений:
Работая с ESP8266 и прошивкой NodeMCU, вы изредка будете встречать тип данных «nil». Это будет значить лишь, что такая переменная не определена. Также, если вы хотите удалить какое-то значение в какой-то переменной, просто присвойте ей значение «nil».
Комментарии
Комментарии – это просто текст, в котором программист объясняет, как работает его код. Если какой-то фрагмент кода помечен как комментарий, то ESP-модуль проигнорирует его и не будет обрабатывать. Комментарии начинаются с двух тире («—»). Вот два типа комментариев:
- Однострочные комментарии:
- Многострочные комментарии:
Операторы
Оператор – это символ, который говорит интерпретатору выполнить определенное математическое или логическое действие. В язык Lua встроено много операторов разных типов:
- Арифметические операторы;
- Операторы сравнения;
- Логические операторы;
- Прочие операторы;
Читая таблицы и примеры ниже, представьте, что имеете дело с двумя переменными: «А», в которой хранится значение «1», и «B», в которой хранится значение «2».
Арифметические операторы
| Оператор | Пример | Результат |
|---|---|---|
| + | A + B | 3 |
| — | A — B | -1 |
| * | A * B | 2 |
| / | B / A | 2 |
| % | B % A | 0 |
| ^ | B^2 | 4 |
| — | -A | -1 |
Операторы сравнения
Логические операторы
| Оператор | Пример | Результат |
|---|---|---|
| and (и) | (A and B) | false |
| or (или) | (A or B) | true |
| not (не) | !(A and B) | true |
Оператор конкатенации
Теперь представьте, что у нас две новые переменные:
| Оператор | Пример | Результат |
|---|---|---|
| .. | a..b | «Hello World!» |
Циклы
Цикл позволяет выполнить блок кода несколько раз, пока выполняется заданное условие. Во фрагменте кода ниже – пока значением в переменной «boolean_value» является «true».
Операторы if… else
Операторы if. else (т.е. «если. иначе») – один из самых важных инструментов для управления программой. Они используются следующим образом:
Названия этих операторов говорят сами за себя. Если выполнено условие «boolean_value=true», то программа выполнит код, идущий после «if». Но если условием является «boolean_value=false», то программа выполнит код, идущий после «else».
Функции
Функции – отличный способ организации кода. Если вы хотите сделать в программе что-либо несколько раз, вам необязательно по несколько раз прописывать этот код. Можно просто создать отдельную функцию, содержащую этот код, а затем вызывать ее, когда вам нужно.
Ниже показано, как создать новую функцию, принимающую один параметр (температуру в градусах Кельвина) и преобразующую это значение в градусы Цельсия и Фаренгейта.
Схема подключения 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). Этот сервер устанавливает соединение, потом начинает его прослушивать и, если получает сообщение, то печатает его в мониторе порта.
Загрузка скрипта на 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!»
Загрузите этот скрипт на клиентский ESP, следуя тем же указаниям, что и в подразделе «Загрузка скрипта на ESP8266» (см. выше).
Демонстрация
Итак, если все настроено правильно, клиент должен по беспроводной связи подключиться к серверу и передать ему сообщение «Hello, World!» В результате коммуникация будет выглядеть следующим образом:
