//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 8000
 
// 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() {

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