From 31658f4eabf7dab1515e96d0f2b85b91d283a59b Mon Sep 17 00:00:00 2001 From: fishbone-git <53238640+fishbone-git@users.noreply.github.com> Date: Sun, 12 Jan 2020 15:04:49 +0100 Subject: [PATCH 1/2] Drip (water_torture) effect (#583) --- wled00/FX.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++- wled00/FX.h | 9 ++++--- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 2c6bc116..2863fea4 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -2536,7 +2536,7 @@ uint16_t WS2812FX::mode_glitter() //each needs 12 bytes -//Spark type is used for popcorn and 1D fireworks +//Spark type is used for popcorn, 1D fireworks, and drip typedef struct Spark { float pos; float vel; @@ -2883,3 +2883,76 @@ uint16_t WS2812FX::mode_exploding_fireworks(void) return FRAMETIME; } + + +/* + * Drip Effect + * ported of: https://www.youtube.com/watch?v=sru2fXh4r7k + */ +uint16_t WS2812FX::mode_drip(void) +{ + //allocate segment data + uint16_t numDrops = 2; + uint16_t dataSize = sizeof(spark) * numDrops; + if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed + + fill(SEGCOLOR(1)); + + Spark* drops = reinterpret_cast(SEGENV.data); + + float gravity = -0.001 - (SEGMENT.speed/50000.0); + gravity *= SEGLEN; + int sourcedrop = 12; + + for (int j=0;j255) drops[j].col=255; + setPixelColor(SEGMENT.start + int(drops[j].pos),color_blend(BLACK,SEGCOLOR(0),drops[j].col)); + + drops[j].col += map(SEGMENT.intensity, 0, 255, 1, 6); // swelling + + if (random8() < drops[j].col/10) { // random drop + drops[j].colIndex=2; //fall + drops[j].col=255; + } + } + if (drops[j].colIndex > 1) { // falling + if (drops[j].pos > 0) { // fall until end of segment + drops[j].pos += drops[j].vel; + if (drops[j].pos < 0) drops[j].pos = 0; + drops[j].vel += gravity; + + for (int i=1;i<7-drops[j].colIndex;i++) { // some minor math so we don't expand bouncing droplets + setPixelColor(SEGMENT.start + int(drops[j].pos)+i,color_blend(BLACK,SEGCOLOR(0),drops[j].col/i)); //spread pixel with fade while falling + } + + if (drops[j].colIndex > 2) { // during bounce, some water is on the floor + setPixelColor(SEGMENT.start,color_blend(SEGCOLOR(0),BLACK,drops[j].col)); + } + } else { // we hit bottom + if (drops[j].colIndex > 2) { // already hit once, so back to forming + drops[j].colIndex = 0; + drops[j].col = sourcedrop; + + } else { + + if (drops[j].colIndex==2) { // init bounce + drops[j].vel = -drops[j].vel/4;// reverse velocity with damping + drops[j].pos += drops[j].vel; + } + drops[j].col = sourcedrop*2; + drops[j].colIndex = 5; // bouncing + } + } + } + } + return FRAMETIME; +} diff --git a/wled00/FX.h b/wled00/FX.h index fdbbfb55..e3a5c3a9 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -91,7 +91,7 @@ #define IS_REVERSE ((SEGMENT.options & REVERSE ) == REVERSE ) #define IS_SELECTED ((SEGMENT.options & SELECTED) == SELECTED ) -#define MODE_COUNT 96 +#define MODE_COUNT 97 #define FX_MODE_STATIC 0 #define FX_MODE_BLINK 1 @@ -189,6 +189,7 @@ #define FX_MODE_SINELON_DUAL 93 #define FX_MODE_SINELON_RAINBOW 94 #define FX_MODE_POPCORN 95 +#define FX_MODE_DRIP 96 class WS2812FX { @@ -365,6 +366,7 @@ class WS2812FX { _mode[FX_MODE_SINELON_DUAL] = &WS2812FX::mode_sinelon_dual; _mode[FX_MODE_SINELON_RAINBOW] = &WS2812FX::mode_sinelon_rainbow; _mode[FX_MODE_POPCORN] = &WS2812FX::mode_popcorn; + _mode[FX_MODE_DRIP] = &WS2812FX::mode_drip; _brightness = DEFAULT_BRIGHTNESS; currentPalette = CRGBPalette16(CRGB::Black); @@ -547,7 +549,8 @@ class WS2812FX { mode_sinelon(void), mode_sinelon_dual(void), mode_sinelon_rainbow(void), - mode_popcorn(void); + mode_popcorn(void), + mode_drip(void); private: @@ -625,7 +628,7 @@ const char JSON_mode_names[] PROGMEM = R"=====([ "Scanner Dual","Stream 2","Oscillate","Pride 2015","Juggle","Palette","Fire 2012","Colorwaves","Bpm","Fill Noise", "Noise 1","Noise 2","Noise 3","Noise 4","Colortwinkles","Lake","Meteor","Meteor Smooth","Railway","Ripple", "Twinklefox","Twinklecat","Halloween Eyes","Solid Pattern","Solid Pattern Tri","Spots","Spots Fade","Glitter","Candle","Fireworks Starburst", -"Fireworks 1D","Bouncing Balls","Sinelon","Sinelon Dual","Sinelon Rainbow","Popcorn" +"Fireworks 1D","Bouncing Balls","Sinelon","Sinelon Dual","Sinelon Rainbow","Popcorn","Drip" ])====="; From d971fc440f48cf253d7d3011bec75144992a386b Mon Sep 17 00:00:00 2001 From: cschwinne Date: Sun, 12 Jan 2020 15:16:45 +0100 Subject: [PATCH 2/2] Support WS2801 and LPD8806 (closes #178) --- wled00/NpbWrapper.h | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/wled00/NpbWrapper.h b/wled00/NpbWrapper.h index 463f429e..a933b9a7 100644 --- a/wled00/NpbWrapper.h +++ b/wled00/NpbWrapper.h @@ -5,6 +5,8 @@ //PIN CONFIGURATION #define LEDPIN 2 //strip pin. Any for ESP32, gpio2 or 3 is recommended for ESP8266 (gpio2/3 are labeled D4/RX on NodeMCU and Wemos) //#define USE_APA102 // Uncomment for using APA102 LEDs. +//#define USE_WS2801 // Uncomment for using WS2801 LEDs (make sure you have NeoPixelBus v2.5.6 or newer) +//#define USE_LPD8806// Uncomment for using LPD8806 //#define WLED_USE_ANALOG_LEDS //Uncomment for using "dumb" PWM controlled LEDs (see pins below, default R: gpio5, G: 12, B: 15, W: 13) //#define WLED_USE_H801 //H801 controller. Please uncomment #define WLED_USE_ANALOG_LEDS as well //#define WLED_USE_5CH //5 Channel H801 for cold and warm white @@ -18,7 +20,7 @@ //END CONFIGURATION -#ifdef USE_APA102 +#if defined(USE_APA102) || defined(USE_WS2801) || defined(USE_LPD8806) #define CLKPIN 0 #define DATAPIN 2 #if BTNPIN == CLKPIN || BTNPIN == DATAPIN @@ -52,6 +54,10 @@ #ifdef ARDUINO_ARCH_ESP32 #ifdef USE_APA102 #define PIXELMETHOD DotStarMethod + #elif defined(USE_WS2801) + #define PIXELMETHOD NeoWs2801Method + #elif defined(USE_LPD8806) + #define PIXELMETHOD Lpd8806Method #else #define PIXELMETHOD NeoEsp32Rmt0Ws2812xMethod #endif @@ -59,6 +65,10 @@ //autoselect the right method depending on strip pin #ifdef USE_APA102 #define PIXELMETHOD DotStarMethod + #elif defined(USE_WS2801) + #define PIXELMETHOD NeoWs2801Method + #elif defined(USE_LPD8806) + #define PIXELMETHOD Lpd8806Method #elif LEDPIN == 2 #define PIXELMETHOD NeoEsp8266Uart1Ws2813Method //if you get an error here, try to change to NeoEsp8266UartWs2813Method or update Neopixelbus #elif LEDPIN == 3 @@ -74,6 +84,8 @@ #ifdef USE_APA102 #define PIXELFEATURE3 DotStarBgrFeature #define PIXELFEATURE4 DotStarLbgrFeature +#elif defined(USE_LPD8806) + #define PIXELFEATURE3 Lpd8806GrbFeature #else #define PIXELFEATURE3 NeoGrbFeature #define PIXELFEATURE4 NeoGrbwFeature @@ -115,7 +127,7 @@ public: switch (_type) { case NeoPixelType_Grb: - #ifdef USE_APA102 + #if defined(USE_APA102) || defined(USE_WS2801) || defined(USE_LPD8806) _pGrb = new NeoPixelBrightnessBus(countPixels, CLKPIN, DATAPIN); #else _pGrb = new NeoPixelBrightnessBus(countPixels, LEDPIN); @@ -124,7 +136,7 @@ public: break; case NeoPixelType_Grbw: - #ifdef USE_APA102 + #if defined(USE_APA102) || defined(USE_WS2801) || defined(USE_LPD8806) _pGrbw = new NeoPixelBrightnessBus(countPixels, CLKPIN, DATAPIN); #else _pGrbw = new NeoPixelBrightnessBus(countPixels, LEDPIN);