Эффект FireLinear

pavelpodkladov

✩✩✩✩✩✩✩
29 Сен 2020
1
0
Добрый день. Подскажите кто знает. как проще всего развернуть огонь в другую сторону на ленте. И как передвинуть огонь, чтобы он был не с 0 диода а с любого. И можно ли на одном отрезке ленты сделать 2 огня?

// настройки ленты
#define NUM_LEDS 25 // количество светодиодов
#define LED_PIN 13 // пин ленты
#define FIRE_PALETTE 0 // разные типы огня (0 - 3). Попробуй их все! =)

// для разработчиков
#include <FastLED.h>
CRGBPalette16 gPal;

#define ORDER_GRB // порядок цветов ORDER_GRB / ORDER_RGB / ORDER_BRG
#define COLOR_DEBTH 2 // цветовая глубина: 1, 2, 3 (в байтах)
// на меньшем цветовом разрешении скетч будет занимать в разы меньше места,
// но уменьшится и количество оттенков и уровней яркости!

// ВНИМАНИЕ! define настройки (ORDER_GRB и COLOR_DEBTH) делаются до подключения библиотеки!
#include <microLED.h>

LEDdata leds[NUM_LEDS]; // буфер ленты типа LEDdata (размер зависит от COLOR_DEBTH)
microLED strip(leds, NUM_LEDS, LED_PIN); // объект лента

// ленивая жопа
#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() {
strip.setBrightness(255);
if (FIRE_PALETTE == 0) gPal = HeatColors_p;
else if (FIRE_PALETTE == 1) gPal = CRGBPalette16( CRGB::Black, CRGB::Red, CRGB::Yellow, CRGB::White);
else if (FIRE_PALETTE == 2) gPal = CRGBPalette16( CRGB::Black, CRGB::Blue, CRGB::Aqua, CRGB::White);
else if (FIRE_PALETTE == 3) gPal = CRGBPalette16( CRGB::Black, CRGB::Red, CRGB::White);
}

void loop() {
fireTick();
}

// ****************************** ОГОНЬ ******************************
// COOLING: How much does the air cool as it rises?
// Less cooling = taller flames. More cooling = shorter flames.
// Default 55, suggested range 20-100
#define COOLING 55

// SPARKING: What chance (out of 255) is there that a new spark will be lit?
// Higher chance = more roaring fire. Lower chance = more flickery fire.
// Default 120, suggested range 50-200.
#define SPARKING 120

void fireTick() {
static uint32_t prevTime;

// задаём направление движения огня
if (millis() - prevTime < 30) {
prevTime = millis();
random16_add_entropy( random());
Fire2012WithPalette(); // run simulation frame, using palette colors
strip.show();
}
}

void Fire2012WithPalette()
{
// Array of temperature readings at each simulation cell
static byte heat[NUM_LEDS];

// Step 1. Cool down every cell a little
for ( int i = 0; i < NUM_LEDS; i++) {
heat = qsub8( heat, random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
}

// Step 2. Heat from each cell drifts 'up' and diffuses a little
for ( int k = NUM_LEDS - 1; k >= 2; k--) {
heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
}

// Step 3. Randomly ignite new 'sparks' of heat near the bottom
if ( random8() < SPARKING ) {
int y = random8(7);
heat[y] = qadd8( heat[y], random8(160, 255) );
}

// Step 4. Map from heat cells to LED colors
for ( int j = 0; j < NUM_LEDS; j++) {
// Scale the heat value from 0-255 down to 0-240
// for best results with color palettes.
byte colorindex = scale8(heat[j], 240);
strip.setHEX(j, getPixColor(ColorFromPalette(gPal, colorindex)));
}
}

uint32_t getPixColor(CRGB thisPixel) {
return (((uint32_t)thisPixel.r << 16) | (thisPixel.g << 8) | thisPixel.b);
}