ESP8266 двойная связь Wi-Fi

Я могу подключить модуль ESP8266 к точке доступа Wi-Fi. WiFi.begin (ssid, pass); Я также сделал модуль для работы в качестве точки доступа Wi-Fi с собственным IP-адресом, также сделав его веб-сервером. Теперь, как я могу использовать один модуль esp8266 для подключения к внешней точке доступа Wi-Fi для периодической отправки данных датчика? В то же время он будет действовать как точка доступа Wi-Fi, чтобы другой клиентский компьютер / ноутбук мог подключиться к этой точке доступа и получить веб-страницу, используя свой статический IP-адрес?


person user3717550    schedule 02.10.2019    source источник
comment
а в чем проблема? написать скетч с обеими функциями   -  person Juraj    schedule 03.10.2019


Ответы (1)


Чтобы отправлять данные, а также использовать их в качестве веб-сервера, вам потребуется включить MDNS.

MDNS.begin("esp8266");
server.on("/", handleRoot);
server.begin();

Теперь вам нужно будет создать функцию для handleRoot

void handleRoot() {
  int sec = millis() / 1000;
  int min = sec / 60;
  int hr = min / 60;

  snprintf(temp, 1000, 
"<html>\
  <head>\
    <title>YOUR_TITLE</title>\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <p>Uptime: %02d:%02d:%02d</p>\
  </body>\
</html>", hr, min % 60, sec % 60);
  server.send(200, "text/html", temp);
}

Это будет отображать веб-страницу каждый раз, когда вы открываете статический IP-адрес esp8266.

Определите файл заголовка, а затем включите его в свой код как

#ifndef htmlData_h
#define htmlData_h

const char* dataHTML = "MY HTML CODE";
const char* dataHTML1 = "MY 2 HTML CODE";
#endif

Пример HTML-кода

const char* dataHTML = "<html>\
  <head>\
    <title>Demo</title>\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <h1>Hello!!!</h1>\
    <p>Uptime: %02d:%02d:%02d</p>\
    <FORM METHOD=POST action='/'>\
     <textarea rows = \"5\" cols = \"60\" name=myText>Talk to me...</textarea>\
     <br>\
     <input type=submit value='Talk'>\
   </FORM>\
  </body>\
</html>";

В приведенном выше коде на странице появится текстовое поле, которое вы должны использовать для отправки данных на esp8266 после того, как вы нажмете кнопку ввода, отображаемую Talk.

Для печати значений используйте

<input type=text name=myssid value=\"%s\">\

и использовать

snprintf(temp, 1000, dataHTML, variable1, varriable2,.....);

здесь переменная 1, переменная 2 будет представлять все значения% s в последовательности, которую вы закодировали.

person rock123A    schedule 03.10.2019
comment
Как это работает? ‹P› Время работы:% 02d:% 02d:% 02d ‹/p› \ ‹/html›, час, мин% 60, сек% 60); - person user3717550; 05.10.2019
comment
Проще говоря, функции snprintf сначала создают строку и заменяют% 02d на hr и так далее ... а затем функция server.send отправляет все данные и отображает их в Интернете. - person rock123A; 05.10.2019
comment
В начале функции вы найдете: int sec = millis () / 1000; который преобразует миллис в секунды - person rock123A; 05.10.2019
comment
Также вы можете использовать действие формы на веб-странице и запускать нужную функцию. - person rock123A; 05.10.2019
comment
Я использовал необработанный строковый литерал для получения html-кода. Как я могу использовать функцию sprintf для печати переменной в html-коде? [code] char html_page [] = RRAW (‹! DOCTYPE html› ‹html› ‹body› ‹метка для = ssid› WiFi SSID ‹/label› ‹тип ввода = имя текста = значение ssid = id = ssid placeholder = SSID / ›‹/Body› ‹/html›) RAW; server.send (200, текст / HTML, страница); [/код] - person user3717550; 12.10.2019
comment
выдает ошибку - невозможно преобразовать 'String *' в 'char *' для аргумента '1' в 'int snprintf (char *, size_t, const char *, ...)' - person user3717550; 12.10.2019
comment
Используйте const char * для создания HTML-страницы. - person rock123A; 12.10.2019
comment
Следующий код не показывает никаких ошибок. Загрузка в ESP также прошла успешно. Но ESP продолжает повторяться. Без функции snprintf все в порядке. интервал сек = миллис () / 1000; int min1 = сек / 60; int hr = min1 / 60; const char dataHTML [] = RRAW (‹html› ‹body› ‹p› Время работы:% 02d:% 02d:% 02d ‹/p› ‹/body› ‹/html›) RAW; //, час, мин% 60, сек% 60); snprintf (страница, 1000, dataHTML, sec, min1, hr); Serial.println (ssids_page); server.send (200, текст / HTML, страница); - person user3717550; 26.10.2019
comment
Вы использовали задержку в цикле - person rock123A; 27.10.2019
comment
В каком цикле мне нужно добавить задержку? - person user3717550; 01.11.2019
comment
в основном цикле - person rock123A; 01.11.2019
comment
и MDNS.begin (esp8266); server.on (/, handleRoot); server.begin (); должен вызываться через функцию настройки, а не в функции цикла - person rock123A; 01.11.2019