// based on https://gist.github.com/kriegsman/5adca44e14ad025e6d3b
#include "FastLED.h"
// Matrix size
#define NUM_ROWS 16
#define NUM_COLS 16
#define DATA_PIN 2
#define BRIGHTNESS 200
#define NUM_LEDS NUM_ROWS * NUM_COLS
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
// Define the array of leds
CRGB leds[NUM_LEDS];
byte rain[NUM_LEDS];
//byte counter = 1;
int speed = 1;
const uint8_t kMatrixWidth = 16;
const uint8_t kMatrixHeight = 16;
const bool kMatrixSerpentineLayout = false;
void setup() {
//delay(1000);
FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS); //setCorrection(TypicalLEDStrip);
//FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
// set master brightness control
FastLED.setBrightness(BRIGHTNESS);
raininit();
//Serial.begin(115200);
// Serial.println("Hello, I'm in a terminal!");
}
void loop() {
EVERY_N_MILLISECONDS(80) {
updaterain();
FastLED.show();
}
EVERY_N_MILLISECONDS(30) {
changepattern();
}
} //loop
void changepattern () {
int rand1 = random16 (NUM_LEDS);
int rand2 = random16 (NUM_LEDS);
if ((rain[rand1] == 1) && (rain[rand2] == 0) ) //simple get two random dot 1 and 0 and swap it,
{
rain[rand1] = 0; //this will not change total number of dots
rain[rand2] = 1;
}
} //changepattern
void raininit() { //init array of dots. run once
for (int i = 0; i < NUM_LEDS; i++) {
if (random8(10) == 0) {
rain[i] = 1; //random8(20) number of dots. decrease for more dots
}
else {
rain[i] = 0;
}
}
} //raininit
void updaterain() {
for (byte i = 0; i < NUM_COLS; i++) {
for (byte j = 0; j < NUM_ROWS; j++) {
byte layer = rain[XY(i, ((j + speed + NUM_ROWS) % NUM_ROWS))]; //fake scroll based on shift coordinate
// random8(2) add glitchy look
if (layer) {
leds[XY(i,j)] = CHSV(110, 255, 255);
// Serial.print(NUM_COLS-1-i);Serial.print(" ");
// Serial.print(NUM_ROWS-1-j);Serial.print(" ");
// Serial.print(speed);Serial.println(" ");
}
}
}
// Serial.println("Update terrain");
speed ++;
fadeToBlackBy(leds, NUM_LEDS, 80);
//blurRows(leds, NUM_COLS, NUM_ROWS, 16); //if you want
} //updaterain
uint16_t XY( uint8_t x, uint8_t y)
{
uint16_t i;
if( kMatrixSerpentineLayout == false) {
i = (y * kMatrixWidth) + x;
}
if( kMatrixSerpentineLayout == true) {
if( y & 0x01) {
// Odd rows run backwards
uint8_t reverseX = (kMatrixWidth - 1) - x;
i = (y * kMatrixWidth) + reverseX;
} else {
// Even rows run forwards
i = (y * kMatrixWidth) + x;
}
}
return i;
}