Здравствуйте! Столкнулся с такой проблемой: написал простые эффекты для ленты 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 точно можно не инициализировать?
Как было, так оставил. Инициализация проблему не решала
Огромное спасибо, всё заработало
Да, интересно, что там китайцы с WiFi намудрили…