Значения веб-страницы не будут обновляться

Я пытался запустить следующий код ШИМ светодиода esp32, чтобы изменить яркость светодиода и показать текущую нагрузку ШИМ на веб-странице, но значения ШИМ на веб-странице не изменятся, пока я дважды не нажму кнопку отправки. .

#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
WebServer ser(80);
int s=0;
String k;



String iso()
{
  k="<p style=\"text-align: center;\"><strong><font size=\"9\">LED PWM</font></strong><font size=\"3\"></font><FORM action=\"/\" method=\"post\"><input type=\"text\" name=\"duty\"><br> <input type=\"submit\" value=\"Submit\">Cureent Duty=";
  k=k+s;
  k=k+"</p>";

  return k;
}

void root()
{
  iso();
  ser.send(200, "text/html", iso());

  if (ser.hasArg("duty")) 
  {
      iso();
      s=ser.arg("duty").toInt();  
      ledcWrite(4, s);
      iso();
      ser.send(200, "text/html", iso());
  }
}





void setup() {
  Serial.begin(9600);
  ledcAttachPin(33, 4);
  ledcSetup(4, 5000, 8);
  WiFi.begin("ssid", "pass");
  Serial.print("\nConnecting To WiFi");
  while (WiFi.status()!=WL_CONNECTED)
  {

    Serial.printf("\n.");
  }
  Serial.print("\nConnected");

  ser.on("/", root);
  ser.begin(80);
}



void loop() {
  ser.handleClient();
}

Вот GIF, посвященный проблеме

Проблема

, 👍1

Обсуждение

голосование за визуальную демонстрацию проблемы, @jsotola


1 ответ


Лучший ответ:

3

Когда клиент отправляет вам запрос, вы должны ответить только один раз. Твой Функция root() дважды пытается ответить каждый раз, когда запрос содержит аргумент «долг». Клиент не будет обрабатывать повторяющийся ответ на один запрос.

Вот ваша функция root():

void root()
{
  iso();
  ser.send(200, "text/html", iso());  // ← первый ответ

  if (ser.hasArg("duty"))
  {
      iso();
      s=ser.arg("duty").toInt();
      ledcWrite(4, s);
      iso();
      ser.send(200, "text/html", iso());  // ← второй ответ
  }
}

Вы можете заметить, что первый ответ был отправлен до обновления рабочий цикл.

Правильный способ обработки запроса — сначала обработать запрос. параметры, если есть, затем отправить ответ:

void root()
{
  if (ser.hasArg("duty")) {
    s = ser.arg("duty").toInt();
    ledcWrite(4, s);
  }
  ser.send(200, "text/html", iso());  // ← отправляется только один раз
}

Кстати, нет никакой необходимости строить ответ пять раз. раз (у вас есть пять вызовов iso() внутри root()), когда вы только нужно один раз!

,

Я такой идиот ! ;Р большое спасибо., @Tom