FastLED эффект смены оттенков по своей палитре

Shuster

★✩✩✩✩✩✩
4 Сен 2021
50
11
Добрый вечер.

Нужна смена палитры разными эффектами.

Подскажите есть ли готовые функции по поочерёдной смене оттенка заданной палитры?
Не по встроенным палитрам FasLED-а.

К примеру берём палитру Guaraci 2 Color Palette (color-hex.com).
Добавляем её в массив paletteGuaraci[] PROGMEM.
И передаём функции что-то типа showPalette(&paletteGuaraci);
Или если нужна смена палитры другим эффектом showPaletteLikeLava(&paletteGuaraci);

Что-то есть похожее?
 

Сотнег

★★★★★★★
15 Янв 2020
4,357
1,493
@Shuster,
готовая функция для поочерёдной смены оттенка:
colorindex++;
готовая функция для выбора цвета из палитры:
leds[pixel_index] = ColorFromPalette(*curPalette, colorindex);
 
Изменено:
  • Лойс +1
Реакции: Shuster

Shuster

★✩✩✩✩✩✩
4 Сен 2021
50
11
Если менять hue++; то меняется только первое число (hsv)
А как быть, если в оттенках нужно менять и насыщенность и яркость?

при чём поочерёдная смена не заранее заданных оттенков
 

Сотнег

★★★★★★★
15 Янв 2020
4,357
1,493
@Shuster,
если использовать функцию ColorFromPalette,
тогда будет браться цвет из палитры по его порядковому номеру,
а не по оттенку.

В палитре 256 цветов. У каждого из них собственная яркость и насыщенность.

ПС: заменил hue на colorindex.
 

Shuster

★✩✩✩✩✩✩
4 Сен 2021
50
11
Подробнее опишу на примере палитры, что указал в первом посте.
Имеется палитра.
C++:
#ffe496
#a2c4c9
#93c47d
#783f04
#660000
Создаю
C++:
const TProgmemRGBPalette16 paletteGuaraci FL_PROGMEM =
{
        0xffe496,
        0xa2c4c9,
        0x93c47d,
        0x783f04,
        0x660000
};

Мне нужно, чтобы светился нулевой оттенок (ffe496).
C++:
fillAll(ColorFromPalette(d.noise.currentPalette, 0));
Через допустим 3 секунды, чтобы нулевой оттенок (ffe496) изменился на первый оттенок (a2c4c9), но не просто переключился, а с каким-то эффектом, затем опять 3 секунды первый оттенок и смена с помощью такого же эффекта во второй оттенок и т.д. по кругу.

@Сотнег
p.s. Кстати почему не меняется цвет, когда изменяю число colorindex?
fillAll(ColorFromPalette(d.noise.currentPalette, 1)); // За запуск только первый оттенок из палитры.
 

Сотнег

★★★★★★★
15 Янв 2020
4,357
1,493
@Shuster,
хотя вы использовали для создания палитры 5 цветов,
в палитре всё равно их 256.
И ваш номер 0 мало отличается от вашего номера 1.
Палитры градиентные. В этом и смысл.

"Эффектом переключения цвета" в вашем случае будет логично плавное его изменение.

EVERY_N_SECONDS(3){
changeShift = 51;
}
while(changeShift--){
fillAll(ColorFromPalette(d.noise.currentPalette, ++color_index));
}
 
Изменено:
  • Лойс +1
Реакции: Shuster

Shuster

★✩✩✩✩✩✩
4 Сен 2021
50
11
хотя вы использовали для создания палитры 5 цветов,
в палитре всё равно их 256.
И ваш номер 0 мало отличается от вашего номера 1.
Палитры градиентные. В этом и смысл.
А где подробнее об этом почитать?


Немного понял, как работает.

Вот допустим есть палитра Vintage Cherry Color Palette (color-hex.com)
В ней всего 2 разных оттенка (242,71,77) и (255,193,204);

C++:
DEFINE_GRADIENT_PALETTE(VintageCherry_gp){
    0, 242, 71, 77,
    127, 255, 193, 204,
    255, 242, 71, 77};
Захардкодил 0 и 127 в этих моментах по 3 секунды не изменяю палитру. Начинает быть похоже на то что я хочу. Ну потом смену эту нужно делать с помощью какого-то эффекта, но уже вроде направление правильное.

А вот достать 0 и 127 из VintageCherry_gp не могу ни через pgm_read_ ни напрямую.
 

Сотнег

★★★★★★★
15 Янв 2020
4,357
1,493
@Shuster,
там есть строчка
if (color_index == 51)
Поменяйте на 127, будет вам средний цвет мигать.
 

Shuster

★✩✩✩✩✩✩
4 Сен 2021
50
11
@Сотнег, я вот что имею в виду.

Мне нужно вытащить 0, 127, 255 из массива VintageCherry_gp
C++:
DEFINE_GRADIENT_PALETTE(VintageCherry_gp){
    0, 242, 71, 77,
    127, 255, 193, 204,
    255, 242, 71, 77};
То есть код приблизительно вот такой

Вызов функции с передачей нужной палитры:
slowChangePalette(VintageCherry_gp);
slowChangePalette(gr65_hult_gp);
C++:
DEFINE_GRADIENT_PALETTE(VintageCherry_gp){
    0, 242, 71, 77,
    127, 255, 193, 204,
    255, 242, 71, 77};

DEFINE_GRADIENT_PALETTE(gr65_hult_gp){
    0, 1, 124, 109,
    1, 247, 176, 247,
    48, 255, 136, 255,
    89, 220, 29, 226,
    160, 7, 82, 178,
    216, 1, 124, 109,
    255, 1, 124, 109};

void slowChangePalette(CRGBPalette16 palette)
{
    // Здесь нужно получить значения позиций оттенка для дальнейшего кода
    // для VintageCherry_gp: 0, 127, 255
    // для gr65_hult_gp: 0, 1, 48, 89, 160, 216, 255

    // Тут код эффекта
}
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@Shuster, Можете объявлять свои палитры и паковать их в структуры, а оттуда уже получать доступ как к палитре, так и к нужным вам индексам цвета. Работать будет универсально, с палитрами разных размеров. Главное по размеру проверять, не вышли ли вы за нужный индекс.
C++:
struct CustomPalette {            // Создаем структуру, которая будет хранить указатель на палитру и размер
  TProgmemRGBGradientPalette_byte *palette;
  uint8_t size;
};
DEFINE_GRADIENT_PALETTE(myPalette){
    0, 242, 71, 77,
    127, 255, 193, 204,
    255, 242, 71, 77};

CustomPalette myPaletteWithSize = {myPalette, 3};  // инициализируем свою палитру с размером
myPaletteWithSize.palette                           // получаем доступ через структуру к самой палитре
myPaletteWithSize.size                               // получаем доступ к ее размеру
 

ae485

✩✩✩✩✩✩✩
29 Апр 2022
21
0
с переключением палитр можно работать через массив указателей.

C++:
const TProgmemRGBPalette16 *pal_arr[] = {
  &PartyColors_p,
  &RainbowColors_p,
  &RainbowStripeColors_p};


byte palette=0;
byte countpal = sizeof(pal_arr)/sizeof(TProgmemRGBPalette16 *);
CRGB color = ColorFromPalette(*pal_arr[palette], index, bri);
 
Изменено: