#include <FastLED.h>
#define WIDTH 16 //Ширина матрицы
#define HEIGHT 16 //Высота матрицы
#define LED_PIN 13 //Пин подключения матрицы на ардуино
#define NUM_LEDS (WIDTH * HEIGHT) //Общее количество светодиодов
#define BRIGHTNESS 255 //Яркость (0-255)
#define INTENSITY 48 //Интенсивность (0-50)
#define LEN_LINE 6 //Длина линии
CRGB leds[NUM_LEDS]; //Массив для светодиодов
void setup() {
FastLED.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
randomSeed(analogRead(0));
}
void NextStep() { //Функция обновления состояния доски
for (char i = 0; i < HEIGHT; i++) {
for (char j = 0; j < WIDTH; j++) {
if (leds[XY(i, j)] != CRGB::Black) {
if (i != 0)
leds[XY(i - 1, j)] = leds[XY(i, j)];
if (leds[XY(i, j)].g < 70 / LEN_LINE)
leds[XY(i, j)].g = 0;
else
leds[XY(i, j)].g -= 70 / LEN_LINE;
}
}
}
for (char i = 0; i < random(1, 4); i++) {
if (random(50 - INTENSITY) == 0) { //Случайная точка начала линии
char rand_wigth = random(WIDTH);
if (leds[XY(HEIGHT - 1, rand_wigth)] == CRGB::Black && leds[XY(HEIGHT - 1, rand_wigth + 1)] == CRGB::Black && leds[XY(HEIGHT - 1, rand_wigth - 1)] == CRGB::Black )
leds[XY(HEIGHT - 1, rand_wigth)] = CRGB(0, 100, 0);
}
}
}
int XY(char x, char y) { //Функция преобразования координат
return ((WIDTH - x) * WIDTH - (HEIGHT - y));
}
void loop() {
FastLED.show();
delay(80);
NextStep(); //Переход к следующему поколению
}