Wemos d1 r2 на esp8266 обзор и примеры

Шаг 6. Загрузите скетч в Arduino.

Скетч загружается в Arduino обычным способом. Однако из за того что модуль ESP8266 подключен к контактам 0 и 1, программирование становится невозможным. Компилятор будет показывать ошибку.

Перед программированием отсоедините провода идущие к ESP8266 от контактов 0 и 1. Произведите программирование. Затем верните контакты на место. Нажмите кнопку сброса Arduino.

Примечание: Первый признак того, что программирование прошло успешно, это мерцание синего светодиода на модуле ESP8266 в течении полсекунды сразу после сброса. Мерцание синего светодиода означает обмен данными между Arduino и ESP8266. В эти полсекунды Arduino производит настройку ESP8266 для работы в качестве точки доступа.

ESPlorer, init.lua — пишем первый скрипт

Для написания и заливки скриптов будем использовать программу ESPlorer. Это кроссплатформенная программа написана на Java и так же не требует установки. Работает одинаково как под Windows так и под Ubuntu.

ESPlorer качаем здесь: http://esp8266.ru/esplorer-latest/?f=ESPlorer.zip
Распаковываем архив.

Под Windows запускаем файл ESPlorer.bat

Под Ubuntu:

Примечание: далее описанна робота с ESPlorer v0.1. Внешний вид новых версий может иметь не принципиальные отличия.

Указываем порт и скорость 9600:

И нажимаем «Open». Увидем следующще

У ESPlorer обнаружилась паршивая особенность. Он не всегда четко подключается к NodeMCU. Если попробовать послать любую команду (кнопкой Send) в консоли пролетает мусор вместо нормального ответа. Иногда после нескольких повторов все налаживается. Если Вас это беспокоит, попробуйте изменить скорость подключения на 115200.

Приступим к созданию первого скрипта на языке Lua. Скрипт с именем init.lua стартует автоматически после запуска NodeMCU. Создадим файл init.lua.
напечатаем всего одну строчку:

Сохраняем файл как init.lua. После сохранения файл выполниться и мы должны увидеть работу первого скрипта.

По умолчанию файл сохраняется и на диск компьютера и заливается на ESP8266.

Теперь о самой большой неприятности, которая есть у NodeMCU. При некоторых критических ошибках (это случается не так часто, но если случается, то запоминается на долго) NodeMCU может перезагружаться. И самое страшное, что может случиться — это циклическая перезагрузка. Это случается если допустить критическую ошибку в скрипте который стартует автоматически. NodeMCU стартует, выполняет «глючный» скрипт, нарывается на критическую ошибку и уходит в перезагрузку. И так до бесконечности.

Для того, чтобы обезопасить себя на этапе изучения NodeMCU, я использую описанный ниже прием. В стартовом скрипте init.lua запускаем таймер, который сработает только один раз и через указанное время (в данном случае через 5 секунд) выполнит процедуру запуска другого скрипта (в данном случае main.lua). Больше ничего в скрипте init.lua не делаем. Все операции выполняются в скрипте main.lua. Таким образом, если мы допустим ошибку в скрипте main.lua, и NodeMCU уйдет в циклическую перезагрузку, после перезагрузки у нас будет 5 секунд для того чтобы удалить или исправить «глючный» скрипт.

Текст init.lua:

Кроме того, такой подход позволяет легко включать в автозагрузку любо нужный скрипт, достаточно в файле init.lua вместо main.lua указать имя другого скрипта. Это очень удобно, когда вы на одной плате тестируете несколько проектов или несколько версий скрипта.

Бизнес-логика в коде приложения

В первой части статьи я уже описывал бизнес-логику приложения. Напомню, что под бизнес-логикой я понимаю обработку событий с периферии и с облака. При обработке происходит или управление периферией, или передача атрибутов Capability в облако. 

Считывание показаний температуры с датчика

В отличие от примера для ESP8266, в этом примере добавляются события от настоящего датчика. Это взаимодействие организовано в виде передачи сообщений через очередь (FreeRTOS Queue) между двумя тасками/потоками: основным таском с управлением и мониторингом остальной периферии и таском, считывающим данные с датчика температуры. В основном таске создаётся очередь temperature_events_q, а также запускается таск, считывающий температуру.

В основном таске внутри бесконечного цикла на каждой итерации происходит попытка получить значение температуры из очереди и записать в переменную temperature_value. Если значение переменной temperature_value поменялось, то новое значение температуры отправляется в облако и отображается в UI приложения:

Подробнее о работе с тасками и очередями вы можете прочитать в 3 и 4 главе книги «Mastering the FreeRTOS Real Time Kernel», рекомендуемой на странице с ресурсами в документации FreeRTOS.

Светодиодная индикация

Помимо нового источника событий в коде бизнес-логики меняется управление RGB светодиодом при установке значения температуры подогрева “чайника” в коллбэке Thermostat Heating Setpoint Capability, а также в начале и завершении процесса подогрева. 

Что такое язык Lua?

Lua — это интерпретируемый язык, который, как и большинство современных интерпретируемых языков, может хранить скомпилированные версии скриптов. Это позволяет увеличить скорость работы. Lua позиционируется как мультипарадигмовый. Он не сложный, и если Вы уже программировали на любом языке, то Lua Вы изучите очень быстро. Если Вы только начинаете программировать, тогда Lua удивит Вас своей доступностью для начинающих.

Есть некоторые особенности при работе с Lua на NodeMCU. В основном это связано с конечным объемом памяти микроконтроллера ESP8266. Нужно придерживаться простых правил и выдерживать стиль работы с Lua. Об этих правилах расскажу чуть позже. Если же сохранять такой же стиль, как и при написании программ на С, то у Вас не получиться ощутить всей мощи Lua и прошивки NodeMCU. Когда Вы начинаете писать на Lua, это увлекает, и Вы начинаете воплощать в жизнь все более объемные задачи. Вы теряете ощущение того, что вы работаете с микроконтроллером и невольно нагружаете задачами, которые не по плечу микроконтроллеру. Нужно помнить, что у ESP8266 ограниченные ресурсы и не следует его грузить задачами, которые под силу выполнить микрокомпьютерам или полноценным компьютерам.

Документация по LUA на русском языке: http://www.lua.ru/doc/

Изучаем LUA за 15 минут: http://tylerneylon.com/a/learn-lua/

Диагностика

Библиотека ESP8266 поддерживает несколько способов для диагностики и решения проблем, связанных с подключением к WiFi и поддержания WiFi-подключения.

Значения, возвращаемые функциями

Почти каждая функция библиотеки ESP8266WiFi возвращает определенную диагностическую информацию.

Это могут быть, например, простые булевы данные (true или false), сообщающие о том, была ли задача выполнена успешно или нет. Эта проверка может выглядеть следующим образом:

Serial.printf("Wi-Fi mode set to WIFI_STA %s\n", WiFi.mode(WIFI_STA) ? ""  "Failed!");

Некоторые функции умеют возвращать более подробную диагностическую информацию. Хороший пример – функция WiFi.status().

Serial.printf("Connection status: %d\n", WiFi.status());

Эта функция не ограничивается булевыми значениями. В общей сложности она может вернуть пять разных значений, описывающих статус WiFi-соединения:

  • : WL_IDLE_STATUS – когда WiFi в процессе между сменой статусов
  • 1: WL_NO_SSID_AVAIL – когда заданный SSID находится вне зоны доступа
  • 3: WL_CONNECTED – после успешного подключения
  • 4: WL_CONNECT_FAILED – когда задан неправильный пароль
  • 6: WL_DISCONNECTED – когда ESP8266 не настроен на режим станции

Рекомендуем почаще показывать и проверять данные, возвращаемые функциями. Это значительно облегчает разработку проектов и решение проблем.

Использование функции printDiag()

В библиотеке ESP8266WiFi есть одна функция, печатающая основную диагностическую информацию о состоянии WiFi-подключения. Выглядит она следующим образом:

WiFi.printDiag(Serial);

Результат, возвращаемый этой функцией, может выглядеть примерно так:

Mode: STA+AP
PHY mode: N
Channel: 11
AP id: 
Status: 5
Auto connect: 1
SSID (10): sensor-net
Passphrase (12): 123!$#&*esP
BSSID set: 

Используйте эту функцию для получения быстрого «снимка» о состояния WiFi-связи при работе над фрагментами кода, которые, на ваш взгляд, могут быть некорректными.

Включение WiFi-диагностики

По умолчанию, когда вы вызываете функцию Serial.begin(), вывод диагностической информации от WiFi-библиотек отключен. Чтобы включить его, вызовите функцию Serial.setDebugOutput(true). Чтобы перенаправить диагностическую информацию на Serial1, вызовите Serial1.setDebugOutput(true). Более подробно о диагностике через последовательные порты читайте тут.

Ниже – пример того, какую информацию будет выдавать скетч, о котором рассказывалось выше, в разделе «Быстрый старт», если вызвать в нем функцию Serial.setDebugOutput(true):

Connectingscandone
state:  -> 2 (b0)
state: 2 -> 3 ()
state: 3 -> 5 (10)
add 
aid 1
cnt

connected with sensor-net, channel 6
dhcp client start...
chg_B1:-40
...ip:192.168.1.10,mask:255.255.255.0,gw:192.168.1.9
.
Connected, IP address: 192.168.1.10

Тот же скетч без функции Serial.setDebugOutput(true) покажет лишь следующее:

Connecting....
Connected, IP address: 192.168.1.10

Установка приложения NODE.JS для генерации данных

Установим менеджер NVM, который позволяет быстро устанавливать и переключать версии NODEJS

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash

1 curl-o-https//raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash

(в команде выше указана последняя версия NVM на момент написания статьи — январь 2021 года, лучше сходить на и взять актуальную версию на момент установки)

Чтобы nvm заработал необходимо заново войти в терминал или выполнить команду 

source /home/ubuntu/.bashrc

1 sourcehomeubuntu.bashrc

Далее установим LTS версию NODEJS

nvm install —lts

Сборка макетной платы ESP8266

ESP8266 – недорогой SoC-чип со встроенным микроконтроллером и полным стеком протоколов TCP/IP, что означает, что он может напрямую обращаться к вашей Wi-Fi сети.

Поскольку у этого чипа есть свой микроконтроллер, вы можете поместить в него код своего приложения или можете использовать модуль просто как Wi-Fi приемопередатчик, что мы и собираемся сделать в данном проекте. Более эффективно было бы использовать этот модуль и как приемопередатчик, и как контроллер, но в целях обучения мы будем взаимодействовать с модулем, используя Arduino.

Чип ESP8266 поставляется в разных модулях. Мы будем использовать модуль ESP-01. Конечно, вы можете использовать любой другой модуль.

Во-первых, вы должны знать, что модуль работает с напряжением 3,3 В, и напряжение высокого логического уровня от Arduino должно быть таким же, чтобы не повредить наш модуль. Для этого требуется преобразователь уровня напряжения между платой Arduino (которая работает на 5 В) и модулем. Хорошей новостью является то, что в преобразователе будет нуждаться только вывод для передачи на Arduino, поскольку приемный вывод обычно распознает логические сигналы с напряжением 3,3 В от ESP8266.

Одним из простейших способов выполнения этого преобразования является схема от Sparkfun. Вы можете заказать готовый модуль.

Преобразователь уровня 5В → 3,3В

На рисунке ниже показана распиновка нашего модуля на ESP8266:

Распиновка Wi-Fi модуля ESP8266 (вид сверху, не в масштабе)

Вывод Назначение
UTXD Передача данных через UART
URXD Прием данных через UART. Выход, к которому он подключается, должен быть 3,3 В.
CH_PD Выключение: низкий уровень на входе выключает чип, высокий уровень на входе включает его; для нормальной работы модуля необходимо подтянуть его к линии питания.
GPIO0 При загрузке: должен быть высокий уровень, чтобы входить в нормальный режим загрузки; низкий уровень вводит в специальные режимы загрузки.
GPIO2 При загрузке: низкий уровень заставляет загрузчик войти в режим загрузки флеш-памяти; высокий уровень вызывает нормальный режим загрузки.
RST Сброс; активный уровень – низкий.
GND Земля.
VCC Питание/3,3В.

Я использовал LM317, настраиваемый линейный регулятор напряжения с выходным током до 1,5 А, для обеспечения модуля подходящим источником питания 3,3 В.

Примечание: Не используйте вывод 3,3 В от Arduino, так как стабилизатор напряжения 3,3 В на плате Arduino не может обеспечить необходимую для модуля величину тока, особенно при пиковом потреблении энергии во время передачи.

Принципиальная схема макетной платы ESP8266

Я использовал BS170 (вместо BSS138) для преобразователя логических уровней; оба работают хорошо.

Макетная плата ESP8266

Теперь вы можете подключить свой модуль к компьютеру, используя USB-TTL преобразователь, и испытать его.

Работа с RoboRemoFree

В Интернете можно найти массу программ под Android, которые помогают организовать интерфейс для такого рода задач, не прибегая к программированию. Я покажу, как это можно сделать с помощью RoboRemoFree.

Устанавливаем и запускаем RoboRemoFree

Создаем подключение к серверу. Желательно чтобы мобильный телефон/планшет был подключен к той-же WiFi сети, где находиться сервер. В данном случае наш ESP8266. Заходим в «Menu», выбираем пункт «connect»

Выбираем тип подключения «Internet (TCP)»

Указываем IP и порт

Далее в меню выбираем пункт «interface»

Выбираем интерфейс. Программа позволяет создавать несколько интерфейсов с разными органами управления.

Затем переходим в режим редактирования интерфейса

Нажимаем на свободном пространстве и выбираем, что мы хотим установить. Мы будем использовать кнопки. Выбираем «button»

После чего на интерфейс будет установлена кнопка. Ее можно перемещать и изменять ее размеры.

Чтобы изменить название на кнопке, нужно нажать не ней и выбрать пункт «Set text»

Затем укажем еще один параметр — «set press action». Зададим «1». При нажатии кнопки будет отправлена указанная строка по созданному нами подключению. Т.е. Наш ESP8266 получит символ «1» и включит светодиод.

Аналогично создадим кнопку «Off» и установим set press action «0».

Наш интерфейс готов. Выходим из режима редактирования, выполнив пункт меню «don`t edit ui».

Если подключение к серверу (ESP8266) было успешным, можно пользоваться. По нажатию кнопки «On» светодиод должен загореться, по нажатию кнопки «Off» светодиод должен погаснуть.

Library — Webserver

  • ESP8266WebServer: Add variadic template version of collectHeaders() ()
  • Fix header FSM in webserver, fix Windows uploads ()
  • ETag support for WebServer ()
  • Rewrite multipart boundary detection ()
  • Fixed bug in parsing POST file uploads ()
  • Fix long password validation in WebServer ()
  • FIX MIME-Type for txt-suffix ()
  • FIX StaticRequestHandler crashes when cache_header is null and DEBUG_ESP_CORE is enabled ()
  • Avoid #includes with a surrounding namespace ()
  • webserver hook: allow to handle external http protocol (, , )
  • Made ESP8266WebServer::client() return a reference (fixes ) ()
  • WebServer: Allow client to send many requests on the same connection ()
  • webserver: do not count «plain» in argument list ()
  • webserver: string optimization ()

Специальные функции чипа ESP8266

Чип ESP8266 поддерживает объект ESP, для которого несколько специальных функций, связанных со спящим режимом, часами реального времени (RTC) и flash-памятью.

  • Функция ESP.deepSleep(microseconds, mode) переключает чип ESP8266 в спящий режим. Для аргумента mode доступны значения WAKE_RF_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL и WAKE_RF_DISABLED. Чтобы вывести ESP8266 из спящего режима, контакт GPIO16 должен быть подключен к линии RST.
  • Функции ESP.rtcUserMemoryWrite(offset, &data, sizeof(data)) и ESP.rtcUserMemoryRead(offset, &data, sizeof(data)) позволяют записывать и считывать данные из пользовательской RTC-памяти ESP8266. Общий размер пользовательской RTC-памяти чипа составляет 512 байт, поэтому сумма значений в аргументах offset и sizeof(data) не должна превышать «512». Данные должны быть выровнены под 4 байта. Сохраненные данные могут быть считаны между циклами спящего режима. Впрочем, из-за включения/выключения ESP8266 данные могут быть утеряны.
  • Функция ESP.restart() перезапускает ESP8266.
  • Функция ESP.getResetReason() возвращает строку, описывающую причину последнего сброса (в удобочитаемом формате).
  • Функция ESP.getFreeHeap() возвращает размер свободной памяти.
  • Функция ESP.getChipId() возвращает ID чипа ESP8266 в виде целого 32-битного значения.
  • Функция ESP.getCoreVersion() возвращает строку с версией аддона.
  • Функция ESP.SdkVersion() возвращает версию SDK в виде данных типа char.
  • Функция ESP.CpuFreqMHz() возвращает частоту процессора в виде 8-битного беззнакового целочисленного значения (в МГц).
  • Функция ESP.getSketchSize() возвращает размер скетча, в данный момент загруженного на ESP8266, в виде 32-битного целочисленного значения.
  • Функция ESP.getFreeSketchSpace() возвращает свободное место для загрузки скетча в виде 32-битного целочисленного значения.
  • Функция ESP.getSketchMD5() возвращает строку (с символами в нижнем регистре), содержащую MD5-хэш скетча, в данный момент загруженного на ESP8266.
  • Функция ESP.getFlashChipId() возвращает ID флэш-памяти чипа в виде 32-битного целочисленного значения.
  • Функция ESP.getFlashChipSize() возвращает размер flash-памяти чипа (в байтах), каким его видит SDK (может быть меньше настоящего размера).
  • Функция ESP.getFlashChipRealSize() возвращает настоящий размер flash-памяти (в байтах), основанный на ID flash-памяти чипа.
  • Функция ESP.getFlashChipSpeed(void) возвращает частоту flash-памяти чипа (в Гц).
  • Функция ESP.getCycleCount() возвращает количество командных циклов процессора в момента запуска чипа. Возвращаемое значение имеет вид 32-битного беззнакового значения. Эта функция полезна для точной синхронизации очень коротких действий (вроде тех, что используются при использовании техники «bit-banging»).
  • Функцию ESP.getVcc() можно использовать для измерения питающего напряжения. Для использования этой функции необходимо, чтобы ESP при запуске нужным образом перенастроил АЦП. Для этого добавьте в верхнюю часть скетча строчку…
ADC_MODE(ADC_VCC);

В этом режиме контакт TOUT должен быть неподключенным.

Обратите внимание, что по умолчанию АЦП настроен на считывание данных с контакта TOUT при помощи функции analogRead(A0), а функция ESP.getVcc() недоступна.

Шаг 7. Подключитесь с мобильного приложения.

Установите мобильное приложение на ваш смартфон/планшет.

Примечание: В приложении для iOS перед подключением необходимо вручную подключить смартфон к точке доступа, используя системные настройки операционной системы. Приложение для Android умеет самостоятельно переключить систему на точку доступа устройства и вернуть предыдущую точку доступа после отключения.

В приложении нажмите кнопку нового подключения «+» в верхней панели. В открывшемся окне выберите подключение «WiFi точка доступа».

В приложении для iOS предварительно зайдите в системные настройки и подключитесь к точке доступа «RemoteXY» с паролем «12345678». Подключенная точка доступа должна отображаться в открывшемся окне. Нажмите кнопку «Connect».

В приложении для Android включите WiFi и нажмите кнопку обновления списка доступных точек доступа. Выберите точку доступа RemoteXY. В открывшемся окне введите пароль точки доступа «12345678», нажмите кнопку «Подключиться».

Скетч целиком

Полная версия скетча показана ниже:

 1 #include <ESP8266WiFi.h>
 2 #include <WiFiUdp.h>
 3 
 4 const char* ssid = "********";
 5 const char* password = "********";
 6 
 7 WiFiUDP Udp;
 8 unsigned int localUdpPort = 4210;  // локальный порт для прослушки 
 9 char incomingPacket255];          // буфер для входящих пакетов
10 char  replyPacekt[] = "Hi there! Got the message :-)";  // ответ
11                   //  "Привет! Сообщение получено :-)"
12 
13 void setup()
14 {
15   Serial.begin(115200);
16   Serial.println();
17 
18   Serial.printf("Connecting to %s ", ssid);
19             //  "Подключение к %s "
20   WiFi.begin(ssid, password);
21   while (WiFi.status() != WL_CONNECTED)
22   {
23     delay(500);
24     Serial.print(".");
25   }
26   Serial.println(" connected");
27              //  " подключено "
28 
29   Udp.begin(localUdpPort);
30   Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
31             //  "Теперь прослушиваем IP-адрес %s, UDP-порт %d"
32 }
33 
34 void loop()
35 {
36   int packetSize = Udp.parsePacket();
37   if (packetSize)
38   {
39     // получаем входящие UDP-пакеты:
40     Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
41               //  "Получено %d байт от %s, порт %d%"
42     int len = Udp.read(incomingPacket, 255);
43     if (len > )
44     {
45       incomingPacketlen = ;
46     }
47     Serial.printf("UDP packet contents: %s\n", incomingPacket);
48               //  "Содержимое UDP-пакета: %s"
49 
50     // отправляем ответ на IP-адрес и порт, с которых пришел пакет: 
51     Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
52     Udp.write(replyPacekt);
53     Udp.endPacket();
54   }
55 }

Скетч

Для того, чтобы настроить ESP8266 в режим программной точки доступа, нужно всего несколько строчек кода.

 1 #include <ESP8266WiFi.h>
 2 
 3 void setup()
 4 {
 5   Serial.begin(115200);
 6   Serial.println();
 7 
 8   Serial.print("Setting soft-AP ... ");
 9            //  "Настройка программной точки доступа ... "
10   boolean result = WiFi.softAP("ESPsoftAP_01", "pass-to-soft-AP");
11   if(result == true)
12   {
13     Serial.println("Ready");
14                //  "Готово"
15   }
16   else
17   {
18     Serial.println("Failed!");
19                //  "Настроить точку доступа не удалось"
20   }
21 }
22 
23 void loop()
24 {
25   Serial.printf("Stations connected = %d\n", 
26 WiFi.softAPgetStationNum());
27             //  "Количество подключенных станций = "
28   delay(3000);
29 }

Step 5: Functions

Here are some functions that the WiFiManager offers us.

1. autoConnect

The autoConnect function is responsible for creating an Access Point. We can use it in three ways.

• autoConnect («network name», «password»); — creates a network with the defined name and password.

• autoConnect («network name»); — creates an open network with the defined name.

• autoConnect (); — creates an open and automatically named network with the name being ‘ESP’ + chipID.

2. startConfigPortal

The startConfigPortal function is responsible for creating an Access Point without attempting to connect to a previously saved network.

• startConfigPortal («network name», «password»); — creates a network with the defined name and password.

• startConfigPortal (); — creates an open and automatically named network with the name being ‘ESP’ + chipID.

3. getConfigPortalSSID

Returns the SSID of the portal (Access Point)

4. getSSID

This returns the SSID of the network to which it is connected.

5. getPassword

This returns the password of the network to which it is connected.

6. setDebugOutput

The setDebugOutput function is responsible for printing debug messages on the serial monitor. These messages are already defined in the library. As you go through the functions, the data will be printed.

By default, this function is set to TRUE. If you want to disable the messages, simply set the function to FALSE.

7. setMinimumSignalQuality

The setMinimumSignalQuality function is responsible for filtering networks based on signal quality. By default, WiFiManager will not show sign-on networks below 8%.

8. setRemoveDuplicateAPs

The setRemoveDuplicateAPs function is responsible for removing network duplicates.

By default it is set to TRUE.

9. setAPStaticIPConfig

The setAPStaticIPConfig function is responsible for setting the static address settings when in access point mode.

(IP, GATEWAY, SUBNET)

10. setSTAStaticIPConfig

The setSTAStaticIPConfig function is responsible for setting the static address settings when in station mode.

(IP, GATEWAY, SUBNET)

You must add the command before autoConnect!!!

11. setAPCallback

The setAPCallback function is responsible for informing you that AP mode has started.

The parameter is a function that must be created to indicate it as a callback;

12. setSaveConfigCallback

The setSaveConfigCallback function is responsible for informing you that a new configuration has been saved and the connection has been successfully completed.

The parameter is a function to create and indicates this as an allback.

You must add the command before autoConnect !!!

Скетч целиком

Ниже – полна версия скетча, включая фрагмент на тот случай, если соединение с сервером будет закрыто.

 1 #include <ESP8266WiFi.h>
 2 
 3 const char* ssid = "********";
 4 const char* password = "********";
 5 
 6 const char* host = "www.example.com";
 7 
 8 
 9 void setup()
10 {
11   Serial.begin(115200);
12   Serial.println();
13 
14   Serial.printf("Connecting to %s ", ssid);
15             //  "Подключение к "
16   WiFi.begin(ssid, password);
17   while (WiFi.status() != WL_CONNECTED)
18   {
19     delay(500);
20     Serial.print(".");
21   }
22   Serial.println(" connected");
23              //  " подключено"
24 
25 }
26 
27 
28 void loop()
29 {
30   WiFiClient client;
31 
32   Serial.printf("\n[Connecting to %s ... ", host);
33             //  "Подключение к "
34 
35   if (client.connect(host, 80))
36   {
37     Serial.println("connected]");
38                //  " подключено"
39 
40     Serial.println("");
41                //  "Отправка запроса"
42     client.print(String("GET /") + " HTTP/1.1\r\n" +
43                  "Host: " + host + "\r\n" +
44              //  "Хост: "
45                  "Connection: close\r\n" +
46              //  "Соединение: закрыто"
47                  "\r\n"
48                 );
49 
50     Serial.println("");
51                //  "Ответ:"
52     while (client.connected())
53     {
54       if (client.available())
55       {
56         String line = client.readStringUntil('\n');
57         Serial.println(line);
58       }
59     }
60     client.stop();
61     Serial.println("\n");
62                //  "Отключено"
63   }
64   else
65   {
66     Serial.println("connection failed!]");
67                //  "подключиться не удалось!"
68     client.stop();
69   }
70   delay(5000);
71 }

Режимы работы ESP8266

Одна из важнейших функций, которую обеспечивает ESP8266, заключается в том, что он может не только подключаться к существующей Wi-Fi сети и работать в качестве веб-сервера, но он также может устанавливать собственную сеть, позволяя другим устройствам подключаться непосредственно к нему и получать доступ к веб-страницам. Это возможно, потому что ESP8266 может работать в трех разных режимах: режим станции, режим точки доступа и оба первых режима одновременно. Это обеспечивает возможность построения ячеистых сетей.

Режим станции (STA)

ESP8266, который подключается к существующей сети W-iFi (созданной вашим беспроводным маршрутизатором), называется станцией (Station, STA).

Рисунок 2 – Демонстрация режима Station ESP8266 NodeMCU

В режиме STA ESP8266 получает IP адрес от беспроводного маршрутизатора, к которому подключен. С этим IP адресом он может настроить веб-сервер и выдавать веб-страницы на все подключенные к существующей Wi-Fi сети устройства.

Режим точки доступа (AP)

ESP8266, который создает свою собственную сеть Wi-Fi и действует как концентратор (точно так же как маршрутизатор Wi-Fi) для одной или нескольких станций, называется точкой доступа (Access Point, AP). В отличие от Wi-Fi роутера, он не имеет интерфейса к проводной сети. Такой режим работы называется Soft Access Point (soft-AP). Максимальное количество станций, которые могут к нему подключиться, ограничено пятью.

Рисунок 3 – Демонстрация режима Soft Access Point ESP8266 NodeMCU

В режиме AP ESP8266 создает новую сеть Wi-Fi и устанавливает для нее SSID (имя сети) и присваивает себе IP адрес. По запросу на этот IP адрес он может выдавать веб-страницы всем подключенным к этой сети устройствам.