Difference between revisions of "LED skirt"
Jump to navigation
Jump to search
(8 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
|Name=LED-skirt | |Name=LED-skirt | ||
|Status=In progress | |Status=In progress | ||
− | |Picture= | + | |Picture=Photo5933744821665640847 - by WheezeNL.jpg |
|Contact=Noor | |Contact=Noor | ||
}} | }} | ||
==To do== | ==To do== | ||
* Reinforce wire connections with hot glue and/or zip ties. | * Reinforce wire connections with hot glue and/or zip ties. | ||
− | * | + | * Punch and grommet holes where velcro used to be. |
+ | * Buy or make a carrying case (width ~80 cm, height ~110 cm), maybe pop-up tent bag. | ||
+ | * Make LEDs addressable by position. | ||
* More programming designs. | * More programming designs. | ||
* Get '''[http://soliton.vm.bytemark.co.uk/pub/cpt-city/pd/astro/tn/aurora_borealis.png.index.html aurora borealis palette]''' working properly on circles and panel, and shooting stars display on strips. | * Get '''[http://soliton.vm.bytemark.co.uk/pub/cpt-city/pd/astro/tn/aurora_borealis.png.index.html aurora borealis palette]''' working properly on circles and panel, and shooting stars display on strips. | ||
− | * Replace strip in bottom tube with '''[https://nl.aliexpress.com/item/32885384695.html side-emitting LEDs]'''? | + | * Replace (or add to) strip in bottom tube with '''[https://nl.aliexpress.com/item/32885384695.html side-emitting LEDs]'''? |
==LED count== | ==LED count== | ||
Line 37: | Line 39: | ||
Old sketches: | Old sketches: | ||
− | [[File:2019-11-04 224115 - design1.png| | + | [[File:2019-11-04 224115 - design1.png|100px]][[File:2019-11-04 224123 - led skirt 2.png|100px]][[File:2019-11-04 224131 - led skirt 3.png|100px]] |
− | [[File:2019-11-04 224123 - led skirt 2.png| | + | [[File:2019-11-05 215433 - DSC06381.jpg|214px]][[File:2019-11-05 215437 - DSC06382.jpg|214px]] |
− | [[File:2019-11-04 224131 - led skirt 3.png| | ||
− | [[File:2019-11-05 215433 - DSC06381.jpg| | ||
− | [[File:2019-11-05 215437 - DSC06382.jpg| | ||
'''2019-11-12 - 2019-11-24''' | '''2019-11-12 - 2019-11-24''' | ||
− | * | + | * Played with layout of LEDs, waiting for items to arrive. |
* Tested out LEDs under layers and on crinoline. | * Tested out LEDs under layers and on crinoline. | ||
Line 79: | Line 78: | ||
[[File:2019-12-06 193923 - DSC06635.jpg|150px]] | [[File:2019-12-06 193923 - DSC06635.jpg|150px]] | ||
[[File:2019-12-06 194452 - DSC06637.jpg|150px]] | [[File:2019-12-06 194452 - DSC06637.jpg|150px]] | ||
− | [[File:2019-12-06 200017 - DSC06639.jpg| | + | [[File:2019-12-06 200017 - DSC06639.jpg|266px]] |
[[File:2019-12-06 220618 - DSC06666.jpg|150px]] | [[File:2019-12-06 220618 - DSC06666.jpg|150px]] | ||
[[File:2019-12-06 220632 - DSC06667.jpg|150px]] | [[File:2019-12-06 220632 - DSC06667.jpg|150px]] | ||
[[File:2019-12-06 220710 - DSC06668.jpg|150px]] | [[File:2019-12-06 220710 - DSC06668.jpg|150px]] | ||
− | |||
[[File:2019-12-06 181804 - MAH06633.mp4|250px]] | [[File:2019-12-06 181804 - MAH06633.mp4|250px]] | ||
[[File:2019-12-06 201308 - MAH06641.mp4|250px]] | [[File:2019-12-06 201308 - MAH06641.mp4|250px]] | ||
− | + | [[File:2019-12-06 220455 - MAH06664.mp4|150px]] | |
− | [[File:2019-12-06 220455 - MAH06664.mp4| | + | [[File:2019-12-06 220715 - MAH06669.mp4|150px]] |
− | [[File:2019-12-06 220715 - MAH06669.mp4| | ||
'''2019-12-20''' | '''2019-12-20''' | ||
Line 134: | Line 131: | ||
[[File:2020-01-11 210350 - DSC08401.jpg|200px]] | [[File:2020-01-11 210350 - DSC08401.jpg|200px]] | ||
− | [[File:2020-01-11 195305 - MAH08399 3.mp4| | + | [[File:2020-01-11 195305 - MAH08399 3.mp4|150px]] |
− | [[File:2020-01-11 201459 - MAH08404 2.mp4| | + | [[File:2020-01-11 201459 - MAH08404 2.mp4|150px]] |
'''2020-01-17''' | '''2020-01-17''' | ||
Line 146: | Line 143: | ||
[[File:2020-01-17 195703 - DSC08503.jpg|150px]] | [[File:2020-01-17 195703 - DSC08503.jpg|150px]] | ||
− | [[File:2020-01-17 183546 - MAH08490.mp4| | + | [[File:2020-01-17 183546 - MAH08490.mp4|150px]] |
− | [[File:2020-01-17 195232 - MAH08497.mp4| | + | [[File:2020-01-17 195232 - MAH08497.mp4|150px]] |
'''2020-01-18 - 2020-02-13''' | '''2020-01-18 - 2020-02-13''' | ||
Line 157: | Line 154: | ||
* Bought 2x '''[https://www.lidl-shop.nl/SILVERCREST-Powerbank-10-000-mAh/p100264867 SilverCrest power banks]'''. | * Bought 2x '''[https://www.lidl-shop.nl/SILVERCREST-Powerbank-10-000-mAh/p100264867 SilverCrest power banks]'''. | ||
− | [[File:2020-01-28 202925 - DSC08667.jpg| | + | [[File:2020-01-28 202925 - DSC08667.jpg|240px]] |
− | [[File:2020-01-28 205606 - DSC08678.jpg| | + | [[File:2020-01-28 205606 - DSC08678.jpg|240px]] |
− | [[File:2020-01-28 205645 - DSC08682.jpg| | + | [[File:2020-01-28 205645 - DSC08682.jpg|135px]] |
− | [[File:2020-01-31 201610 - DSC08697.jpg|200px]] | + | [[File:2020-01-31 201610 - DSC08697.jpg|240px]] |
+ | [[File:2020-02-05 222300 - DSC08979.jpg|240px]] | ||
+ | [[File:2020-02-07 214159 - DSC09010.jpg|135px]] | ||
+ | [[File:2020-02-07 214322 - DSC09012.jpg|240px]] | ||
+ | [[File:2020-02-09 184847 - DSC09137.jpg|135px]] | ||
+ | [[File:2020-02-11 182635 - DSC09159.jpg|240px]] | ||
+ | [[File:2020-02-11 185833 - DSC09164.jpg|240px]] | ||
+ | [[File:2020-02-11 201149 - DSC09169.jpg|135px]] | ||
+ | [[File:2020-02-11 233802 - DSC09223.jpg|135px]] | ||
+ | [[File:2020-02-13 170031 - DSC09231.jpg|240px]] | ||
+ | [[File:2020-02-13 195455 - DSC09237.jpg|240px]] | ||
+ | [[File:2020-02-13 201536 - DSC09239.jpg|240px]] | ||
+ | [[File:2020-02-13 204153 - DSC09242.jpg|135px]] | ||
+ | [[File:2020-02-13 205404 - DSC09244.jpg|135px]] | ||
+ | [[File:2020-02-13 213221 - DSC09245.jpg|240px]] | ||
+ | |||
+ | [[File:2020-02-05 212228 - MAH08977.mkv|250px]] | ||
+ | [[File:2020-02-13 204138 - MAH09241.mkv|150px]] | ||
+ | [[File:2020-02-13 205005 - MAH09243.mkv|150px]] | ||
+ | |||
+ | ===HackerHotel 2020=== | ||
+ | |||
+ | '''2020-02-14 -2020-02-16''' | ||
+ | |||
+ | * Debut as Princess of Lights went excellent, with paparazzi taking pictures and video all weekend. | ||
+ | * About a dozen wires broke off throughout the weekend and had to be soldered back on, some with reinforcements of zip ties to hold them in place. | ||
+ | * LEDs kept weighing down crinoline, and since the string in the waist came out a long time ago, the velcro was not enough to hold it up. Used an opened paperclip to hold it together, and then a safety pin. Need to add a hook fastener, or use a large safety pin (through grommeted holes) or some other kind of fastener. | ||
+ | |||
+ | [[File:2020-02-14 215110 - DSC09343.jpg|170px]] | ||
+ | [[File:2020-02-15 004016 - DSC09369.jpg|240px]] | ||
+ | [[File:photo5933744821665640847 - by WheezeNL.jpg|170px]] | ||
+ | |||
+ | [[File:2020-02-14 205051 - MAH09341.mkv|200px]] | ||
+ | [[File:2020-02-14 205124 - MAH09344.mkv|194px]] | ||
+ | [[File:t_video5933782887504545062 - by WheezeNL.mkv|216px]] | ||
+ | [[File:t_video5931592870795413162 - by Rowan8k.mkv|165px]] | ||
+ | |||
+ | Modified fastLED sketches that I used at HH2020: | ||
+ | |||
+ | Arduino 1 (for circles and panel): | ||
+ | |||
+ | <div style="height: 200px; overflow: scroll;"> | ||
+ | <pre> | ||
+ | #include <FastLED.h> | ||
+ | |||
+ | FASTLED_USING_NAMESPACE | ||
+ | |||
+ | #if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000) | ||
+ | #warning "Requires FastLED 3.1 or later; check github for latest code." | ||
+ | #endif | ||
+ | |||
+ | #define DATA_PIN 6 | ||
+ | //#define CLK_PIN 4 | ||
+ | #define LED_TYPE WS2811 | ||
+ | #define COLOR_ORDER GRB | ||
+ | #define NUM_LEDS 304 | ||
+ | CRGB leds[NUM_LEDS]; | ||
+ | |||
+ | #define BRIGHTNESS 15 | ||
+ | #define FRAMES_PER_SECOND 120 | ||
+ | #define SHIFT_PER_SECOND 15 | ||
+ | |||
+ | void setup() { | ||
+ | delay(3000); // 3 second delay for recovery | ||
+ | |||
+ | // tell FastLED about the LED strip configuration | ||
+ | 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); | ||
+ | } | ||
+ | |||
+ | |||
+ | // List of patterns to cycle through. Each is defined as a separate function below. | ||
+ | typedef void (*SimplePatternList[])(); | ||
+ | SimplePatternList gPatterns = { rainbowWithGlitter, bpm, confetti, flowingwater }; | ||
+ | |||
+ | uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current | ||
+ | uint8_t gHue = 0; // rotating "base color" used by many of the patterns | ||
+ | |||
+ | DEFINE_GRADIENT_PALETTE( Aleutian_Clouds_gp ) { | ||
+ | 0, 37,184,133, | ||
+ | 12, 37,184,133, | ||
+ | 25, 46,168, 98, | ||
+ | 37, 55,152, 67, | ||
+ | 51, 22,104, 77, | ||
+ | 63, 5, 66, 88, | ||
+ | 76, 1, 31, 49, | ||
+ | 88, 1, 19, 32, | ||
+ | 100, 1, 2, 11, | ||
+ | 112, 1, 3, 9, | ||
+ | 125, 1, 6, 20, | ||
+ | 137, 1, 10, 20, | ||
+ | 149, 1, 2, 11, | ||
+ | 161, 1, 19, 32, | ||
+ | 173, 1, 31, 49, | ||
+ | 185, 5, 66, 88, | ||
+ | 200, 22,104, 77, | ||
+ | 212, 55,152, 67, | ||
+ | 225, 46,168, 98, | ||
+ | 237, 37,184,133, | ||
+ | 255, 37,184,133, | ||
+ | }; | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | // Call the current pattern function once, updating the 'leds' array | ||
+ | gPatterns[gCurrentPatternNumber](); | ||
+ | |||
+ | // send the 'leds' array out to the actual LED strip | ||
+ | FastLED.show(); | ||
+ | // insert a delay to keep the framerate modest | ||
+ | FastLED.delay(1000/FRAMES_PER_SECOND); | ||
+ | |||
+ | // do some periodic updates | ||
+ | EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow | ||
+ | EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically | ||
+ | } | ||
+ | |||
+ | #define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) | ||
+ | |||
+ | void nextPattern() | ||
+ | { | ||
+ | // add one to the current pattern number, and wrap around at the end | ||
+ | gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns); | ||
+ | } | ||
+ | |||
+ | void rainbow() | ||
+ | { | ||
+ | // FastLED's built-in rainbow generator | ||
+ | fill_rainbow( leds, NUM_LEDS, gHue, 35); | ||
+ | } | ||
+ | |||
+ | void rainbowWithGlitter() | ||
+ | { | ||
+ | // built-in FastLED rainbow, plus some random sparkly glitter | ||
+ | rainbow(); | ||
+ | addGlitter(80); | ||
+ | } | ||
+ | |||
+ | void addGlitter( fract8 chanceOfGlitter) | ||
+ | { | ||
+ | if( random8() < chanceOfGlitter) { | ||
+ | leds[ random16(NUM_LEDS) ] += CRGB::White; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void confetti() | ||
+ | { | ||
+ | // random colored speckles that blink in and fade smoothly | ||
+ | fadeToBlackBy( leds, NUM_LEDS, 10); | ||
+ | int pos = random16(NUM_LEDS); | ||
+ | leds[pos] += CHSV( gHue + random8(64), 200, 255); | ||
+ | } | ||
+ | |||
+ | void bpm() | ||
+ | { | ||
+ | // colored stripes pulsing at a defined Beats-Per-Minute (BPM) | ||
+ | uint8_t BeatsPerMinute = 62; | ||
+ | CRGBPalette16 palette = PartyColors_p; | ||
+ | uint8_t beat = beatsin8( BeatsPerMinute, 64, 255); | ||
+ | for( int i = 0; i < NUM_LEDS; i++) { //9948 | ||
+ | leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10)); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int offset = 0; | ||
+ | int framecounter = 0; | ||
+ | void flowingwater() | ||
+ | { | ||
+ | |||
+ | CRGBPalette16 palette = Aleutian_Clouds_gp; | ||
+ | |||
+ | for( int i = 0; i < NUM_LEDS; i++) { | ||
+ | leds[i] = ColorFromPalette(palette, ((i+offset)%256), 128); | ||
+ | addGlitter(1); | ||
+ | } | ||
+ | framecounter++; | ||
+ | if (framecounter > FRAMES_PER_SECOND / SHIFT_PER_SECOND) { | ||
+ | offset++; | ||
+ | //offset = offset + random8(4); | ||
+ | if (offset >= 256) { | ||
+ | offset = 0; | ||
+ | } | ||
+ | framecounter = 0; | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | </div> | ||
+ | |||
+ | Arduino 2 (for strips), from fastLED's demo reel: | ||
+ | |||
+ | <div style="height: 200px; overflow: scroll;"> | ||
+ | <pre> | ||
+ | #include <FastLED.h> | ||
+ | |||
+ | FASTLED_USING_NAMESPACE | ||
+ | |||
+ | #if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000) | ||
+ | #warning "Requires FastLED 3.1 or later; check github for latest code." | ||
+ | #endif | ||
+ | |||
+ | #define DATA_PIN 6 | ||
+ | //#define CLK_PIN 4 | ||
+ | #define LED_TYPE WS2811 | ||
+ | #define COLOR_ORDER GRB | ||
+ | #define NUM_LEDS 147 | ||
+ | CRGB leds[NUM_LEDS]; | ||
+ | |||
+ | #define BRIGHTNESS 75 | ||
+ | #define FRAMES_PER_SECOND 40 | ||
+ | |||
+ | void setup() { | ||
+ | delay(3000); // 3 second delay for recovery | ||
+ | |||
+ | // tell FastLED about the LED strip configuration | ||
+ | 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); | ||
+ | } | ||
+ | |||
+ | |||
+ | // List of patterns to cycle through. Each is defined as a separate function below. | ||
+ | typedef void (*SimplePatternList[])(); | ||
+ | SimplePatternList gPatterns = { confetti, sinelon, juggle, bpm }; | ||
+ | |||
+ | uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current | ||
+ | uint8_t gHue = 0; // rotating "base color" used by many of the patterns | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | // Call the current pattern function once, updating the 'leds' array | ||
+ | gPatterns[gCurrentPatternNumber](); | ||
+ | |||
+ | // send the 'leds' array out to the actual LED strip | ||
+ | FastLED.show(); | ||
+ | // insert a delay to keep the framerate modest | ||
+ | FastLED.delay(1000/FRAMES_PER_SECOND); | ||
+ | |||
+ | // do some periodic updates | ||
+ | EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow | ||
+ | EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically | ||
+ | } | ||
+ | |||
+ | #define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) | ||
+ | |||
+ | void nextPattern() | ||
+ | { | ||
+ | // add one to the current pattern number, and wrap around at the end | ||
+ | gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns); | ||
+ | } | ||
+ | |||
+ | |||
+ | void confetti() | ||
+ | { | ||
+ | // random colored speckles that blink in and fade smoothly | ||
+ | fadeToBlackBy( leds, NUM_LEDS, 10); | ||
+ | int pos = random16(NUM_LEDS); | ||
+ | leds[pos] += CHSV( gHue + random8(64), 200, 255); | ||
+ | } | ||
− | + | void sinelon() | |
− | + | { | |
− | + | // a colored dot sweeping back and forth, with fading trails | |
− | [ | + | fadeToBlackBy( leds, NUM_LEDS, 20); |
− | + | int pos = beatsin16( 13, 0, NUM_LEDS-1 ); | |
+ | leds[pos] += CHSV( gHue, 255, 192); | ||
+ | } | ||
− | + | void bpm() | |
− | [ | + | { |
− | + | // colored stripes pulsing at a defined Beats-Per-Minute (BPM) | |
− | + | uint8_t BeatsPerMinute = 62; | |
− | + | CRGBPalette16 palette = PartyColors_p; | |
+ | uint8_t beat = beatsin8( BeatsPerMinute, 64, 255); | ||
+ | for( int i = 0; i < NUM_LEDS; i++) { //9948 | ||
+ | leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10)); | ||
+ | } | ||
+ | } | ||
− | [ | + | void juggle() { |
− | + | // eight colored dots, weaving in and out of sync with each other | |
− | + | fadeToBlackBy( leds, NUM_LEDS, 20); | |
− | + | byte dothue = 0; | |
− | + | for( int i = 0; i < 8; i++) { | |
+ | leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255); | ||
+ | dothue += 32; | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | </div> | ||
− | + | ===Further work=== | |
− | |||
− | + | '''2020-02-21 and 2020-02-25''' | |
+ | * Removed velcro pads from skirt as they were coming apart and were useless at Hacker Hotel. | ||
+ | * Applied Mod Podge where velcro pads used to be, sealing loose threads. | ||
− | + | [[File:2020-02-25 212846 - DSC09574.jpg|200px]] | |
− | * | + | [[File:2020-02-21 161944 - DSC09517.jpg|200px]] |
− | + | ||
+ | '''2020-03-07''' | ||
+ | * Took apart a couple of cracked LCD screens. Diffusion and reflective films had some trippy effects (that don't show so well in pictures). Plan is to use them as panels for some parts. | ||
+ | |||
+ | [[File:2020-03-07 175704 - DSC09635.jpg|200px]] | ||
+ | [[File:2020-03-07 180407 - DSC09636.jpg|200px]] | ||
+ | [[File:2020-03-07 180457 - DSC09639.jpg|200px]] |
Revision as of 03:46, 19 March 2020
Project LED-skirt | |
---|---|
Status | In progress |
Contact | Noor |
Last Update | 2020-03-19 |
To do
- Reinforce wire connections with hot glue and/or zip ties.
- Punch and grommet holes where velcro used to be.
- Buy or make a carrying case (width ~80 cm, height ~110 cm), maybe pop-up tent bag.
- Make LEDs addressable by position.
- More programming designs.
- Get aurora borealis palette working properly on circles and panel, and shooting stars display on strips.
- Replace (or add to) strip in bottom tube with side-emitting LEDs?
LED count
- 240 - circles (all used except one)
- 64 - 8x8 panel.
- 23 - strip 1.
- 23 - strip 2.
- 17 - strip 3.
- 84 (?) - strip along bottom tube.
Total: 451 LEDs.
Timeline
Construction
2019-11-06 - 2019-11-11
Bought:
- 8x8 cm WS2812 LED panel
- 5m, 30 LEDs/m, IP67, black LED pixel strip
- 241 LEDs, rings of varying sizes from 3 to 17 cm
- [x2] 2-hoop crinolines to attach LEDs to
- 88 cm black skirt
Old sketches:
2019-11-12 - 2019-11-24
- Played with layout of LEDs, waiting for items to arrive.
- Tested out LEDs under layers and on crinoline.
2019-11-25
- Took apart seams of inner layers of black skirt to add extra panels to fit over crinoline.
2019-11-26
- Measured skirt on top of crinoline. Extra panel with bottom arc length of 100+cm.
- Decided to go with 6 strips of 23 LEDs each. Cut one strip.
2019-12-03 - 2019-12-05
- Tested out LED rings. One wire was detached so had to be soldered on.
2019-12-06
- Punched holes in crinoline, used zip ties to attach first LED strip.
- Took apart LED circles and tested FastLED programs.
- Set up LED circles, one strip, and panel together on crinoline and used zip ties to place everything but the panel on crinoline.
- Ran FastLED programs on everything together.
- Pictures posted by others to Facebook, RevSpace kiekjes, Twitter.
2019-12-20
- Rearranged LED circles, mounted some back on with velcro. Mounted panel with velcro.
- Cut two more strips. Attached wires to one and mounted it horizontally at an angle.
2019-12-22
- Folded up bottom hem and put velcro strips all across to partially make a tube along bottom.
2019-12-24
- Bought LED connectors (20 pairs, 3-pin).
2019-12-25
- Measured and cut panel for black layer of skirt.
2020-01-10
- Used fabric glue along bottom hem tube, in between velcro strips.
- Soldered wires to more LED strips.
2020-01-11
- Soldered wires to remaining LED strips.
- Connected everything together, hooked up to an Arduino.
2020-01-17
- Added more velcro bits to fix placement of LEDs.
- Experimented with modifying FastLED programs. BPM on circles?
2020-01-18 - 2020-02-13
- Experimented more with FastLED programs.
- For custom color palettes, used PaletteKnife bookmarklet to generate codes for palettes. Add to sketch directly, or add to Arduino/libraries/FastLED/colorpalettes.cpp and palette name to colorpalettes.h.
- Cut up plastic bag for panel over skirt, attached with velcro.
- Finished up everything on black outer skirt.
- Bought 2x SilverCrest power banks.
HackerHotel 2020
2020-02-14 -2020-02-16
- Debut as Princess of Lights went excellent, with paparazzi taking pictures and video all weekend.
- About a dozen wires broke off throughout the weekend and had to be soldered back on, some with reinforcements of zip ties to hold them in place.
- LEDs kept weighing down crinoline, and since the string in the waist came out a long time ago, the velcro was not enough to hold it up. Used an opened paperclip to hold it together, and then a safety pin. Need to add a hook fastener, or use a large safety pin (through grommeted holes) or some other kind of fastener.
Modified fastLED sketches that I used at HH2020:
Arduino 1 (for circles and panel):
#include <FastLED.h> FASTLED_USING_NAMESPACE #if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000) #warning "Requires FastLED 3.1 or later; check github for latest code." #endif #define DATA_PIN 6 //#define CLK_PIN 4 #define LED_TYPE WS2811 #define COLOR_ORDER GRB #define NUM_LEDS 304 CRGB leds[NUM_LEDS]; #define BRIGHTNESS 15 #define FRAMES_PER_SECOND 120 #define SHIFT_PER_SECOND 15 void setup() { delay(3000); // 3 second delay for recovery // tell FastLED about the LED strip configuration 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); } // List of patterns to cycle through. Each is defined as a separate function below. typedef void (*SimplePatternList[])(); SimplePatternList gPatterns = { rainbowWithGlitter, bpm, confetti, flowingwater }; uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current uint8_t gHue = 0; // rotating "base color" used by many of the patterns DEFINE_GRADIENT_PALETTE( Aleutian_Clouds_gp ) { 0, 37,184,133, 12, 37,184,133, 25, 46,168, 98, 37, 55,152, 67, 51, 22,104, 77, 63, 5, 66, 88, 76, 1, 31, 49, 88, 1, 19, 32, 100, 1, 2, 11, 112, 1, 3, 9, 125, 1, 6, 20, 137, 1, 10, 20, 149, 1, 2, 11, 161, 1, 19, 32, 173, 1, 31, 49, 185, 5, 66, 88, 200, 22,104, 77, 212, 55,152, 67, 225, 46,168, 98, 237, 37,184,133, 255, 37,184,133, }; void loop() { // Call the current pattern function once, updating the 'leds' array gPatterns[gCurrentPatternNumber](); // send the 'leds' array out to the actual LED strip FastLED.show(); // insert a delay to keep the framerate modest FastLED.delay(1000/FRAMES_PER_SECOND); // do some periodic updates EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically } #define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) void nextPattern() { // add one to the current pattern number, and wrap around at the end gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns); } void rainbow() { // FastLED's built-in rainbow generator fill_rainbow( leds, NUM_LEDS, gHue, 35); } void rainbowWithGlitter() { // built-in FastLED rainbow, plus some random sparkly glitter rainbow(); addGlitter(80); } void addGlitter( fract8 chanceOfGlitter) { if( random8() < chanceOfGlitter) { leds[ random16(NUM_LEDS) ] += CRGB::White; } } void confetti() { // random colored speckles that blink in and fade smoothly fadeToBlackBy( leds, NUM_LEDS, 10); int pos = random16(NUM_LEDS); leds[pos] += CHSV( gHue + random8(64), 200, 255); } void bpm() { // colored stripes pulsing at a defined Beats-Per-Minute (BPM) uint8_t BeatsPerMinute = 62; CRGBPalette16 palette = PartyColors_p; uint8_t beat = beatsin8( BeatsPerMinute, 64, 255); for( int i = 0; i < NUM_LEDS; i++) { //9948 leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10)); } } int offset = 0; int framecounter = 0; void flowingwater() { CRGBPalette16 palette = Aleutian_Clouds_gp; for( int i = 0; i < NUM_LEDS; i++) { leds[i] = ColorFromPalette(palette, ((i+offset)%256), 128); addGlitter(1); } framecounter++; if (framecounter > FRAMES_PER_SECOND / SHIFT_PER_SECOND) { offset++; //offset = offset + random8(4); if (offset >= 256) { offset = 0; } framecounter = 0; } }
Arduino 2 (for strips), from fastLED's demo reel:
#include <FastLED.h> FASTLED_USING_NAMESPACE #if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000) #warning "Requires FastLED 3.1 or later; check github for latest code." #endif #define DATA_PIN 6 //#define CLK_PIN 4 #define LED_TYPE WS2811 #define COLOR_ORDER GRB #define NUM_LEDS 147 CRGB leds[NUM_LEDS]; #define BRIGHTNESS 75 #define FRAMES_PER_SECOND 40 void setup() { delay(3000); // 3 second delay for recovery // tell FastLED about the LED strip configuration 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); } // List of patterns to cycle through. Each is defined as a separate function below. typedef void (*SimplePatternList[])(); SimplePatternList gPatterns = { confetti, sinelon, juggle, bpm }; uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current uint8_t gHue = 0; // rotating "base color" used by many of the patterns void loop() { // Call the current pattern function once, updating the 'leds' array gPatterns[gCurrentPatternNumber](); // send the 'leds' array out to the actual LED strip FastLED.show(); // insert a delay to keep the framerate modest FastLED.delay(1000/FRAMES_PER_SECOND); // do some periodic updates EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically } #define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) void nextPattern() { // add one to the current pattern number, and wrap around at the end gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns); } void confetti() { // random colored speckles that blink in and fade smoothly fadeToBlackBy( leds, NUM_LEDS, 10); int pos = random16(NUM_LEDS); leds[pos] += CHSV( gHue + random8(64), 200, 255); } void sinelon() { // a colored dot sweeping back and forth, with fading trails fadeToBlackBy( leds, NUM_LEDS, 20); int pos = beatsin16( 13, 0, NUM_LEDS-1 ); leds[pos] += CHSV( gHue, 255, 192); } void bpm() { // colored stripes pulsing at a defined Beats-Per-Minute (BPM) uint8_t BeatsPerMinute = 62; CRGBPalette16 palette = PartyColors_p; uint8_t beat = beatsin8( BeatsPerMinute, 64, 255); for( int i = 0; i < NUM_LEDS; i++) { //9948 leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10)); } } void juggle() { // eight colored dots, weaving in and out of sync with each other fadeToBlackBy( leds, NUM_LEDS, 20); byte dothue = 0; for( int i = 0; i < 8; i++) { leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255); dothue += 32; } }
Further work
2020-02-21 and 2020-02-25
- Removed velcro pads from skirt as they were coming apart and were useless at Hacker Hotel.
- Applied Mod Podge where velcro pads used to be, sealing loose threads.
2020-03-07
- Took apart a couple of cracked LCD screens. Diffusion and reflective films had some trippy effects (that don't show so well in pictures). Plan is to use them as panels for some parts.