Пламя с шумом Перлинга на адресной ленте

kotto

✩✩✩✩✩✩✩
22 Фев 2020
14
1
Всем здравствуйте! Хочу использовать готовый алгоритм Алекса с шумом перлинга в другом своем проекте, но в нем использую только FastLED, плоховато еще разбираюсь в теме. microLED в коде напоминает костыль здоровому человеку. Попробовал его убрать, но так как до железки еще далеко, может кто проверить, будет оно так работать, как у меня?

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
         );
}
Собственно ничего не изменилось, кроме замены типов mHSV на CHSV, mRGB на CRGB. Убран не исползованный FOR_j, strip.SetBrightness и strip.Show заменены на fastLED.show и т.д. Судя по всему эти типы совместимы.

Добавлю, что если мне надо по событиям обрывать выполнение эффекта, то наверное лучше всего обработку события положить в getFireColor?

Подтверждаю, код работает
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
574
microLED это костыль, который помогает подключить к Нано примерно в два раза больше ленты, чем потянет FastLED. Также микролед обеспечивает бОльшую частоту обновления ленты чем FastLED, что критично на длинных лентах и плавных эффектах