Всем здравствуйте! Хочу использовать готовый алгоритм Алекса с шумом перлинга в другом своем проекте, но в нем использую только FastLED, плоховато еще разбираюсь в теме. microLED в коде напоминает костыль здоровому человеку. Попробовал его убрать, но так как до железки еще далеко, может кто проверить, будет оно так работать, как у меня?
Собственно ничего не изменилось, кроме замены типов mHSV на CHSV, mRGB на CRGB. Убран не исползованный FOR_j, strip.SetBrightness и strip.Show заменены на fastLED.show и т.д. Судя по всему эти типы совместимы.
Добавлю, что если мне надо по событиям обрывать выполнение эффекта, то наверное лучше всего обработку события положить в getFireColor?
Подтверждаю, код работает
C++:
// настройки ленты
#define NUM_LEDS 100 // количество светодиодов
#define LED_PIN 13 // пин ленты
// настройки пламени
#define HUE_GAP 21 // заброс по hue
#define FIRE_STEP 15 // шаг огня
#define HUE_START 0 // начальный цвет огня (0 красный, 80 зелёный, 140 молния, 190 розовый)
#define MIN_BRIGHT 70 // мин. яркость огня
#define MAX_BRIGHT 255 // макс. яркость огня
#define MIN_SAT 245 // мин. насыщенность
#define MAX_SAT 255 // макс. насыщенность
// для разработчиков
#include <FastLED.h>
//#define ORDER_GRB // порядок цветов ORDER_GRB / ORDER_RGB / ORDER_BRG
//#define COLOR_DEBTH 2 // цветовая глубина: 1, 2, 3 (в байтах)
// на меньшем цветовом разрешении скетч будет занимать в разы меньше места,
// но уменьшится и количество оттенков и уровней яркости!
// ВНИМАНИЕ! define настройки (ORDER_GRB и COLOR_DEBTH) делаются до подключения библиотеки!
//#include <microLED.h>
CRGB leds[NUM_LEDS]; // буфер ленты типа LEDdata (размер зависит от COLOR_DEBTH)
//microLED strip(leds, NUM_LEDS, LED_PIN); // объект лента
int counter = 0;
// ленивая жопа
#define FOR_i(from, to) for(int i = (from); i < (to); i++)
//#define FOR_j(from, to) for(int j = (from); j < (to); j++)
void setup() {
FastLED.setBrightness(255);
}
void loop() {
fireTick();
}
void fireTick() {
static uint32_t prevTime;
// двигаем пламя
if (millis() - prevTime > 20) {
prevTime = millis();
int thisPos = 0, lastPos = 0;
FOR_i(0, NUM_LEDS) {
leds[i] = getFireColor((inoise8(i * FIRE_STEP, counter)));
}
counter += 20;
FastLED.show();
}
}
// возвращает цвет огня для одного пикселя
CRGB getFireColor(int val) {
// чем больше val, тем сильнее сдвигается цвет, падает насыщеность и растёт яркость
return CHSV(
HUE_START + map(val, 0, 255, 0, HUE_GAP), // H
constrain(map(val, 0, 255, MAX_SAT, MIN_SAT), 0, 255), // S
constrain(map(val, 0, 255, MIN_BRIGHT, MAX_BRIGHT), 0, 255) // V
);
}
Добавлю, что если мне надо по событиям обрывать выполнение эффекта, то наверное лучше всего обработку события положить в getFireColor?
Подтверждаю, код работает