В прошлом эксперименте мы научились создавать простые веб-страницы с формой для отправки данных на сервер. На странице было текстовое поле, в которое можно было ввести значение от 0 до 1023. После ввода числа и нажатия на кнопку Send происходила отправка данных из формы на сервер. Сервер принимал эти данные, изменял состояние светодиода, вновь считывал из файла page.html содержимое и вновь отправлял его в браузер клиенту. Таким образом после отправки данных сервер отправлял нам ту же самую страницу и мы могли ввести новое значение в текстовое поле и снова отправить.
Все хорошо, кроме одного — страница каждый раз загружалась в браузер в своем первозданном виде. В ней мы изначально прописали значение текстового поля по- умолчанию 512. И каждый раз после отправки данных в текстовом поле снова находилось число 512 вне зависимости от того что мы туда вводили. Это не очень удобно. Было бы здорово, если бы после ввода числа и отправки формы нам возвращалась бы страница с тем числом, которые мы ввели туда в прошлый раз. Это позволило бы нам видеть текущее значение яркости светодиода.
Чтобы это сделать нам необходимо заменять данные в веб странице. Изначально мы прописали в ней жестко
<input type="text" name="duty" value="512">
Теперь нам нужно подумать как вместо 512 выводить каждый раз другое значение, то, которое вводил пользователь. Сделать это не сложно, достаточно заменить 512 на специальную метку. А перед выводом страницы в браузер производить поиск метки в тексте и ее замену на нужное число. Сделаем вот так:
Как видно, мы заменили жестко прописанное число 512 на метку ⇐VALUE⇒
. Теперь перед выводом этой страницы в браузер нам нужно производить поиск с ее тексте ⇐VALUE⇒
и замену этой метки на реальное число.
Теперь новый код программы:
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #define WIFI_NAME "WiFi_Name" #define WIFI_PASSWORD "WiFi_Password" #define PIN_LED 13 ESP8266WebServer server(80); void indexPage() { int duty = 512; if (server.hasArg("duty")) duty = server.arg("duty").toInt(); String page = "<!DOCTYPE html>"; page += "<html>"; page += "<head>"; page += "</head>"; page += "<body>"; page += "<h2>Input led duty between 0 and 1023</h2>"; page += R"(<form action="/">)"; page += R"(<input type="number" name="duty" min="0" max="1023" value="<=VALUE=>">)"; page += R"(<input type="submit" value="Send">)"; page += "</form>"; page += "</body>"; page += "</html>"; page.replace("<=VALUE=>", String(duty)); server.send(200, "text/html", page); } void setup() { analogWriteRange(1024); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_NAME, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { } server.on("/", indexPage); server.begin(); } void loop() { server.handleClient(); }
Первым делом в коде программы нужно заменить WiFi_Name
на имя нужной сети, а WiFi_Password
на пароль от нее.
По сравнению с кодом прошлого эксперимента появилась одна строка
page.replace("<=VALUE=>", String(duty));
Для замены метки на данные мы применили метод replace(что_меняем, на_что_меняем)
. Теперь после отправки данных из формы нам вернется веб-страница с таким же значением, которое мы вводили перед отправкой.