ESP32 световые полосы, показывающие неправильные цвета
Я купил несколько индивидуально адресуемых светодиодных лент (большая катушка). Чтобы снизить стоимость, это WS2811, и это один чип на 6 светодиодов. Я не знаю, дешевизна или светодиодный стиль имеют какое-то значение для проблемы, но я просто выставляю ее на всеобщее обозрение.
Они поддерживают 24 В, поэтому на всякий случай я запускаю их на 23 В. У меня есть линия передачи данных, подключенная к контакту 13 ESP, и заземление к источнику питания, чтобы создать общее заземление. Я использую Alexa для управления цветами. Это код:
#include <WiFi.h>
#include <Espalexa.h>
#include <FastLED.h>
#include <Adafruit_NeoPixel.h>
FASTLED_USING_NAMESPACE
#define NUM_LEDS 120
#define LED_TYPE WS2811
#define LED_PIN 13
CRGB leds[NUM_LEDS];
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_RGB + NEO_KHZ400);
#define ESPALEXA_ASYNC
Espalexa espalexa;
#define RELAY_PIN 12
boolean connectWifi();
void colorLightChanged(uint8_t brightness, uint32_t rgb);
const char* ssid = "****";
const char* password = "****";
boolean wifiConnected = false;
void setup()
{
Serial.begin(115200);
delay(2000);
// FastLED.addLeds<LED_TYPE, LED_PIN>(leds, NUM_LEDS);
//
pinMode(LED_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH);
//
// for (int i = 0; i < NUM_LEDS ; i++) {
// leds[i] = CRGB(0, 0, 0);
// }
// FastLED.show();
strip.begin();
strip.show();
wifiConnected = connectWifi();
if(wifiConnected){
espalexa.addDevice("Lights", colorLightChanged);
espalexa.begin();
} else
{
while (1) {
Serial.println("Cannot connect to WiFi. Please check data and reset the ESP.");
delay(2500);
}
}
}
void loop()
{
espalexa.loop();
delay(1);
}
void colorLightChanged(uint8_t brightness, uint32_t rgb) {
for (int i = 0; i < NUM_LEDS; i++) {
// leds[i] = CRGB((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF);
// FastLED.setBrightness(brightness);
strip.setPixelColor(i, (rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF);
}
// FastLED.show();
strip.show();
if(brightness == 0) { //lights off
digitalWrite(RELAY_PIN, LOW);
}
else { //lights on
digitalWrite(RELAY_PIN, HIGH);
}
// Serial.print("Brightness: ");
// Serial.print(brightness);
// Serial.print(", Red: ");
// Serial.print((rgb >> 16) & 0xFF); //get red component
// Serial.print(", Green: ");
// Serial.print((rgb >> 8) & 0xFF); //get green
// Serial.print(", Blue: ");
// Serial.println(rgb & 0xFF); //get blue
}
boolean connectWifi(){
boolean state = true;
int i = 0;
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("Connecting to WiFi");
Serial.print("Connecting...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (i > 40){
state = false; break;
}
i++;
}
Serial.println("");
if (state){
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
else {
Serial.println("Connection failed.");
}
return state;
}
Я пробовал и Neopixel, и FastLED с одинаковыми результатами. Эти результаты совершенно неверны .:
Предполагается, что это голубой
цвет, за исключением того, что он в основном желтый с небольшим количеством синего.
Это должно быть фиолетовое
И я думаю, что вы поняли эту идею. Полосы освещения загораются неправильными цветами (у меня было то, что должно было быть золотым
, фиолетовым
), пятнами цветов или просто делают некоторые из них действительно похожими (на Alexa теплый белый и холодный белый выглядят почти одинаково, если не считать изменения яркости).
Хотя я не знаю, что может быть причиной этого. Я убедился, что есть общая точка соприкосновения, я убедился, что вывод на ESP правильный (т.Е. Просто обычный выходной вывод без каких-либо других причудливых вещей), я попробовал 2 разные библиотеки, но все равно не повезло.
Кто-нибудь может мне помочь?
EDIT: Вот эти полоски, которые я купил, если это поможет: https://www.superlightingled.com/65ft20m-roll-ws2811-dc24v-36ledsm-addressable-led-light-strips-digital-full-dream-color-chasing-flexible-led-strips-p-3163.html
1 ответ
Вместо этого эта полоса кажется BGR или RGB.
Вместо этого используйте NEO_GRB в вашем инициализаторе. Итак:
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_BGR + NEO_KHZ400);
Я все равно попробую, но повлияет ли это на цвета? Я не упоминал об этом (вероятно, следовало бы), но все основные цвета (красный, зеленый, синий) отображаются правильно. Если я установлю для полосы значение red, она будет отображаться красным цветом., @DreamingInsanity
Учитывая предоставленную вами новую информацию, это, вероятно, ничего не исправит., @Gerben
- Управлять несколькими полосками WS2812B с разным количеством светодиодов.
- Светодиодная лента WS2812B + First Pixel продолжает ломаться
- ESP32 + Фастлед + WS2801
- WifiClient и aREST на esp32 – цикл до получения новых инструкций?
- Безопасно питать светодиодную ленту через ESP32 GPIO
- игнорирование изменений значения потенциометра
- Анимация светодиодной ленты с ESP32 не работает при использовании WiFi
- Проблема с индивидуальными адресуемыми светодиодами Adafruit Neopixel - Любой код заставляет светодиоды "сходить с ума"
на данный момент неясно, связана ли проблема с alexa или с самой светодиодной лентой .... удалите весь код alexa... осветите всю полоску одним цветом, сделайте паузу в 5 секунд, осветите всю полоску другим цветом и так далее .... начните с красного, затем зеленого, затем синего, @jsotola
Я попробовал это без кода Alexa, и они работают отлично. Что меня смущает, так это то, что нет ничего плохого в значениях RGB, которые поступают от Alexa. Красный отображается как
255 0 0", фиолетовый - как
171 35 255` и так далее. Может быть, библиотекам светодиодов не нравится, когда их запускают при обратном вызове?, @DreamingInsanityЕсли это проблема с обратным вызовом, попробуйте переместить
strip.show();
в вашу функциюloop
. Если это тоже не удается, попробуйте переместить все в цикл, и пустьcolorLightChanged
сохраняет только новые значения в глобальной (изменяемой) переменной, которую использует ваш цикл., @GerbenПросто попробовал поместить код FastLED в цикл и использовать флаг, чтобы определить, когда устанавливать цвет. К сожалению, это все еще не работает. Моя последняя идея - просто попробовать изменить цвет на другом ядре, чтобы espalexa и fastled были полностью разделены. Я не питаю особых надежд, но попытаться стоит, @DreamingInsanity
почему вы используете adafruit и fastled одновременно? Я не думаю, что это сработает. Кроме того, гораздо быстрее использовать .fill() вместо setPixelColor, если все они одного цвета., @dandavis
В приведенном выше коде код fastled закомментирован. Я включил библиотеку neopixel, чтобы убедиться, что это была не просто проблема с fastled, @DreamingInsanity