Thunderflash Disco Lights for Hercules DJ Controller

One of the most important DJ equipment, according to teenagers who hang out and listen to music, is disco lights.
In the contest DJ gear: Mix Anywhere
4
3
0
258
updated March 5, 2025

Description

PDF

My kids saw a Hercules mixing console on Printables and wanted to buy it immediately. But instead of purchasing it right away, we decided to try winning it first. To come up with a great idea, we conducted a classroom survey to see what would be best. The winning idea? Flashing disco lights, of course!

We chose to use a WS2812B Neopixel LED strip, with the option of controlling it using either a Raspberry Pi Pico or an ESP32 WROOM. The lights can be pre-programmed, or we can use the WLED project (https://kno.wled.ge/), allowing others to control them as well.

Around 50 LEDs will be placed around the holder, meaning we need approximately 1 meter of a WS2812B LED strip (60 LEDs/m, 10mm width, 5VDC). All can be powered with a powerbank.

The holder is assembled using dowels, which can either be glued in place or simply press-fitted. Instead of gluing the front logo, two holes for dowel pins were added for easy attachment.

Below is a code example for controlling the lights, similar to the video demonstration.

Hope someone will find it useful. 

 

Example code using Arduino IDE with ESP32-WROOM-DA Module:

 

#include <Adafruit_NeoPixel.h>

#define LED_PIN 13       // Pin connected to the LED strip
#define NUM_LEDS 51      // Number of LEDs in the strip
#define BRIGHTNESS 127   // Set brightness (0-255). Lower it to half if USB power is poor.

Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
    strip.begin();
    strip.show(); // Initialize all pixels to 'off'
    strip.setBrightness(BRIGHTNESS);
}

void loop() {
    masterpieceDiscoShow(30000);  // Disco show for 30 seconds
}

void masterpieceDiscoShow(int duration) {
    unsigned long startTime = millis();
    while (millis() - startTime < duration) {
        int effect = random(1, 7); // Choose a random effect
        switch (effect) {
            case 1:
                stereoBlast(); // Stereo synchronized blast
                break;
            case 2:
                randomBeatBlasts(); // Aggressive random beat flashes
                break;
            case 3:
                policeStrobe(3000);  // Chaotic police-style strobe
                break;
            case 4:
                waveEffect();  // Flowing wave pattern
                break;
            case 5:
                bassDropExplosion(); // Epic bass drop flashes
                break;
            case 6:
                lightningStorm(); // Unpredictable lightning effect
                break;
        }
    }
}

void stereoBlast() {
    for (int i = 0; i < NUM_LEDS / 2; i++) {
        strip.setPixelColor(i, strip.Color(255, 0, 0)); // Left half Red
        strip.setPixelColor(NUM_LEDS - 1 - i, strip.Color(0, 0, 255)); // Right half Blue
        strip.show();
        delay(10);
    }
    delay(80);
    strip.clear();
    strip.show();
    delay(120);
}

void randomBeatBlasts() {
    for (int i = 0; i < 6; i++) {
        strip.clear();
        for (int j = 0; j < NUM_LEDS; j++) {
            if (random(0, 5) > 2) { // Randomized spread
                strip.setPixelColor(j, strip.Color(random(100, 255), random(100, 255), random(100, 255)));
            }
        }
        strip.show();
        delay(60);
        strip.clear();
        strip.show();
        delay(200);
    }
}

void policeStrobe(int duration) {
    unsigned long startTime = millis();
    while (millis() - startTime < duration) {
        for (int i = 0; i < NUM_LEDS; i++) {
            strip.setPixelColor(i, (random(0, 3) > 1) ? strip.Color(255, 0, 0) : strip.Color(0, 0, 255));
        }
        strip.show();
        delay(50);
        strip.clear();
        strip.show();
        delay(50);
    }
}

void waveEffect() {
    for (int j = 0; j < 256; j += 30) {
        for (int i = 0; i < NUM_LEDS; i++) {
            int colorVal = (i * 256 / NUM_LEDS + j) & 255;
            strip.setPixelColor(i, strip.Color(colorVal, 255 - colorVal, colorVal / 2));
        }
        strip.show();
        delay(50);
    }
}

void bassDropExplosion() {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < NUM_LEDS; j++) {
            strip.setPixelColor(j, strip.Color(255, 255, 255));
        }
        strip.show();
        delay(30);
        strip.clear();
        strip.show();
        delay(400);
    }
}

void lightningStorm() {
    for (int i = 0; i < 5; i++) {
        int flashCount = random(2, 6);
        for (int j = 0; j < flashCount; j++) {
            for (int k = 0; k < NUM_LEDS; k++) {
                strip.setPixelColor(k, strip.Color(255, 255, 255));
            }
            strip.show();
            delay(random(30, 100));
            strip.clear();
            strip.show();
            delay(random(100, 250));
        }
        delay(500);
    }
}

 

Tags



Awarded in the contest


2
DJ gear: Mix Anywhere
425 entries | February 4 – March 6, 2025

Model origin

The author marked this model as their own original creation.

License