Веб-клиент FastLED, щелчок на странице для включения и выключения для ws2812

Веб-клиент FastLED, при нажатии на который все элементы RGB отображаются красным цветом. Выключен, все RGB выключено/черно. но не работать. Вот полный код, я не знаю, почему он всегда зацикливается, а веб-клиент зависает, когда я нажимаю кнопку на веб-странице

Я не могу включить все светодиоды или выключить все светодиоды.

#include <ESP8266WiFi.h>

#include <FastLED.h>
#define DATA_PIN 5
#define NUM_LEDS 300
CRGB leds[NUM_LEDS];
#define COLOR_ORDER GRB
#define BRIGHTNESS 254
#define FRAMES_PER_SECOND 30


// Введите имя вашей сети Wi-Fi и пароль Wi-Fi
const char* ssid = "";
const char* password = "";

// Установить номер порта веб-сервера на 80
WiFiServer server(80);

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

// Эти переменные хранят текущее состояние выхода светодиода
String outputRedState = "off";


// Назначаем выходные переменные контактам GPIO
const int redLED = 5;





// Текущее время
unsigned long currentTime = millis();
// Прошлый раз
unsigned long previousTime = 0;
// Определить время ожидания в миллисекундах (пример: 2000 мс = 2 с)
const long timeoutTime = 2000;

void setup() {
  Serial.begin(115200);


  //FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);
  LEDS.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);  // 初始化光带
  FastLED.setBrightness(BRIGHTNESS);                     // Устанавливаем яркость световой полосы
  set_max_power_in_volts_and_milliamps(5, 2000);         //Управление питанием световой полосы (установить световую полосу 5 вольт, 500 мА)


  // Подключаемся к сети Wi-Fi с 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.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop() {
  WiFiClient client = server.available();  // Слушаем входящих клиентов

  if (client) {                     // Если подключается новый клиент,
    Serial.println("New Client.");  // вывести сообщение в последовательный порт
    String currentLine = "";        // создаем строку для хранения входящих данных от клиента
    currentTime = millis();
    previousTime = currentTime;
    while (client.connected() && currentTime - previousTime <= timeoutTime) {  // цикл, пока клиент подключен
      currentTime = millis();
      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 /2/on") >= 0) {
              Serial.println("RED LED is on");
              outputRedState = "on";

              fill_solid(leds, 300, CRGB::Red);
              FastLED.show();



            } else if (header.indexOf("GET /2/off") >= 0) {
              Serial.println("RED LED is off");
              outputRedState = "off";

              fill_solid(leds, 300, 0);
              FastLED.show();
            }

            // Отображение веб-страницы в формате 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(".buttonRed { background-color: #ff0000; border: none; color: white; padding: 16px 40px; border-radius: 60%;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".buttonOff { background-color: #77878A; border: none; color: white; padding: 16px 40px; border-radius: 70%;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}</style></head>");

            // Заголовок веб-страницы
            client.println("<body><h1>My LED Control Server</h1>");

            // Отображение текущего состояния и кнопки ВКЛ/ВЫКЛ для GPIO 2 Красный светодиод
            client.println("<p>Red LED is " + outputRedState + "</p>");
            // Если outputRedState выключен, отображается кнопка OFF
            if (outputRedState == "off") {
              client.println("<p><a href=\"/2/on\"><button class=\"button buttonOff\">OFF</button></a></p>");
            } else {
              client.println("<p><a href=\"/2/off\"><button class=\"button buttonRed\">ON</button></a></p>");
            }

            client.println("</body></html>");

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

, 👍1

Обсуждение

но не работает... что это значит?, @jsotola

все RGB в красном цвете ... какой цвет должен быть?, @jsotola

пожалуйста, очистите свой код ... он не имеет правильного отступа, что делает ошибки очень трудными для выявления ... сделайте себе одолжение и избавьте себя от боли, научившись правильно форматировать свой код, @jsotola

посмотрите код на https://arduinoprosto.ru/q/91113/improve-sd-logger-0-02-of-data-isnt-logged-at-desired-rate.... вот что правильно отформатированный код выглядит так, @jsotola

Что я хочу сделать, так это получить доступ к веб-ссылке, http://xxxx/2/on, включить светодиодную ленту из 300 NUM_LED, а затем, если нажать кнопку выключения, вся светодиодная лента выключится. Но я столкнулся с тем, что устройство застряло, когда я нажал, иногда светодиоды не все включаются, и сеть, кажется, не отвечает, затем подождите несколько секунд, попробуйте снова нажать, иногда светодиод может гореть полностью. Но выключенный светодиод совершенно не работает., @user2470155

люди не будут тратить время на просмотр вашего кода, когда он представлен неформатированным... его должно быть легко читать здесь, на этой странице... людям не нужно копировать ваш код и вставлять его в редактор, форматировать его, а затем прочитай это, @jsotola

это может помочь... https://www.martyncurrey.com/esp8266-and-the-arduino-ide-part-6-javascript-and-ajax.... посмотрите на последний скетч в AJAX With Acknowledgement ................... вот еще https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/web-server-read- переключение-использование-AJAX/, @jsotola

просто переформатировать. Благодарю. Извините за мою ошибку, @user2470155

Я ожидаю, что все 300 светодиодов включаются, когда я нажимаю кнопку, но иногда горит только светодиод [0], затем мне нужно обновить «xxxx/2/on» несколько раз, а затем, наконец, горят все светодиоды., @user2470155