ESP32 световые полосы, показывающие неправильные цвета

esp32 neopixel led-strip

Я купил несколько индивидуально адресуемых светодиодных лент (большая катушка). Чтобы снизить стоимость, это 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

, 👍0

Обсуждение

на данный момент неясно, связана ли проблема с 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


1 ответ


1

Вместо этого эта полоса кажется BGR или RGB.

Вместо этого используйте NEO_GRB в вашем инициализаторе. Итак:

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_BGR + NEO_KHZ400);
,

Я все равно попробую, но повлияет ли это на цвета? Я не упоминал об этом (вероятно, следовало бы), но все основные цвета (красный, зеленый, синий) отображаются правильно. Если я установлю для полосы значение red, она будет отображаться красным цветом., @DreamingInsanity

Учитывая предоставленную вами новую информацию, это, вероятно, ничего не исправит., @Gerben