Работает только первый светодиод ws2812 при подключении к ESP8266

Здравствуйте! Столкнулся с такой проблемой: написал простые эффекты для ленты ws2812 под контролем ESP8266. Код работал исправно, до тех пор, пока в void setup() не прописал подключение к WiFi. Как только ESP подключился к сети, перестали работать все светодиоды, кроме первого (причём на нём выводится нужный цвет). Использовал библиотеку FastLED.h и экспериментировал с разными версиями ядра ESP (от V2.7 до V3.1), но это не помогло, проблема осталась. Кто сталкивался с этим, подскажите, пожалуйста, что делать в таком случае. Возможно, FastLED как-то конфликтует со стандартным ядром. Есть ли смысл использовать аналоги FastLED, например, NeoPixel? Заранее спасибо!

FastLED прекрасно работает с esp, а у вас, как я вижу, проблема в строке номер 45

Не совсем понял, о какой строке вы говорите

Как это о какой? О строке вашего проблемного кода, который вы забыли выложить. Кроме того, я вижу и проблему в схеме подключения, которой тоже нет. Вы зачем тему создали? Просто сообщить о своих проблемах? Ну ок, мы услышали

Светится только первый (управление через GyverHub):

#define STRIP_PIN 2
#define NUMLEDS 40

#include <Arduino.h>
#define AP_SSID "*************"
#define AP_PASS "*************"
#include <GyverHub.h>                     // Платформа для создания интерфейсов управления

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>

#include <FastLED.h>

GyverHub hub("MyDevices", "ESP8266", "");
CRGB strip[NUMLEDS];

void light(CRGB color = CRGB::White, byte bright = 150) {
  for (byte i; i < NUMLEDS; i++) {
    strip[i] = color;
  }
  FastLED.setBrightness(bright);
}

GHbutton b2;

void build() {
  hub.BeginWidgets();
  hub.WidgetSize(100);
  hub.Button(&b2, F("Power"), GH_RED);
  hub.EndWidgets();
}

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

  WiFi.mode(WIFI_STA);
  WiFi.begin("********", "*********");
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(500);
    Serial.println(".");
  }
  Serial.println(WiFi.localIP());

  hub.onBuild(build);
  hub.begin();

  FastLED.addLeds<WS2811, STRIP_PIN, GRB>(strip, NUMLEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(50);
  FastLED.clear();
  FastLED.show();
}

void loop() {
  hub.tick();
  if (b2.changed()) {
    b2 ? light() : FastLED.clear();         // Если нажата кнопка в web интерфейсе, заливаем ленту белым, иначе очищаем
    FastLED.show();
    Serial.println("Upd");
  }
}

Подключение:
+5v от блока питания - к 5v ESP и 5v ленты;
GND от блока питания - к GND на ESP и GND на ленте;
Din ленты - к GPIO2 ESP (D4).

Проблема точно не в GyverHub, пробовал без неё - та же проблема.

При этом, если не подключать ESP к wifi, то вся лента работает (пробовал мигание белым цветом):

#define STRIP_PIN 2
#define NUMLEDS 40

#include <FastLED.h>
#include <ESP8266WiFi.h>

CRGB strip[NUMLEDS];

void light(CRGB color = CRGB::White, byte bright = 150) {
  for (byte i; i < NUMLEDS; i++) {
    strip[i] = color;
  }
  FastLED.setBrightness(bright);
}

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

  FastLED.addLeds<WS2811, STRIP_PIN, GRB>(strip, NUMLEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(50);
  FastLED.clear();
  FastLED.show();
}

void loop() {
  light();
  FastLED.show();
  delay(500);
  FastLED.clear();
  FastLED.show();
  delay(500);
}

Но как только подключаемся к сети, работает только один светодиод:

#define STRIP_PIN 2
#define NUMLEDS 40

#include <FastLED.h>
#include <ESP8266WiFi.h>

CRGB strip[NUMLEDS];

void light(CRGB color = CRGB::White, byte bright = 150) {
  for (byte i; i < NUMLEDS; i++) {
    strip[i] = color;
  }
  FastLED.setBrightness(bright);
}

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

  WiFi.mode(WIFI_STA);
  WiFi.begin("********", "*********");
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(500);
    Serial.println(".");
  }
  Serial.println(WiFi.localIP());

  FastLED.addLeds<WS2811, STRIP_PIN, GRB>(strip, NUMLEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(50);
  FastLED.clear();
  FastLED.show();
}

void loop() {
  light();
  FastLED.show();
  delay(500);
  FastLED.clear();
  FastLED.show();
  delay(500);
}

P.s. прошу прощения, что сразу не предоставил нужную информацию

А поменять пин не пробовали? Например

#define STRIP_PIN 4

Пробовал, не помогло

Я сейчас на работе, смогу проверить только завтра. Может кто другой откликнется. Попробуйте на других пинах.

Хорошо, буду пробовать

И вот еще - логика на esp работает на 3,3 вольта, а адресным нужно 5 вольт. Попробуйте конвертер логических уровней добавить. Вполне возможно, что при подключении вайфая просаживается напряжение.

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

Я знаю, что работает. И с вай-фаем тоже. И проблем в коде не вижу. Значит проблема таки железячная. Но сам смогу проверить только завтра

Действительно, с вайфаем работает через пень колоду. Первые 9-10 раз мигает как положено, потом начинается - то только первый мигает желтым, то все горят белым, первый мигает синим. Иногда прочухивается и начинает работать, но не долго. Как ни странно, но нормально работает с таким костылем:

#define STRIP_PIN 2
#define NUMLEDS 40

#include <FastLED.h>
#include <ESP8266WiFi.h>

CRGB strip[NUMLEDS];

void light(CRGB color = CRGB::White, byte bright = 150) {
  FastLED.setBrightness(bright);
  for (byte i; i < NUMLEDS; i++) {
    strip[i] = color;
    if (i % 10 == 0 || i == NUMLEDS - 1) {
      FastLED.show();
    }
  }
}

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

  WiFi.mode(WIFI_STA);
  WiFi.begin("**************", "***********");
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(500);
    Serial.println(".");
  }
  Serial.println(WiFi.localIP());

  FastLED.addLeds<WS2811, STRIP_PIN, GRB>(strip, NUMLEDS);
  FastLED.setBrightness(50);
  FastLED.clear();
  FastLED.show();
}

void loop() {
  light();
  delay(500);
  light(CRGB::Black);
  delay(500);
}

Конструкция

if (i % 10 == 0 || i == NUMLEDS - 1) {

исключительно, чтобы FastLED.show() не вызывать на каждой итерации - это сильно замедляет цикл.

А уж что там вайфай нарушает - одним китайцам известно )))

Переменную i точно можно не инициализировать?

Как было, так оставил. Инициализация проблему не решала

Огромное спасибо, всё заработало :slight_smile:
Да, интересно, что там китайцы с WiFi намудрили…