FastLED fill_rainbow - Неожиданный красный пиксель

led rgb-led led-strip

Я использую встроенную функцию Fastleds fill_rainbow для генерации радужного спектра на светодиодной ленте. Проблема в том, что я получаю случайный красный пиксель на полпути через желтую область. Я попробовал его на 3 разных Arduino nano и двух разных светодиодных лентах. Вот код:

#include <FastLED.h>

#define DATA_PIN 2
#define NUM_LEDS 114
CRGB leds[NUM_LEDS];

uint8_t hue = 0;

void setup() {
  Serial.begin(115200);
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);

  fill_rainbow( leds, NUM_LEDS, hue, 1);
  for(int i=0; i<NUM_LEDS; i++) {
    Serial.print(i);
    Serial.print(' ');
    Serial.print(leds[i].r);
    Serial.print(' ');
    Serial.print(leds[i].g);
    Serial.print(' ');
    Serial.println(leds[i].b);
  }

  CHSV hsv;
  CRGB rgb;
  //rgb = hsv;
}


void loop() {
  fill_rainbow( leds, NUM_LEDS, hue, 1);
  FastLED.show();
}

Здесь пиксель номер 60 получает rgb - код 160, 0, 0. Когда он должен иметь что-то вроде 160, 150, 0.

Самое странное, что я могу избавиться от этой проблемы двумя способами: либо раскомментировав строку rgb = hsv;, либо закомментировав функцию fill_rainbow в функции цикла. Это странное поведение наводит меня на мысль, что я каким-то образом испортил указатель или неправильно использовал функцию FastLED. Кроме того, функция fill_rainbow очень проста и опирается на FastLEDs hsv to rgb typecasting, что является еще одной причиной полагать, что я делаю что-то не так.

Так что помогите мне здесь, я делаю что-то глупое, или я обнаружил ошибку с преобразователем FastLEDs hsv в rgb?

, 👍3

Обсуждение

Вопросы с конкретной сторонней библиотекой лучше всего поднимать с автором библиотеки. [Поднимите здесь вопрос](https://github.com/FastLED/FastLED/issues)., @Majenko

@Majenko Конечно, но причина размещения вопроса в том, что я подозреваю, что сделал ошибку, как объяснено в последней части вопроса. Я надеюсь получить некоторую обратную связь о погоде, которую я допустил, прежде чем опубликовать проблему в разработчике., @Tehanu


2 ответа


1

Я просто скопировал ваш точный код и запустил его с 600 моими светодиодами. У меня тоже есть WS2812B, и я случайно использую тот же контакт для передачи данных.

Я не сталкивался с вашей проблемой с красным светодиодом. Затем я снова запустил его на своих светодиодах после добавления

 hue++;

в строке 33.

Единственная проблема, которую я вижу, заключается в том, что последние 30 светодиодов в конце радуги мерцают. Группы из 10 светодиодов самопроизвольно мигают одновременно, затем еще 10 и так далее. Однако это может быть проблемой с моими светодиодами, потому что 2 года назад они были самыми дешевыми, которые я мог найти на ebay. Тем не менее, код, кажется, отлично работает для меня!

,

0

Похоже, что это вызвано ошибкой компилятора при компиляции с параметром default-Os (optimize for size).

см. Выпуск : fill_rainbow() - Неожиданный красный пиксель #668

Обходным путем является изменение уровня оптимизации на-O3 для fill_rainbow, т. е.

#pragma GCC push_options       // Disable the size optimization
#pragma GCC optimize ("-O3")   // to prevent the “red pixel” problem
void fill_rainbow( struct CRGB * pFirstLED, int numToFill,
                  uint8_t initialhue,
                  uint8_t deltahue )
{
    CHSV hsv;
    hsv.hue = initialhue;
    hsv.val = 255;
    hsv.sat = 240;
    for( int i = 0; i < numToFill; i++) {
        pFirstLED[i] = hsv;
        hsv.hue += deltahue;
    }
}
#pragma GCC pop_options // Enable the prior optimization

Вам придется редактировать colorutils.cpp (файл, в котором fill_rainbow живет выше) в источнике FastLED в вашем каталоге \libraries.

,