Непрерывный ходовой свет с исчезающим следом
В примерах библиотеки 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);
}
@Madamadam, 👍2
Обсуждение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
- Передача цвета функции без использования определенного Adafruit_NeoPixel
- Быстрое изменение цвета в состоянии удержания
- Светодиодное кольцо с различными эффектами циклически
- Создать 7 сегментный дисплей из управляемых светодиодных полос для отображения цифр
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
Не могу следовать за тобой. Я думаю, что нет явного кода для обратного движения, это просто естественная вещь синусоиды: в ней есть изменение знака., @Madamadam
О, неправильное понимание, мой пример анимации называется "sinelon" и находится в файле примера с именем "DemoReel100"., @Madamadam
замените
beatsin16 ( 13, 0, NUM_LEDS-1 );
функцией, которая возвращает значение, которое увеличивается при последовательных вызовах функции... начинается с0
и сбрасывается в0
, когда достигаетNUM_LEDS
, @jsotola