Как создать точку доступа на ESP8266 за 5 минут. Управление по WI-FI
Сегодня мы научимся создавать точку доступа на ESP8266 и выводить на неё свою информацию. Это нам пригодится потом когда мы будем делать web интерфейс управления нашими умными и не очень устройствами.
Делать мы это будем не используя ваш домашний роутер. Создадим точку доступа на ESP и подключимся к ней. Затем выведем HTML страницу.
Сегодня будет 3 примера.
- Первый это мы просто просканируем все сети, что окружают вас.
- Второй – выведем две кнопки и по управляем встроенным в плату светодиодом.
- И третий. Выведем номер RFID карты используя скетч из предыдущих уроков.
Давайте рассмотрим пример сканирования WIFI сетей.
Мы будем использовать библиотеку ESP8266WIFI.
Здесь ничего сложного. Запускается встроенная функция сканирования сетей и в цикле выводятся все найденные сети и уровень их сигнала. Затем ждём 5 секунд и снова сканируем.
У меня этот модуль нашёл сего 7 сетей. А вот ноутбук видит гораздо больше. Это говорит о том, что ESP встроенная в NodeMCU имеет гораздо меньшую чувствительность. А что можно было ожидать от антенны нарисованной на плате. Поэтому я в основном использую модули ESP-07 с керамической антенной и разъёмом для подключения внешней антенны. И к тому же ESP не видит сети с частотой 4 ГГц, а только 2,4 ГГЦ.
Теперь давайте рассмотрим второй пример.
Это создание своей точки доступа и вывод двух кнопок на страницу для управления светодиодом. Точно так же можно управлять не только светодиодами, но и различными нагрузками, например реле.
Для этого нам понадобится подключить несколько библиотек. Но они все входят в комплект ARDUINO ide и становятся доступными после того как вы выберете плату ESP.
Здесь мы пишем название своей новой сети. Я назвал её вот так, вы же можете называть как угодно.
И задаём пароль. Если вы не укажете пароль, то у вас будет открытая сеть и каждый сможет к ней подключиться. Оно вам надо?
Это html код который будет выводиться на странице. Это простой код который выведет две ссылки с надписями включить и выключить. А выше их будет отображаться статус указывающий текущее состояние светодиода. Включен или Выключен.
Дальше идут строчки кода которые в основном отвечают за вывод в ComPort. Я по возможности всё написал по русски, и думаю вам не составит труда разобраться что и за что отвечает.
Переходим на созданную сеть. У вас при первом подключении будет выведено окно для ввода пароля. Проверяем, чтобы не было ошибок с паролем, а иначе вы не сможете войти в эту сеть.
Дальше будет вопрос подключать ли общий доступ к устройствам. Можете выбрать что угодно. Я ответил ДА.
Вот мы и подключились к созданной нами сети.
Вводим IP адрес вашего устройства. И вы ничего не должны увидеть. У меня это просто загрузился кэш страницы. Нажимая на кнопки никакого результата на плате я не вижу.
Теперь нужно войти на локальный адрес самой ESP. Он вот такой 192.168.4.1
Вот теперь это уже реальная страница, что можно увидеть нажимая на кнопки. Как видите на плате включается и выключается светодиод. И как я уже говорил, это может быть реле и управлять большой нагрузкой.
Теперь переходим на свою обычную WIFI сеть. Обновляем страницу и видим, что доступ к интерфейсу пропал.
Ну и наконец третий пример.
Выведем UID номер карты на экран компьютера. Для этого загрузим следующий скетч.
Здесь у нас ещё прибавилось библиотек. Одну из них вам придётся установить, так как она не входит в комплект. Если не знаете как, о посмотрите последние видео о RFID модуле. Там подробно всё рассказано.
Мы будем работать с той же сетью, что и в предыдущем примере.
В этом HTML коде мы будем выводить номер карты которую прикладывают с считывателю карт. Это код из предыдущего видео, поэтому здесь рассказывать нечего.
Если в двух словах, то когда вы прикладываете карту к считывателю, то скетч считывает номер карты и отправляет его для вывода на web страницу.
Давайте посмотрим как это работает. Вводим IP адрес устройства и ничего не получаем. Так как мы находимся в своей обычной, домашней сети. Теперь переходим в созданную сеть. Перезагружаем страницу и всё мы не подключены. В следующем видео я расскажу как сделать так чтобы можно было видеть страницу из обычной WIFI сети, а если домашняя сеть пропадёт, то вы автоматически переключитесь на свою созданную сеть.
Переходим на локальный IP и видим текст и ожидание ввода карточки. Подносим карты к картридеру и видим, что их номера отображаются на странице.
На этом я заканчиваю это видео. Сегодня мы рассмотрели как создать точку доступа, просканировать все доступные сети. Поуправляли светодиодом из интерфейса браузера. Получили UID номер карты.
Если вам понравилось это видео, то не забудьте поставить лайк. Если есть какие вопросы или пожелания, то пишите их в комментариях
И поздравляю вас с Наступающим новым годом.
До встречи в новых видео.
Arduino.ru
привет, народ, есть у кого-то пример кода для ESP32 or ESP8266, который создает точку доступа для выбора и подключения к wifi, а затем, подключившись к wifi запоминает пароль и используя это подключение создает web server?
- Войдите на сайт для отправки комментариев
Вс, 26/05/2019 — 22:39
Зарегистрирован: 23.05.2012
в гугле примеров тыщщщи, забанили ?
- Войдите на сайт для отправки комментариев
Пнд, 27/05/2019 — 00:05
Зарегистрирован: 11.11.2015
буду благодарен хотябы за один.
при поиске по запросу «arduino точка доступа для выбора и подключения к wi-fi» нихрена путнего не находит
- Войдите на сайт для отправки комментариев
Пнд, 27/05/2019 — 08:51
Зарегистрирован: 19.04.2019
Я так понимаю, что вам нужно:
а) Создать на базе ESP точку доступа с вебмордой.
б) Подключиться к вебморде и в ней выбрать WiFi-сеть для подключения (ввести пароль и все прочие настройки).
в) Переподключить ESP в режим клиента, подключенного к выбранной сети и запустить вебсервер.
Все эти вещи есть в стандартных примерах ESP. Вам нужно только собрать это все в кучу. Готовую программу вы вряд ли найдете.
- Войдите на сайт для отправки комментариев
Пнд, 27/05/2019 — 11:08
Зарегистрирован: 11.11.2015
FoxJone, спасибо за совет.
точку доступа создал, в предложеном Вами алгоритме после перезагрузки надо будет опять искать сеть и вводить пароль, а затем переключаться или пароль бвудет сохранен?
- Войдите на сайт для отправки комментариев
Пнд, 27/05/2019 — 11:42
vitalikost
Зарегистрирован: 28.11.2014
- Войдите на сайт для отправки комментариев
Пнд, 27/05/2019 — 12:54
Зарегистрирован: 19.04.2019
igorlab пишет:
FoxJone, спасибо за совет.
точку доступа создал, в предложеном Вами алгоритме после перезагрузки надо будет опять искать сеть и вводить пароль, а затем переключаться или пароль бвудет сохранен?
После настройки клиента пишите настройки (сеть, пароль и флаг того, что клиент настроен) в постоянную память (например, в EEPROM, или к примеру на SD-карту, если такая есть в конструкции) и при загрузке читайте их оттуда.
- Войдите на сайт для отправки комментариев
Пнд, 27/05/2019 — 14:50
Зарегистрирован: 07.09.2017
void loadDataWiFiEEPROM() < byte i = 0; while (((eep_str[i] = EEPROM.read(eep_pos_wifi_p1 + i)) >0) && (i < eep_max_len_param)) ++i; eep_str[i] = 0; strcpy(ssid, eep_str); i = 0; while (((eep_str[i] = EEPROM.read(eep_pos_wifi_p2 + i)) >0) && (i < eep_max_len_param)) ++i; eep_str[i] = 0; strcpy(password, eep_str); >void EEPROMinit() < EEPROM.begin(eep_max_len_param * eep_max_count_params); >// save String str_ppid = header.substring(p_id + 5, p_pp); str_ppid.toCharArray(eep_str, l_id + 1); eep_str[l_id] = 0; byte i = 0; while (eep_str[i] > 0) < EEPROM.write(eep_pos_wifi_p1 + i, eep_str[i]); ++i; >EEPROM.write(eep_pos_wifi_p1 + i, 0); str_ppid = header.substring(p_pp + 6, p_act); str_ppid.toCharArray(eep_str, l_pp + 1); eep_str[l_pp] = 0; i = 0; while (eep_str[i] > 0) < EEPROM.write(eep_pos_wifi_p2 + i, eep_str[i]); ++i; >EEPROM.write(eep_pos_wifi_p2 + i, 0); EEPROM.commit(); EEPROM.end(); EEPROMinit(); loadDataWiFiEEPROM(); // stop server and wifi
- Войдите на сайт для отправки комментариев
Втр, 28/05/2019 — 01:21
Зарегистрирован: 11.11.2015
Мужики, спасибо за подсказки в каком направлении двигаться, к сожалению готовые решения не помогли — это часть огромного проэкта и попытка внедрить тот же вифи-менеджер приводила к неработоспособности кода сервера и телеграмм-бота, поэтому написал костыльный, но рабочий подход. В eeprom выделяется место 40 байт под хранение двух пар: ssid и пароль, при запуске ЕСПхи пробуются имеющиеся пароли — если не удается подключиться, то создается точка доступа с простой формой — только для вводи имени сети и пароля. дальше проблемка))) в терминале вижу строку с введенными ИД и паролем:
Referer: http://192.168.4.1/wifisave?SSID=Hello&password=goodby
но не пойму как она выводится (в коде нет такго сериал-принтлайна), как это вывести в скетче, где это выводится в библеотеке тоже пока не нашел — поиск по слову в документе «Referer: « в папке с библитоеками ничего не находит, да и не придумал как разбить на аргументы, юзать регулярные выражения или есть более простой способ?.
— добавить сканер доступных сетей, чтобы не вводить название, а выбирать.
— возможно отимизировать место в памяти, а не выделять по 10 символов на каждый пароль и ssid
#include #include WiFiServer wifi_server(80); byte wifi_server_run = 0; #define last_byte_to_eeprom 106 String webpage; // Variable to store the HTTP request String header; // Replace with your network credentials const char* ssid = "KH-WiFi"; const char* password = "123456789"; void setup() < EEPROM.begin(last_byte_to_eeprom); Serial.begin(115200); connect_wifi (); >void loop() < while (true) < String command = Serial.readString(); // read a command if (command == "") break; // if no more commands, then exit else if (command.startsWith("psw2")) < // для тестирования записи ИД сети и пароля в EEPROM Serial.println("psw2"); write_wifi_password("Guest", "88888888"); >else if (command.startsWith("psw1")) < // для тестирования записи ИД сети и пароля в EEPROM Serial.println("psw1"); write_wifi_password("ASUS", "99999999"); >> if (wifi_server_run == 1) < // если не законектились к вайфаю начинаем слушать WiFiClient client = wifi_server.available(); // Listen for incoming clients if (client ) < // If a new client connects, Serial.println("New Client."); // print a message out in the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected()) < // loop while the client's connected if (client.available()) < // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor header += c; if (c == '\n') < // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) < // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); // turns the GPIOs on and off if (header.indexOf("wifisave") >= 0) < Serial.print("header ");Serial.println(header); >// Display the HTML web page client.println(" Title .wrapper
"); // The HTTP response ends with another blank line client.println(); // Break out of the while loop break; > else < // if you got a newline, then clear currentLine currentLine = ""; >> else if (c != '\r') < // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine >> > header = ""; // Clear the header variable client.stop(); // Close the connection Serial.println("Client disconnected."); Serial.println(""); > > > /* - Password and SSID couldn't be more than 10 chars - when writing new password the oldest one will be cleared - the script keeps max two pair of SSID and password */ void connect_wifi () < for (int i = 0; i < 30; i += 20) // пробуем подключиться к сети по всем паролям которіе есть в памяти < // Serial.print("try: "); Serial.println(i); char ssid[EEPROM_String_read(i).length() + 1]; char password[EEPROM_String_read(i + 10).length() + 1] ; EEPROM_String_read(i).toCharArray(ssid, EEPROM_String_read(i).length() + 1); EEPROM_String_read(i + 10).toCharArray(password, EEPROM_String_read(i + 10).length() + 1); Serial.print("ssid: "); Serial.print(ssid); Serial.print("; password: "); Serial.println(password); int x = 0; WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (x < 10) < if (WiFi.status() == WL_CONNECTED) break; Serial.println(x); x++; delay(500); >if (WiFi.status() == WL_CONNECTED) < Serial.println(""); Serial.println(F("WiFi connected")); Serial.print(F("IP address: ")); Serial.println(WiFi.localIP()); break; >> if (WiFi.status() != WL_CONNECTED) < // если не подклбчились к сети - создаем точку доступа для ввода имени сети и пароля Serial.println("Cant connect to wifi"); // Connect to Wi-Fi network with SSID and password Serial.print("Setting AP (Access Point)…"); // Remove the password parameter, if you want the AP (Access Point) to be open WiFi.softAP(ssid, password); IPAddress IP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(IP); Serial.println("Start local Wi-Fi server"); wifi_server.begin(); wifi_server_run = 1; >> void write_wifi_password (String ssid, String pswrd) < Serial.print("ssid: "); Serial.print(ssid); Serial.print("; password: "); Serial.println(pswrd); EEPROM_String_write(0, EEPROM_String_read(20)); EEPROM_String_write(10, EEPROM_String_read(30)); EEPROM_String_write(20, ssid); EEPROM_String_write(30, pswrd); >void EEPROM_String_write(char add, String data) < int _size = data.length(); int i; for (i = 0; i < _size; i++) EEPROM.write(add + i, data[i]); EEPROM.write(add + _size, '\0'); //Add termination null character for String Data EEPROM.commit(); >String EEPROM_String_read(char add) < int i; char data[50]; //Max 100 Bytes int len = 0; unsigned char k; k = EEPROM.read(add); while (k != '\0' && len < 500) //Read until null character < k = EEPROM.read(add + len); data[len] = k; len++; >data[len] = '\0'; return String(data); >
- Войдите на сайт для отправки комментариев
Втр, 28/05/2019 — 08:01

Зарегистрирован: 07.09.2017
Пример сканера сетей есть уже с библиотеками к платам
Чем вам не нравиться выделять по 10 байт под Логин пароль? Там памяти дофига
Работа с get и post запросами в esp8266 и esp32s немного отличается и библиотеки разные, но общий смысл одинаков- берём входящую строку и парсим её на нужные куски и вытаскиваем данные из нее
- Войдите на сайт для отправки комментариев
Втр, 28/05/2019 — 11:41
Зарегистрирован: 19.04.2019
С ESP32 не работал, ничего не могу сказать, а у ESP8266 море памяти и нормальная скорость, вполне себе может поддержать нормальный веб-интерфейс. Я на коленке собирал простенькую вебморду и успешно продал девайсину с ней клиенту — клиент очень был доволен тем, что управлять можно с любого устройства лишь бы был браузер. И это при том, что в html вообще играл чуть ли не первый раз в жизни. Не понимаю, зачем использовать GET-запросы м вообще все эти танцы с адресной строкой браузера.
С другой стороны, НАСТОЙЧИВО НЕ РЕКОМЕНДУЮ (сам обжегся очень) вешать на ESP8266 какие то другие задачи, кроме WiFi, web-сервера и вебинтерфейса. Ну максимум что то простенькое, типа кнопки или датчика температуры. Иначе, ой сколько вам открытий чудных готовит парадоксов друг.
- Войдите на сайт для отправки комментариев
Чт, 30/05/2019 — 11:22
Зарегистрирован: 11.11.2015
добавил сканер, сделал парсинг строки, но после ее записи (строка write_wifi_password ( String(SSID_s), String(password_s)); // ТАК НЕ РАБОТАЕТ — ВИСНЕТ) и попытке обращения к этой ячейке — происходит перезагрузка еспэхи. чтобы вернуть есп к жизни приходится заплнять память нулями.
if (header.indexOf("GET /wifisave?") >= 0) < Serial.print(". header "); Serial.println(header);//String header = "GET /wifisave?SSID=ASUS&password=123456 HTTP/1.1"; header.replace("GET /wifisave?SSID=", ""); header.replace("password=", ""); header.replace(" HTTP/1.1", ""); char token1[header.length()]; header.toCharArray(token1, header.length() + 1); // header.toCharArray(token1, header.length() + 1); char *token = strtok(token1, "&"); String SSID_s = token; token = strtok (NULL, "&"); String password_s = token; Serial.print("Extracted "); Serial.print(SSID_s);Serial.print(" "); Serial.println(password_s); delay(100); write_wifi_password ( String(SSID_s), String(password_s)); // ТАК НЕ РАБОТАЕТ - ВИСНЕТ // write_wifi_password("ASUS", "88888888"); // С ЭТОЙ СТРОКОЙ РАБОТАЕТ НОРМАЛЬНО >
#include #include WiFiServer wifi_server(80); byte wifi_server_run = 0; String wifi_ssid[20] = <>; int Networks_count = 0; #define last_byte_to_eeprom 106 String webpage; // Variable to store the HTTP request String header; // Replace with your network credentials const char* ssid = "KH-цшаш"; const char* password = "123456789"; void setup() < EEPROM.begin(last_byte_to_eeprom); Serial.begin(115200); connect_wifi(); >void loop() < while (true) < String command = Serial.readString(); // read a command if (command == "") break; // if no more commands, then exit else if (command.startsWith("psw2")) < Serial.println("psw2"); String s = "Guest", p = "88888888"; write_wifi_password(s, p); >else if (command.startsWith("psw1")) < Serial.println("psw1"); write_wifi_password("ASUS", "88888888"); >> if (wifi_server_run == 1) < WiFiClient client = wifi_server.available(); // Listen for incoming clients if (client ) < // If a new client connects, Serial.println("New Client."); // print a message out in the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected()) < // loop while the client's connected if (client.available()) < // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor header += c; if (c == '\n') < // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) < // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); if (header.indexOf("GET /wifisave?") >= 0) < Serial.print(". header "); Serial.println(header);//String header = "GET /wifisave?SSID=ASUS&password=123456 HTTP/1.1"; header.replace("GET /wifisave?SSID=", ""); header.replace("password=", ""); header.replace(" HTTP/1.1", ""); char token1[header.length()]; header.toCharArray(token1, header.length() + 1); // header.toCharArray(token1, header.length() + 1); char *token = strtok(token1, "&"); String SSID_s = token; token = strtok (NULL, "&"); String password_s = token; Serial.print("Extracted "); Serial.print(SSID_s);Serial.print(" "); Serial.println(password_s); delay(100); write_wifi_password ( String(SSID_s), String(password_s)); // ТАК НЕ РАБОТАЕТ - ВИСНЕТ // write_wifi_password("ASUS", "88888888"); // С ЭТОЙ СТРОКОЙ РАБОТАЕТ НОРМАЛЬНО >String web = " Title .wrapper "; web += ""; // web += ""; web += "
"; client.println(web); // The HTTP response ends with another blank line client.println(); // Break out of the while loop break; > else < // if you got a newline, then clear currentLine currentLine = ""; >> else if (c != '\r') < // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine >> > // Clear the header variable header = ""; // Close the connection client.stop(); Serial.println("Client disconnected."); Serial.println(""); > > > /* - Password and SSID couldn't be more than 10 chars - when writing new password the oldest one will be cleared - the script keeps max two pair of SSID and password */ void connect_wifi () < for (int i = 0; i 2 && EEPROM_String_read(i + 10).length() > 2) < Serial.print("EEPROM_String_read(i).length(): "); Serial.println(EEPROM_String_read(i).length()); Serial.print("EEPROM_String_read(i+10).length(): "); Serial.println(EEPROM_String_read(i+10).length()); // Serial.print("try: "); Serial.println(i); char ssid[EEPROM_String_read(i).length() + 1]; char password[EEPROM_String_read(i + 10).length() + 1] ; EEPROM_String_read(i).toCharArray(ssid, EEPROM_String_read(i).length() + 1); EEPROM_String_read(i + 10).toCharArray(password, EEPROM_String_read(i + 10).length() + 1); Serial.print("ssid: "); Serial.print(ssid); Serial.print("; password: "); Serial.println(password); int x = 0; WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while ((WiFi.status() != WL_CONNECTED) && x < 10) < // (выполнять цикл, пока хотя бы одно из условий истинно) if (WiFi.status() == WL_CONNECTED) break; Serial.println(x); x++; delay(500); >if (WiFi.status() == WL_CONNECTED) < Serial.println(""); Serial.println(F("WiFi connected")); Serial.print(F("IP address: ")); Serial.println(WiFi.localIP()); break; >> > if (WiFi.status() != WL_CONNECTED) < Serial.println("Cant connect to wifi"); // Connect to Wi-Fi network with SSID and password WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); Networks_count = WiFi.scanNetworks(); Serial.println("scan done"); if (Networks_count == 0) < Serial.println("no networks found"); >else < Serial.print(Networks_count); Serial.println(" networks found"); if (Networks_count >20) Networks_count = 20; for (int i = 0; i < Networks_count; ++i) < // Print SSID and RSSI for each network found wifi_ssid[i] = WiFi.SSID(i); Serial.print(i + 1); Serial.print(": "); Serial.print(WiFi.SSID(i)); Serial.print(" ("); Serial.print(WiFi.RSSI(i)); Serial.print(")"); // Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*"); delay(10); >> Serial.print("Setting AP (Access Point)…"); // Remove the password parameter, if you want the AP (Access Point) to be open WiFi.softAP(ssid, password); // IPAddress IP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(IP); Serial.println("Start local Wi-Fi server"); wifi_server.begin(); wifi_server_run = 1; > > void write_wifi_password (String ssid, String pswrd) < Serial.print("ssid: "); Serial.print(ssid); Serial.print("; password: "); Serial.println(pswrd); EEPROM_String_write(0, EEPROM_String_read(20)); EEPROM_String_write(10, EEPROM_String_read(30)); EEPROM_String_write(20, ssid); EEPROM_String_write(30, pswrd); >void EEPROM_String_write(char add, String data) < int _size = data.length(); int i; for (i = 0; i < _size; i++) EEPROM.write(add + i, data[i]); EEPROM.write(add + _size, '\0'); //Add termination null character for String Data EEPROM.commit(); >String EEPROM_String_read(char add) < int i; char data[50]; //Max 100 Bytes int len = 0; unsigned char k; k = EEPROM.read(add); while (k != '\0' && len < 55) //Read until null character < k = EEPROM.read(add + len); data[len] = k; len++; >data[len] = '\0'; return String(data); >
- Войдите на сайт для отправки комментариев
Чт, 30/05/2019 — 10:55

Зарегистрирован: 07.09.2017
странно как то. зачем закомментирована // server.handleClient(); ? в ESP32, да она не нужна, а тут работать не будет, потом еще и цикл бесконечный — конечно будет зависать.
Посмотретие пример из поставки HTTP сервер, там все просто и прозрачно.
Куски из моего проекта:
WiFi.disconnect(); Serial.print("Configuring access point. "); WiFi.mode(WIFI_AP); WiFi.softAP(srvssid, srvpass); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); // прописываем какие страницы открывать на разные запросы server.on("/", handleRoot); server.on("/setup", HTTP_GET, handleSetupGet); server.on("/setup", HTTP_POST, handleSetupPost); server.onNotFound(handleNotFound); server.begin(); // запускаем сервер Serial.println("HTTP server started"); server.handleClient(); // обрабатываем запрос if (server.hasArg("action")) < if (((server.arg("action").indexOf("savewifi")) >= 0) && (server.hasArg("ssid")) && (server.hasArg("pass"))) < Serial.println("There are new WiFi data"); // save data to eeprom // записываем введенные данные в eeprom byte l = server.arg("ssid").length() + 1; server.arg("ssid").toCharArray(eep_str, l); eep_str[l] = 0; byte i = 0; while (eep_str[i] >0) < EEPROM.write(eep_pos_wifi_p1 + i, eep_str[i]); ++i; >EEPROM.write(eep_pos_wifi_p1 + i, 0); l = server.arg("pass").length() + 1; server.arg("pass").toCharArray(eep_str, l); eep_str[l] = 0; i = 0; while (eep_str[i] > 0) < EEPROM.write(eep_pos_wifi_p2 + i, eep_str[i]); ++i; >EEPROM.write(eep_pos_wifi_p2 + i, 0); EEPROM.commit(); EEPROM.end(); EEPROMinit(); loadDataWiFiEEPROM(); server.stop(); WiFi.disconnect(); ++deviceMode; > > void handleNotFound() < String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i < server.args(); i++) < message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; >server.send(404, "text/plain", message); > void handleRoot() < server.send(200, "text/html", "You are connected
"); > void handleSetupGet() < String message = "\ \ \ ESP Server \ \ \ WiFi Acces Point data
\ 
