Непрерывный ходовой свет с исчезающим следом

В примерах библиотеки FastLED присутствует анимация движения точки взад-вперед с исчезающими следами (файл "DemoReel100", анимация "sinelon"). Как я могу изменить код, чтобы вместо того, чтобы двигаться назад, точка снова начиналась со светодиода № 1; поэтому при использовании светодиодного кольца движение непрерывное и круговое. Так как код будет частью более сложного проекта с чтением состояний кнопок и т.д., код анимации должен быть неблокирующим, т.е. delay() не вариант.

void sinelon()
{
fadeToBlackBy( leds, NUM_LEDS, 20);
int pos = beatsin16( 13, 0, NUM_LEDS-1 );
leds[pos] += CHSV( gHue, 255, 192);
}

, 👍2

Обсуждение

Не могу следовать за тобой. Я думаю, что нет явного кода для обратного движения, это просто естественная вещь синусоиды: в ней есть изменение знака., @Madamadam

О, неправильное понимание, мой пример анимации называется "sinelon" и находится в файле примера с именем "DemoReel100"., @Madamadam

замените beatsin16 ( 13, 0, NUM_LEDS-1 ); функцией, которая возвращает значение, которое увеличивается при последовательных вызовах функции... начинается с 0 и сбрасывается в 0, когда достигает NUM_LEDS, @jsotola


1 ответ


1

Если вы посмотрите на окружающие методы, то увидите, что 'fadeToBlackBy' придаст эффект затухания всему, что вы вводите. Вам нужно будет найти метод 'beatsin16', а затем отредактировать его самостоятельно, чтобы он не t приходит в норму, но перезапускает счетчик при первом светодиоде. (подсказка: фазовое_смещение)

Вы найдете фрагмент кода, который хотите скопировать, в lib8tion.h

/// beatsin16 генерирует 16-битную синусоиду с заданным BPM,
/// который колеблется в заданном диапазоне.
LIB8STATIC uint16_t beatsin16( accum88 beats_per_minute, uint16_t lowest = 0, uint16_t highest = 65535,
                               uint32_t timebase = 0, uint16_t phase_offset = 0)
{
    uint16_t beat = beat16( beats_per_minute, timebase);
    uint16_t beatsin = (sin16( beat + phase_offset) + 32768);
    uint16_t rangewidth = highest - lowest;
    uint16_t scaledbeat = scale16( beatsin, rangewidth);
    uint16_t result = lowest + scaledbeat;
    return result;
}
,

Спасибо, изменение метода beatsin16 — хорошая идея, но возиться с фазой не получилось. Я не очень разбираюсь в математике функции синуса. Не могли бы вы предоставить больше информации?, @Madamadam

Вы не должны изменять функцию так сильно, как дублировать ее и называть «beatshoot16» или что-то подобное. Функция синуса — это то, что придает свету «ускорение» и «замедление» движения. если вам это не нужно, вам может быть проще переписать функцию, чтобы просто постепенно появлялся световой сигнал через полосу Что касается смещения фазы, поищите в Google изображения «смещение фазы синусоидальной волны». Изменение значения смещения просто изменяет синхронизацию, вам нужно перезапустить синусоидальную волну, если смещение находится в определенном диапазоне (когда оно от пи до 2 пи, измените его на ноль на пи)., @What The J