Прошу совета с библиотекой FastLed

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Тему Ардуино начал осваивать недавно и в программировании не силён.

Если кратко - хочу сделать человеку на день рождения светодиодный акриловый светильник.
Специально для этого купил на GeatWall 4 адресных светодиодных модуля по 8 штук. Итого 32 светодиода.

По задумке, цвет свечения должен плавно перетекать из одного в другой.

В программировании не силён особо, поэтому на просторах интернета нашел вот такой код:

Код:
#include <FastLED.h>

// fadeTowardColor example code.
//
// Sample code that includes a function for fading one RGB color toward a target RGB color
// Also includes a function for fading a whole array of pixels toward a given color
//
// Both of these functions _modify_ the existing color, in place.
//
// All fades are done in RGB color space.
//
// Mark Kriegsman
// December 2016


#define NUM_LEDS 50
#define LED_PIN 3
#define LED_TYPE WS2811
#define COLOR_ORDER GRB

CRGB leds[NUM_LEDS];

void setup() {
  delay(3000); // sanity delay
  FastLED.addLeds<LED_TYPE,LED_PIN,COLOR_ORDER>(leds,NUM_LEDS);
}




// Helper function that blends one uint8_t toward another by a given amount
void nblendU8TowardU8( uint8_t& cur, const uint8_t target, uint8_t amount)
{
  if( cur == target) return;
 
  if( cur < target ) {
    uint8_t delta = target - cur;
    delta = scale8_video( delta, amount);
    cur += delta;
  } else {
    uint8_t delta = cur - target;
    delta = scale8_video( delta, amount);
    cur -= delta;
  }
}

// Blend one CRGB color toward another CRGB color by a given amount.
// Blending is linear, and done in the RGB color space.
// This function modifies 'cur' in place.
CRGB fadeTowardColor( CRGB& cur, const CRGB& target, uint8_t amount)
{
  nblendU8TowardU8( cur.red,   target.red,   amount);
  nblendU8TowardU8( cur.green, target.green, amount);
  nblendU8TowardU8( cur.blue,  target.blue,  amount);
  return cur;
}

// Fade an entire array of CRGBs toward a given background color by a given amount
// This function modifies the pixel array in place.
void fadeTowardColor( CRGB* L, uint16_t N, const CRGB& bgColor, uint8_t fadeAmount)
{
  for( uint16_t i = 0; i < N; i++) {
    fadeTowardColor( L[i], bgColor, fadeAmount);
  }
}


void loop()
{
  CRGB bgColor( 0, 15, 2); // pine green ?
 
  // fade all existing pixels toward bgColor by "5" (out of 255)
  fadeTowardColor( leds, NUM_LEDS, bgColor, 5);

  // periodically set random pixel to a random color, to show the fading
  EVERY_N_MILLISECONDS( 300 ) {
    uint16_t pos = random16( NUM_LEDS);
    CRGB color = CHSV( random8(), 255, 255);
    leds[ pos ] = color;
  }

  FastLED.show();
  FastLED.delay(10);
}
Вот ссылка: https://gist.github.com/kriegsman/d0a5ed3c8f38c64adcb4837dafb6e690

Этот код задаёт базовый цвет. А после рандомно зажигает отдельные светодиоды и те плавно возвращаются к базовому цвету.

Может кто-то подсказать, в каком направлении мне надо идти, чтобы переделать этот код в озвученное выше?
Спасибо.


P.S. Моя задумка сейчас такова:

При включении питания, плавно загорается белый цвет.

После этого в Loop c помощью FastLed функции EVERY_N_SECONDS (или же минут) мы берём переменную и рандомно задаём ей значение от 0-3. То бишь, к примеру, 4 цвета...

Далее, как я предполагаю,, используем выбор Switch и Case.
В зависимости от того, какой выпадет рандом, выбирается тот или иной цвет и устанавливается как "целевой" и "текущий" цвет начинает перетекать в "целевой".
 

poty

★★★★★★✩
19 Фев 2020
3,261
949
В самой библиотеке в папке примеров имеется пример рандомного задания палитры, "перетекание" - основная идея палитр, реализуется одной функцией и примеры также имеются в папке примеров библиотеки.
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Товарищи, расходимся, тема не актуальна - написал свой код с нуля, взяв способ смешения цвета из примера выше.. Работает идеально. Плюс прикрутил сторожевой таймер от Гайвера для защиты от зависаний.