FastLED fill_rainbow - Неожиданный красный пиксель
Я использую встроенную функцию 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?
@Tehanu, 👍3
Обсуждение2 ответа
Я просто скопировал ваш точный код и запустил его с 600 моими светодиодами. У меня тоже есть WS2812B, и я случайно использую тот же контакт для передачи данных.
Я не сталкивался с вашей проблемой с красным светодиодом. Затем я снова запустил его на своих светодиодах после добавления
hue++;
в строке 33.
Единственная проблема, которую я вижу, заключается в том, что последние 30 светодиодов в конце радуги мерцают. Группы из 10 светодиодов самопроизвольно мигают одновременно, затем еще 10 и так далее. Однако это может быть проблемой с моими светодиодами, потому что 2 года назад они были самыми дешевыми, которые я мог найти на ebay. Тем не менее, код, кажется, отлично работает для меня!
Похоже, что это вызвано ошибкой компилятора при компиляции с параметром 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.
- Управление светодиодной лентой с помощью ИК-контроллера с помощью Arduino
- 7-сегментный дисплей с WS2312B и FastLED
- Улучшенное циклическое переключение цветов RGB.
- Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Как управлять встроенными светодиодами Arduino Nano 33 BLE Sense?
- Адресная RGB-полоса работает по отдельности, но не может настроить все светодиоды на полностью белый цвет.
- Как изменить яркость светодиодного освещения?
Вопросы с конкретной сторонней библиотекой лучше всего поднимать с автором библиотеки. [Поднимите здесь вопрос](https://github.com/FastLED/FastLED/issues)., @Majenko
@Majenko Конечно, но причина размещения вопроса в том, что я подозреваю, что сделал ошибку, как объяснено в последней части вопроса. Я надеюсь получить некоторую обратную связь о погоде, которую я допустил, прежде чем опубликовать проблему в разработчике., @Tehanu