FastLED 3.9.15
Loading...
Searching...
No Matches
Pacifica.ino
Go to the documentation of this file.
1// @filter: (mem is large)
5
6//
7// "Pacifica"
8// Gentle, blue-green ocean waves.
9// December 2019, Mark Kriegsman and Mary Corey March.
10// For Dan.
11//
12
13// FastLED.h must be included first to trigger precompiled headers for FastLED's build system
14#include <FastLED.h>
15// Note: FASTLED_ALLOW_INTERRUPTS improves performance on AVR platforms
16// Commented out to enable precompiled headers for faster compilation
17// #define FASTLED_ALLOW_INTERRUPTS 0
18
19#define DATA_PIN 3
20#define NUM_LEDS 60
21#define MAX_POWER_MILLIAMPS 500
22#define LED_TYPE WS2812B
23#define COLOR_ORDER GRB
24
26
27
28void pacifica_one_layer( fl::CRGBPalette16& p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff);
29void pacifica_loop();
32
33
34
35
37
38void setup() {
39 delay( 3000); // 3 second delay for boot recovery, and a moment of silence
41 .setCorrection( TypicalLEDStrip );
42 FastLED.setMaxPowerInVoltsAndMilliamps( 5, MAX_POWER_MILLIAMPS);
43}
44
45void loop()
46{
49 FastLED.show();
50 }
51}
52
54//
55// The code for this animation is more complicated than other examples, and
56// while it is "ready to run", and documented in general, it is probably not
57// the best starting point for learning. Nevertheless, it does illustrate some
58// useful techniques.
59//
61//
62// In this animation, there are four "layers" of waves of light.
63//
64// Each layer moves independently, and each is scaled separately.
65//
66// All four wave layers are added together on top of each other, and then
67// another filter is applied that adds "whitecaps" of brightness where the
68// waves line up with each other more. Finally, another pass is taken
69// over the led fl::array to 'deepen' (dim) the blues and greens.
70//
71// The speed and scale and motion each layer varies slowly within independent
72// hand-chosen ranges, which is why the code has a lot of low-speed 'beatsin8' functions
73// with a lot of oddly specific numeric ranges.
74//
75// These three custom blue-green color palettes were inspired by the colors found in
76// the waters off the southern coast of California, https://goo.gl/maps/QQgd97jjHesHZVxQ7
77//
78fl::CRGBPalette16 pacifica_palette_1 =
79 { 0x000507, 0x000409, 0x00030B, 0x00030D, 0x000210, 0x000212, 0x000114, 0x000117,
80 0x000019, 0x00001C, 0x000026, 0x000031, 0x00003B, 0x000046, 0x14554B, 0x28AA50 };
81fl::CRGBPalette16 pacifica_palette_2 =
82 { 0x000507, 0x000409, 0x00030B, 0x00030D, 0x000210, 0x000212, 0x000114, 0x000117,
83 0x000019, 0x00001C, 0x000026, 0x000031, 0x00003B, 0x000046, 0x0C5F52, 0x19BE5F };
84fl::CRGBPalette16 pacifica_palette_3 =
85 { 0x000208, 0x00030E, 0x000514, 0x00061A, 0x000820, 0x000927, 0x000B2D, 0x000C33,
86 0x000E39, 0x001040, 0x001450, 0x001860, 0x001C70, 0x002080, 0x1040BF, 0x2060FF };
87
88
89
91{
92 // Increment the four "color index start" counters, one for each wave layer.
93 // Each is incremented at a different speed, and the speeds vary over time.
94 static uint16_t sCIStart1, sCIStart2, sCIStart3, sCIStart4;
95 static uint32_t sLastms = 0;
96 uint32_t ms = GET_MILLIS();
97 uint32_t deltams = ms - sLastms;
98 sLastms = ms;
99 uint16_t speedfactor1 = beatsin16(3, 179, 269);
100 uint16_t speedfactor2 = beatsin16(4, 179, 269);
101 uint32_t deltams1 = (deltams * speedfactor1) / 256;
102 uint32_t deltams2 = (deltams * speedfactor2) / 256;
103 uint32_t deltams21 = (deltams1 + deltams2) / 2;
104 sCIStart1 += (deltams1 * beatsin88(1011,10,13));
105 sCIStart2 -= (deltams21 * beatsin88(777,8,11));
106 sCIStart3 -= (deltams1 * beatsin88(501,5,7));
107 sCIStart4 -= (deltams2 * beatsin88(257,4,6));
108
109 // Clear out the LED fl::array to a dim background blue-green
110 fill_solid( leds, NUM_LEDS, fl::CRGB( 2, 6, 10));
111
112 // Render each of four layers, with different scales and speeds, that vary over time
113 pacifica_one_layer( pacifica_palette_1, sCIStart1, beatsin16( 3, 11 * 256, 14 * 256), beatsin8( 10, 70, 130), 0-beat16( 301) );
114 pacifica_one_layer( pacifica_palette_2, sCIStart2, beatsin16( 4, 6 * 256, 9 * 256), beatsin8( 17, 40, 80), beat16( 401) );
115 pacifica_one_layer( pacifica_palette_3, sCIStart3, 6 * 256, beatsin8( 9, 10,38), 0-beat16(503));
116 pacifica_one_layer( pacifica_palette_3, sCIStart4, 5 * 256, beatsin8( 8, 10,28), beat16(601));
117
118 // Add brighter 'whitecaps' where the waves lines up more
120
121 // Deepen the blues and greens a bit
123}
124
125// Add one layer of waves into the led fl::array
126void pacifica_one_layer( fl::CRGBPalette16& p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff)
127{
128 uint16_t ci = cistart;
129 uint16_t waveangle = ioff;
130 uint16_t wavescale_half = (wavescale / 2) + 20;
131 for( uint16_t i = 0; i < NUM_LEDS; i++) {
132 waveangle += 250;
133 uint16_t s16 = sin16( waveangle ) + 32768;
134 uint16_t cs = scale16( s16 , wavescale_half ) + wavescale_half;
135 ci += cs;
136 uint16_t sindex16 = sin16( ci) + 32768;
137 uint8_t sindex8 = scale16( sindex16, 240);
138 fl::CRGB c = ColorFromPalette( p, sindex8, bri, LINEARBLEND);
139 leds[i] += c;
140 }
141}
142
143// Add extra 'white' to areas where the four layers of light have lined up brightly
145{
146 uint8_t basethreshold = beatsin8( 9, 55, 65);
147 uint8_t wave = beat8( 7 );
148
149 for( uint16_t i = 0; i < NUM_LEDS; i++) {
150 uint8_t threshold = scale8( sin8( wave), 20) + basethreshold;
151 wave += 7;
152 uint8_t l = leds[i].getAverageLight();
153 if( l > threshold) {
154 uint8_t overage = l - threshold;
155 uint8_t overage2 = qadd8( overage, overage);
156 leds[i] += fl::CRGB( overage, overage2, qadd8( overage2, overage2));
157 }
158 }
159}
160
161// Deepen the blues and greens
163{
164 for( uint16_t i = 0; i < NUM_LEDS; i++) {
165 leds[i].blue = scale8( leds[i].blue, 145);
166 leds[i].green= scale8( leds[i].green, 200);
167 leds[i] |= fl::CRGB( 2, 5, 7);
168 }
169}
void setup()
void loop()
#define COLOR_ORDER
#define NUM_LEDS
fl::CRGB leds[NUM_LEDS]
#define DATA_PIN
Definition ClientReal.h:82
FL_DISABLE_WARNING_PUSH FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS CFastLED FastLED
Global LED strip management instance.
#define MAX_POWER_MILLIAMPS
void pacifica_loop()
Definition Pacifica.ino:90
void pacifica_deepen_colors()
Definition Pacifica.ino:162
void pacifica_add_whitecaps()
Definition Pacifica.ino:144
void pacifica_one_layer(fl::CRGBPalette16 &p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff)
Definition Pacifica.ino:126
fl::CRGBPalette16 pacifica_palette_2
Definition Pacifica.ino:81
fl::CRGBPalette16 pacifica_palette_3
Definition Pacifica.ino:84
fl::CRGBPalette16 pacifica_palette_1
Definition Pacifica.ino:78
#define LED_TYPE
CRGB ColorFromPalette(const CRGBPalette16 &pal, fl::u8 index, fl::u8 brightness, TBlendType blendType)
void fill_solid(CRGB *targetArray, int numToFill, const CRGB &color) FL_NOEXCEPT
Fill a range of LEDs with a solid color.
Definition fill.cpp.hpp:9
@ TypicalLEDStrip
Typical values for SMD5050 LEDs.
Definition color.h:15
#define GET_MILLIS
The a number of functions need access to a millisecond counter in order to keep time.
Definition lib8tion.h:740
#define EVERY_N_MILLISECONDS(N)
Alias for EVERY_N_MILLIS.
Definition lib8tion.h:1045
LIB8STATIC u16 beat16(accum88 beats_per_minute, u32 timebase=0) FL_NOEXCEPT
Generates a 16-bit "sawtooth" wave at a given BPM.
Definition beat.h:41
LIB8STATIC u16 beatsin88(accum88 beats_per_minute_88, u16 lowest=0, u16 highest=65535, u32 timebase=0, u16 phase_offset=0) FL_NOEXCEPT
Generates a 16-bit sine wave at a given BPM that oscillates within a given range.
Definition beat.h:63
LIB8STATIC u8 beatsin8(accum88 beats_per_minute, u8 lowest=0, u8 highest=255, u32 timebase=0, u8 phase_offset=0) FL_NOEXCEPT
Generates an 8-bit sine wave at a given BPM that oscillates within a given range.
Definition beat.h:105
LIB8STATIC u8 beat8(accum88 beats_per_minute, u32 timebase=0) FL_NOEXCEPT
Generates an 8-bit "sawtooth" wave at a given BPM.
Definition beat.h:51
LIB8STATIC u16 beatsin16(accum88 beats_per_minute, u16 lowest=0, u16 highest=65535, u32 timebase=0, u16 phase_offset=0) FL_NOEXCEPT
Generates a 16-bit sine wave at a given BPM that oscillates within a given range.
Definition beat.h:84
fl::CRGB CRGB
Definition video.h:15
Representation of an 8-bit RGB pixel (Red, Green, Blue)
Definition crgb.h:38