//Perlin noise fire procedure 
//16x16 rgb led matrix demo
//Yaroslaw Turbin, 22.06.2020 

#include "FastLED.h"
 
// Matrix size
#define NUM_ROWS 16
#define NUM_COLS 16
#define NUM_LEDS NUM_ROWS * NUM_COLS
 
// LEDs pin
#define DATA_PIN 5   
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
 
// LED brightness
#define BRIGHTNESS 255
#define MAX_POWER_MILLIAMPS 700 
 
// Define the array of leds
CRGB leds[NUM_LEDS];

// DEFINE_GRADIENT_PALETTE(firepal) { // белая, желтая, красная палитра
//   0,  0,  0,  0, //black
//   32,  255,  0,  0, // red
//   190,  255,  255,  0, //yellow
//   255,  255,  255,  255 // white
// };

DEFINE_GRADIENT_PALETTE(firepal) { // красная палитра
  0,  0,  0,  0,     //black
  128,  255,  0,  0, // red
  255,  255,  0,  0  // red
};

CRGBPalette16 myPal = firepal;


void setup() {
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setMaxPowerInVoltsAndMilliamps(5, MAX_POWER_MILLIAMPS);
  FastLED.setBrightness(BRIGHTNESS);
}
 
void loop() {
  int scalexy = 60;  // масштаб
  float speed = 1.2; //скорость 

  float a = millis()*speed;
  for (int i = 0; i < NUM_COLS; i++) {
    for (int j = 0; j < NUM_ROWS; j++) {
      leds[XY(i, j)] = 
      ColorFromPalette(myPal, qsub8(inoise8(i * scalexy, j * scalexy + (int)a, (int)a / 2), abs8(j - (NUM_ROWS - 1)) * 255 / (NUM_ROWS + 2)), 255);
    }
  }
  FastLED.show();
}

uint8_t XY (uint8_t x, uint8_t y) {  //матрица идет от нижнего левого угла вправо и дальше зигзагом 

  const uint8_t XYTable[] = {
   255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240,
   224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
   223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208,
   192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
   191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176,
   160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
   159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144,
   128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
   127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112,
    96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
    95,  94,  93,  92,  91,  90,  89,  88,  87,  86,  85,  84,  83,  82,  81,  80,
    64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
    63,  62,  61,  60,  59,  58,  57,  56,  55,  54,  53,  52,  51,  50,  49,  48,
    32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
    31,  30,  29,  28,  27,  26,  25,  24,  23,  22,  21,  20,  19,  18,  17,  16,
     0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15
  };

  uint8_t i = (y * NUM_COLS) + x;
  uint8_t j = XYTable[i];
  return j;
}

// uint16_t XY (uint8_t x, uint8_t y) { return (y * NUM_COLS + x);}  // для эмулятора