FastLED проблема int + float

Я работаю над кодом на основе примера PaletteCrossfade.ino. Но скорость движения оказалась слишком высокой. Вот как это указано:

  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; /* motion speed */
  FillLEDsFromPaletteColors(startIndex);
  FastLED.show();
  FastLED.delay(1000 / UPDATES_PER_SECOND);
}

void FillLEDsFromPaletteColors( uint8_t colorIndex) {
  uint8_t brightness = 255;
  for( int i = 0; i < NUM_LEDS; i++) {
    leds[i] = ColorFromPalette( currentPalette, colorIndex + sin8(i*16), brightness);
colorIndex += 3;

Поскольку startIndex определён в uint8_t, он не может быть меньше 1. Поэтому я использовал float и установил его равным 0,2 в своём коде. Вроде бы это сработало, но анимация замедлилась. Однако я не уверен, как это значение float добавляется в функцию ColorFromPalette.

В документации указано:

CRGB ColorFromPalette (const CRGBPalette16 &pal, uint8_t index, uint8_t яркость=255, TBLendType blendType=LINEARBLEND)

Насколько я понимаю, он принимает только целые числа, а также sin8, основанный на целых числах, прибавляемый к значению с плавающей точкой. Что же именно происходит? Жизнеспособен ли этот метод, или есть более эффективный способ замедлить анимацию?

Я думаю о том, чтобы добавить задержку на основе millis() и увеличивать цветовой индекс только каждые 2–3 секунды или около того.

, 👍1

Обсуждение

Почему бы вам просто не использовать меньшее значение UPDATES_PER_SECOND?, @KIIV

Я пробовал, но даже при 30 это быстрее, чем установка индекса на 0,1, а также предотвращает более быструю анимацию., @Nah

«Но я обнаружил, что скорость движения слишком высокая. Об этом говорится здесь:» «а также предотвращает более быструю анимацию». Я не понимаю, чего вы хотите?, @Code Gorilla

Измените FastLED.delay(1000 / UPDATES_PER_SECOND); на FastLED.delay(1000); и сообщите мне, что произойдет, или измените #define UPDATES_PER_SECOND 100 на #define UPDATES_PER_SECOND 1, @Martynas


2 ответа


1

Похоже, ваш код заполняет подсветку цветом и меняет её каждую n-ную долю секунды. Вы можете изменить этот интервал с 1 мс до 2^16 мс (что составляет 65 секунд), просто изменив значение FastLED.delay().

sin8() может возвращать число с плавающей точкой или, подозреваю, целое число, но colourIndex — это uint8_t, то есть целое число. Функция просто выбирает цвет на основе определённой схемы. Если переданное в функцию значение — число с плавающей точкой, например, 1,611, оно будет преобразовано в целое число, взяв только целую часть, в данном случае 1. Функция не округляет.

Непонятно, что вы пытаетесь сделать.

Если вы пытаетесь замедлить скорость смены цвета светодиодов, вам необходимо изменить оператор задержки.

Если вы хотите сгладить переход между цветами, вам нужно внести изменения в область оператора sin8, но то, на что вы его измените, будет зависеть от того, чем загружена ваша палитра.

Надеюсь, это поможет. Если нет, пожалуйста, попробуйте описать, чего именно вы пытаетесь достичь.

,

0

Чтобы изменить частоту обновления, вам придется ее изменить.

В примере ColourPalette у вас есть два варианта:

1-й:

СТРОКА 10

#define UPDATES_PER_SECOND 100 // большее число означает больше кадров в секунду

2-й:

СТРОКА 58

FastLED.delay(1000 / UPDATES_PER_SECOND); // изменим на:
FastLED.delay(2000); //2000 мс означает 0,5 кадра в секунду или 1 кадр каждые две секунды
,