#include <FastLED.h>
// Definim pinii și lungimea benzii
#define NUM_LEDS 100 // Schimbă numărul în funcție de câte LED-uri ai în simulator
#define DATA_PIN 15 // Pinul DIN pe care l-am discutat anterior (GPIO 2)
// Creăm "vectorul" care va stoca datele pentru fiecare LED
CRGB leds[NUM_LEDS];
void setup() {
// Spunem microprocesorului ce fel de bandă folosim și unde este conectată
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
// Setăm o luminozitate generală (0-255)
FastLED.setBrightness(255);
}
void loop() {
// Viteza valului în Bătăi pe Minut (BPM)
uint8_t speed_bpm1 = 20;
uint8_t speed_bpm2 = 30;
// Generăm o variabilă de timp continuă. beat8() returnează o valoare de la 0 la 255
// care crește constant, sincronizată cu viteza BPM stabilită.
uint8_t time_offset1 = beat8(speed_bpm1);
uint8_t time_offset2 = beat8(speed_bpm2);
// Trecem prin fiecare LED de pe bandă pentru a-i calcula luminozitatea
for (int i = 0; i < NUM_LEDS; i++) {
// Formula fizică a undei: y(x,t) = sin(t + x)
// Înmulțim 'i' cu un număr (ex. 15) pentru a seta "lungimea" valului.
// Un număr mai mare = valuri mai scurte și mai dese.
uint8_t wave_math1 = time_offset1 + (i * 15);
uint8_t wave_math2 = time_offset2 + (i * 15);
// Trecem valoarea prin funcția sin8() pentru a obține curba fină a valului
uint8_t brightness = (sin8(wave_math1) + sin8(wave_math2))/2;
// Aplicăm culoarea. Folosim CHSV (Hue, Saturation, Value) pentru a controla ușor strălucirea
// Hue 140 este un albastru-cyan (culoarea apei)
// Saturation 255 este culoarea plină
// Value este luminozitatea dictată de valul nostru matematic (brightness)
leds[i] = CHSV(140, 255, brightness);
}
// Trimitem datele către bandă pentru a aprinde fizic/simulat LED-urile
FastLED.show();
// O mică pauză de 20 milisecunde pentru a obține aprox 50 cadre pe secundă (FPS)
delay(20);
}