/* To do
[ ] mode 2: b/w glitching
[ ] mode 3: some color
[ ] mode 4: add FO
[ ] when sleeping add timing for blinking on-board NeoPixel to draw enough current to keep USB battery on
*/
#include <Adafruit_NeoPixel.h> // LED strip
// LED strip 1
#define NUM_DOTSTARS 16
Adafruit_NeoPixel dotstars(NUM_DOTSTARS, /*data*/13, NEO_KHZ800 + NEO_GRB);
#define ENABLE_DOTSTARS
// NeoPixels (optional 4x8 array for fiber optics, and 1 super-bright LED)
#define NUM_NEOPIXELS 15 // 0 or 32
Adafruit_NeoPixel neopixels(NUM_NEOPIXELS+1, /*data*/12, NEO_KHZ800 + NEO_GRB);
#define ENABLE_NEOPIXELS
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
#define SWITCH_PIN 4
#define ENABLE_SERIAL
void setup(void)
{
#ifdef ENABLE_SERIAL
// setup serial
Serial.begin(115200);
//while ( !Serial ) delay(10); // for nrf52840 with native usb
Serial.println(F("LED_blink"));
Serial.println(F("---------"));
#endif
// setup LED dotstars
dotstars.begin();
dotstars.setBrightness(255);
dotstars.show(); // Turn all LEDs off ASAP
// setup LED neopixels
neopixels.begin();
neopixels.setBrightness(255);
neopixels.show(); // Turn all LEDs off ASAP
#if 0 // replace with startup routine
for (int i=0; i<NUM_DOTSTARS; i++)
dotstars.setPixelColor(i, dotstars.gamma32(dotstars.Color((i&1)?150:50, (i&2)?150:50, (i&4)?150:50)));
dotstars.show(); // Update dotstars with new contents
#ifdef ENABLE_NEOPIXELS
for (int i=0; i<NUM_NEOPIXELS; i++)
neopixels.setPixelColor(i, neopixels.gamma32(neopixels.Color((i&1)?150:50, (i&2)?150:50, (i&4)?150:50)));
neopixels.show(); // Update neopixels with new contents
#endif
#endif
pinMode(SWITCH_PIN, INPUT_PULLUP);
}
int level = 4;
int color_wave_start = 0;
int color_wave_end = 0;
uint32_t color_wave_color = dotstars.Color(255, 0, 0);
int super = 0;
void loop(void)
{
// do things with the LEDs
uint32_t black = dotstars.Color( 0, 0, 0);
uint32_t gray = dotstars.Color(128, 128, 128);
uint32_t white = dotstars.Color(255, 255, 255);
// use? dotstars.gamma32()
int glitch_height = random(NUM_DOTSTARS);
for (int i=0; i<NUM_DOTSTARS; i++)
{
bool on = (i <= glitch_height) && (level > random(10));
int color_range = (level > 2) ? 128 : 16;
uint32_t color = dotstars.Color(random(color_range), random(color_range), random(color_range));
dotstars.setPixelColor(i, on ? (gray + color) : black);
}
if (color_wave_end > 0)
{
int start_bounded = max(0, color_wave_start);
int end_bounded = min(NUM_DOTSTARS, color_wave_end);
for (int i=start_bounded; i<end_bounded; i++)
dotstars.setPixelColor(i, color_wave_color);
color_wave_end++;
color_wave_start++;
if (color_wave_start >= NUM_DOTSTARS)
color_wave_end = 0; // stop the wave when start leaves range
}
else
{
if (random(25) == 1)
{
color_wave_start = 0 - random(6); // set the length of the wave
color_wave_end = 1; // start the wave
switch (level)
{
case 2:
color_wave_color = dotstars.Color(64 + random(96), 64 + random(96), 64 + random(96));
break;
case 3:
case 4:
color_wave_color = dotstars.Color(128 + random(128), 128 + random(128), 128 + random(128));
break;
}
}
}
dotstars.show(); // Update dotstars with new contents
// FO
for (int i=0; i<NUM_NEOPIXELS; i++)
neopixels.setPixelColor(i, black);
if ((level == 4) && NUM_NEOPIXELS)
neopixels.setPixelColor(random(NUM_NEOPIXELS), white);
neopixels.setPixelColor(NUM_NEOPIXELS, dotstars.Color(super,super,super));
super++;
if (super > 255)
super = 0;
neopixels.show(); // Update neopixels with new contents
uint16_t timeout = 50;
switch (level)
{
case 1:
timeout = 200;
break;
case 2:
timeout = 100;
break;
}
delay(timeout);
}