Проблема с выводом данных сенсора

Необходимо при нажатии кнопоки RIGHT или LEFT данные с сенсора обновлялись постоянно и отображались до нажатия кнопки STOP

// NodeMCU 0.9(ESP-12 Module)
#include <ESP8266WiFi.h>
//#include <ESP8266WebServer.h>
#define SENSOR A0
// здесь пишем учетные данные своей сети:
const char* ssid = "Ulefone S7";  // Enter SSID here
const char* password = "1234567890";  //Enter Password here

// задаем номер порта для веб-сервера («80»):
WiFiServer server(80);

// переменная для хранения HTTP-запроса:
String header;

// вспомогательные переменные
// для хранения текущего состояния выходных контактов:
String output16State = "off";
String outputState = "off";
String az;
int val = 0;
int angle;

// задаем номера для выходных GPIO-контактов:
const int output16 = 16;
const int output14 = 14;
const int output12 = 12;
const int output13 = 13;
const int output15 = 15;
const int output5 = 5;
const int output4 = 4;
const int output0 = 0;

void setup() {
  Serial.begin(115200);
  // делаем эти GPIO-контакты выходными:
  pinMode(output16, OUTPUT);
  pinMode(output14, OUTPUT);
  pinMode(output12, OUTPUT);
  pinMode(output13, OUTPUT);
  pinMode(output15, OUTPUT);
  pinMode(output5, OUTPUT);
  pinMode(output4, OUTPUT);
  pinMode(output0, OUTPUT);
  // присваиваем им значение «LOW»:
  digitalWrite(output16, LOW);
  digitalWrite(output14, LOW);
  digitalWrite(output12, LOW);
  digitalWrite(output13, LOW);
  digitalWrite(output15, LOW);
  digitalWrite(output5, LOW);
  digitalWrite(output4, LOW);
  digitalWrite(output0, LOW);

  // подключаемся к WiFi-сети при помощи заданных выше SSID и пароля:
  Serial.print("Connecting to ");
  //  "Подключаемся к "
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // печатаем в мониторе порта локальный IP-адрес
  // и запускаем веб-сервер:
  Serial.println("");
  Serial.println("WiFi connected.");  //  "WiFi подключен."
  Serial.println("IP address: ");  //  "IP-адрес: "
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop() {
  // считываем значение
  // начинаем прослушивать входящих клиентов:

  WiFiClient client = server.available();

  if (client) {                     // если подключился новый клиент,
    Serial.println("New Client.");  // печатаем сообщение
    // «Новый клиент.»
    // в мониторе порта;
    String currentLine = "";        // создаем строку для хранения
    // входящих данных от клиента;
    while (client.connected()) {    // цикл while() будет работать
      // все то время, пока клиент
      // будет подключен к серверу;
      if (client.available()) {     // если у клиента есть данные,
        // которые можно прочесть,
        char c = client.read();     // считываем байт, а затем
        Serial.write(c);            // печатаем его в мониторе порта
        header += c;
        if (c == '\n') {            // если этим байтом является
          // символ новой строки
          // если мы получим два символа новой строки подряд
          // то это значит, что текущая строчка пуста;
          // это конец HTTP-запроса клиента,
          // а значит – пора отправлять ответ:
          if (currentLine.length() == 0) {
            // HTTP-заголовки всегда начинаются
            // с кода ответа (например, «HTTP/1.1 200 OK»)
            // и информации о типе контента
            // (чтобы клиент понимал, что получает);
            // в конце пишем пустую строчку:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            //  "Соединение: отключено"
            client.println();

            // с помощью этого кода
            // включаем и выключаем GPIO-контакты:
            if (header.indexOf("GET /16/on") >= 0) {
              Serial.println("GPIO 16 on");
              output16State = "160";
              digitalWrite(output16, HIGH);
              digitalWrite(output14, LOW);
              digitalWrite(output12, LOW);
              digitalWrite(output13, LOW);
              digitalWrite(output15, LOW);
              digitalWrite(output5, LOW);

            }
            if (header.indexOf("GET /14/on") >= 0) {
              Serial.println("GPIO 14 on");
              output16State = "80";
              digitalWrite(output16, LOW);
              digitalWrite(output14, HIGH);
              digitalWrite(output12, LOW);
              digitalWrite(output13, LOW);
              digitalWrite(output15, LOW);
              digitalWrite(output5, LOW);

            }
            if (header.indexOf("GET /12/on") >= 0) {
              Serial.println("GPIO 12 on");
              output16State = "30";
              digitalWrite(output16, LOW);
              digitalWrite(output14, LOW);
              digitalWrite(output12, HIGH);
              digitalWrite(output13, LOW);
              digitalWrite(output15, LOW);
              digitalWrite(output5, LOW);

            }
            if (header.indexOf("GET /13/on") >= 0) {
              Serial.println("GPIO 13 on");
              output16State = "20";
              digitalWrite(output16, LOW);
              digitalWrite(output14, LOW);
              digitalWrite(output12, LOW);
              digitalWrite(output13, HIGH);
              digitalWrite(output15, LOW);
              digitalWrite(output5, LOW);

            }
            if (header.indexOf("GET /15/on") >= 0) {
              Serial.println("GPIO 15 on");
              output16State = "15";
              digitalWrite(output16, LOW);
              digitalWrite(output14, LOW);
              digitalWrite(output12, LOW);
              digitalWrite(output13, LOW);
              digitalWrite(output15, HIGH);
              digitalWrite(output5, LOW);

            }
            if (header.indexOf("GET /5/on") >= 0) {
              Serial.println("GPIO 10 on");
              output16State = "10";
              digitalWrite(output16, LOW);
              digitalWrite(output14, LOW);
              digitalWrite(output12, LOW);
              digitalWrite(output13, LOW);
              digitalWrite(output15, LOW);
              digitalWrite(output5, HIGH);

            }
            if (header.indexOf("GET /4/on") >= 0) {
              Serial.println("GPIO 4 on");
              outputState = "RIGHT";
              digitalWrite(output4, HIGH);
              digitalWrite(output0, LOW);
            }
            if (header.indexOf("GET /0/on") >= 0) {
              Serial.println("GPIO 0 on");
              outputState = "LEFT";
              digitalWrite(output4, LOW);
              digitalWrite(output0, HIGH);
            }
            if (header.indexOf("GET /stop") >= 0) {
              Serial.println("GPIO stop");
              outputState = "STOP";
              digitalWrite(output4, LOW);
              digitalWrite(output0, LOW);
            }
            if (outputState == "RIGHT" || outputState == "LEFT") {
              val = analogRead(SENSOR);
              delay(1);
              angle = val * 0.350;
              az = String(angle);
            }
            // показываем веб-страницу с помощью этого HTML-кода:
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // с помощью CSS задаем стиль кнопок
            // если есть желание, можно поэкспериментировать
            // с фоновым цветом и атрибутами размера шрифта:
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 10px 25px;");
            client.println("text-decoration: none; font-size: 20px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: red ; border: none; color: white; padding: 12px 27px;</style></head>");

            // заголовок веб-страницы:
            client.println("<body><h3>Commutator</h3>");

            // рисуем кнопки для контакта GPIO
            // и показываем его текущее состояние (ON/OFF):
            client.println("<p>Relay - State " + output16State + "</p>");

            if (output16State == "off") {
              client.println("<p><a href=\"/16/on\"><button class=\"button\">160</button></a> <a href=\"/14/on\"><button class=\"button\">80</button></a> <a href=\"/12/on\"><button class=\"button\">30</button></a></p>");
              client.println("<p><a href=\"/13/on\"><button class=\"button\">20</button></a> <a href=\"/15/on\"><button class=\"button\">15</button></a> <a href=\"/5/on\"><button class=\"button\">10</button></a></p>");

            }
            if (output16State == "160") {
              client.println("<p><a href=\"/16/on\"><button class=\"button2\">160</button></a> <a href=\"/14/on\"><button class=\"button\">80</button></a> <a href=\"/12/on\"><button class=\"button\">30</button></a></p>");
              client.println("<p><a href=\"/13/on\"><button class=\"button\">20</button></a> <a href=\"/15/on\"><button class=\"button\">15</button></a> <a href=\"/5/on\"><button class=\"button\">10</button></a></p>");
            }
            if (output16State == "80") {
              client.println("<p><a href=\"/16/on\"><button class=\"button\">160</button></a> <a href=\"/14/on\"><button class=\"button2\">80</button></a> <a href=\"/12/on\"><button class=\"button\">30</button></a></p>");
              client.println("<p><a href=\"/13/on\"><button class=\"button\">20</button></a> <a href=\"/15/on\"><button class=\"button\">15</button></a> <a href=\"/5/on\"><button class=\"button\">10</button></a></p>");
            }
            if (output16State == "30") {
              client.println("<p><a href=\"/16/on\"><button class=\"button\">160</button></a> <a href=\"/14/on\"><button class=\"button\">80</button></a> <a href=\"/12/on\"><button class=\"button2\">30</button></a></p>");
              client.println("<p><a href=\"/13/on\"><button class=\"button\">20</button></a> <a href=\"/15/on\"><button class=\"button\">15</button></a> <a href=\"/5/on\"><button class=\"button\">10</button></a></p>");
            }
            if (output16State == "20") {
              client.println("<p><a href=\"/16/on\"><button class=\"button\">160</button></a> <a href=\"/14/on\"><button class=\"button\">80</button></a> <a href=\"/12/on\"><button class=\"button\">30</button></a></p>");
              client.println("<p><a href=\"/13/on\"><button class=\"button2\">20</button></a> <a href=\"/15/on\"><button class=\"button\">15</button></a> <a href=\"/5/on\"><button class=\"button\">10</button></a></p>");
            }
            if (output16State == "15") {
              client.println("<p><a href=\"/16/on\"><button class=\"button\">160</button></a> <a href=\"/14/on\"><button class=\"button\">80</button></a> <a href=\"/12/on\"><button class=\"button\">30</button></a></p>");
              client.println("<p><a href=\"/13/on\"><button class=\"button\">20</button></a> <a href=\"/15/on\"><button class=\"button2\">15</button></a> <a href=\"/5/on\"><button class=\"button\">10</button></a></p>");
            }
            if (output16State == "10") {
              client.println("<p><a href=\"/16/on\"><button class=\"button\">160</button></a> <a href=\"/14/on\"><button class=\"button\">80</button></a> <a href=\"/12/on\"><button class=\"button\">30</button></a></p>");
              client.println("<p><a href=\"/13/on\"><button class=\"button\">20</button></a> <a href=\"/15/on\"><button class=\"button\">15</button></a> <a href=\"/5/on\"><button class=\"button2\">10</button></a></p>");
            }
            client.println("<h3>Rotator</h3>");
            client.println("<p>Relay - State " + outputState + "</p>");
            client.println("<h1>Azimut:" + az + " </h1>");

            if (outputState == "off") {
              client.println("<p><a href=\"/4/on\"><button class=\"button\">RIGHT</button></a> <a href=\"/0/on\"><button class=\"button\">LEFT</button></a> </p>");
            }
            if (outputState == "RIGHT") {
              client.println("<p><a href=\"/4/on\"><button class=\"button2\">RIGHT</button></a> <a href=\"/stop\"><button class=\"button\">STOP</button></a> </p>");
            }
            if (outputState == "LEFT") {
              client.println("<p> <a href=\"/0/on\"><button class=\"button2\">LEFT</button></a> <a href=\"/stop\"><button class=\"button\">STOP</button></a> </p>");
            }
            if (outputState == "STOP") {
              client.println("<p><a href=\"/4/on\"><button class=\"button\">RIGHT</button></a> <a href=\"/0/on\"><button class=\"button\">LEFT</button></a>  </p>");
            }
            client.println("<p>======== *** ==========</p>");
            client.println("</body></html>");

            // конец HTTP-ответа задается
            // с помощью дополнительной пустой строки:
            client.println();
            // выходим из цикла while:
            break;
          } else {  // если получили символ новой строки,
            // очищаем текущую строку «currentLine»:
            currentLine = "";
          }
        } else if (c != '\r') {  // если получили любые данные,
          // кроме символа возврата каретки,
          currentLine += c;      // добавляем эти данные
          // в конец строки «currentLine»
        }
      }
    }
    // очищаем переменную «header»:
    header = "";
    // отключаем соединение:
    client.stop();
    Serial.println("Client disconnected.");
    //  "Клиент отключен."
    Serial.println("");
  }
}

Я - за. Актуальные данные - они завсегда лучше.

3 лайка

Наверное надо как-то написать это в коде? Сейчас у вас ответ отправляется на запрос только один раз, никакого “постоянного обновления” нет.

Да . Это надо сделать в коде. При периодическом нажимании кнопок RIGHT или LEFT, когда они включены (подсвечены красным цветом), значение AZ меняется.

Ну и чего не делаешь (что не получается)?

Я новичек, слабо представляю работу клиент - сервер WiFi.Данные сенсора обновляются после нажатия любой кнопки, то есть после получения сервером каких то данных. Строка:

while (client.connected()) { // цикл while() будет работать
// все то время, пока клиент
// будет подключен к серверу;
if (client.available()) { // если у клиента есть данные,
// которые можно прочесть,

Как организовать программно ,через код , отсылку запроса на сервер с повтором через 100 мсек. Например, имитировать кодом нажатие кнопки LEFT или RIGHT

Может лучше настроить на самом сервере autoreload для этой странички? - примеров в сети полно, всякие странички с обновляющимся таймером или полосой загрузки

Может лучше настроить на самом сервере autoreload для этой странички?
Спасибо за подсказку.Вопрос решен через Refresh.