//F_lying fibonacci 256
//Fastled fibonacci 256 RGB leds demo
//Yaroslaw Turbin, 28.01.2020
//https://vk.com/ldirko
//https://www.reddit.com/user/ldirko/

#include "FastLED.h"

// Matrix size
#define NUM_ROWS 20
#define NUM_COLS 20
// LEDs pin
#define DATA_PIN 3
// LED brightness
#define BRIGHTNESS 255

// Define the array of leds
CRGB leds[257];


void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, 256);
  FastLED.setBrightness(BRIGHTNESS);
}

void loop() {
  static byte hue = 0;
  EVERY_N_MILLISECONDS(30) {
    hue++;  //30 - speed of hue change
  }

  byte x1 = beatsin8 (18, 0, (NUM_COLS - 1));
  byte x2 = beatsin8 (23, 0, (NUM_COLS - 1));
  byte x3 = beatsin8 (27, 0, (NUM_COLS - 1));
  byte x4 = beatsin8 (31, 0, (NUM_COLS - 1));
  byte x5 = beatsin8 (33, 0, (NUM_COLS - 1));

  byte y1 = beatsin8 (20, 0, (NUM_ROWS - 1));
  byte y2 = beatsin8 (26, 0, (NUM_ROWS - 1));
  byte y3 = beatsin8 (15, 0, (NUM_ROWS - 1));
  byte y4 = beatsin8 (27, 0, (NUM_ROWS - 1));
  byte y5 = beatsin8 (30, 0, (NUM_ROWS - 1));

  CRGB color = CHSV (hue, 255, BRIGHTNESS);

  fadeToBlackBy (leds, 256, 40 );

  mydrawLine(x1, y1,  x2, y2, color, 1);
  mydrawLine(x2, y2,  x3, y3, color, 1);
  mydrawLine(x2, y2,  x4, y4, color, 1);
  mydrawLine(x3, y3,  x4, y4, color, 1);
  mydrawLine(x3, y3,  x1, y1, color, 1);
  mydrawLine(x4, y4,  x1, y1, color, 1);

  FastLED.show();

} //loop

void mydrawLine (byte x, byte y, byte x1, byte y1, CRGB color, bool dot) {  // my ugly line draw function )))

  byte xsteps = abs8(x - x1) + 1;
  byte ysteps = abs8(y - y1) + 1;
  byte steps =  xsteps >= ysteps ? xsteps : ysteps;

  for (byte i = 1; i <= steps; i++) {
    byte dx = lerp8by8 (x, x1, i * 255 / steps);
    byte dy = lerp8by8 (y, y1, i * 255 / steps);
    leds[XY(dx, dy)] += color;    // change to += for brightness look
  }

  if (dot) {     //add white point at the ends of line
    leds[XY(x, y)] += CRGB ::White;
    leds[XY(x1, y1)] += CRGB ::White;
  }
}


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