| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // NeoPixelFunLoop
- // This example will move a trail of light around a series of pixels.
- // A ring formation of pixels looks best.
- // The trail will have a slowly fading tail.
- //
- // This will demonstrate the use of the RotateRight method.
- //
- #include <NeoPixelBus.h>
- #include <NeoPixelAnimator.h>
- const uint16_t PixelCount = 16; // make sure to set this to the number of pixels in your strip
- const uint16_t PixelPin = 2; // make sure to set this to the correct pin, ignored for Esp8266
- const uint16_t AnimCount = 1; // we only need one
- const uint16_t TailLength = 6; // length of the tail, must be shorter than PixelCount
- const float MaxLightness = 0.4f; // max lightness at the head of the tail (0.5f is full bright)
- NeoGamma<NeoGammaTableMethod> colorGamma; // for any fade animations, best to correct gamma
- NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> strip(PixelCount, PixelPin);
- // for esp8266 omit the pin
- //NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> strip(PixelCount);
- NeoPixelAnimator animations(AnimCount); // NeoPixel animation management object
- void SetRandomSeed()
- {
- uint32_t seed;
- // random works best with a seed that can use 31 bits
- // analogRead on a unconnected pin tends toward less than four bits
- seed = analogRead(0);
- delay(1);
- for (int shifts = 3; shifts < 31; shifts += 3)
- {
- seed ^= analogRead(0) << shifts;
- delay(1);
- }
- // Serial.println(seed);
- randomSeed(seed);
- }
- void LoopAnimUpdate(const AnimationParam& param)
- {
- // wait for this animation to complete,
- // we are using it as a timer of sorts
- if (param.state == AnimationState_Completed)
- {
- // done, time to restart this position tracking animation/timer
- animations.RestartAnimation(param.index);
- // rotate the complete strip one pixel to the right on every update
- strip.RotateRight(1);
- }
- }
- void DrawTailPixels()
- {
- // using Hsl as it makes it easy to pick from similiar saturated colors
- float hue = random(360) / 360.0f;
- for (uint16_t index = 0; index < strip.PixelCount() && index <= TailLength; index++)
- {
- float lightness = index * MaxLightness / TailLength;
- RgbColor color = HslColor(hue, 1.0f, lightness);
- strip.SetPixelColor(index, colorGamma.Correct(color));
- }
- }
- void setup()
- {
- strip.Begin();
- strip.Show();
- SetRandomSeed();
- // Draw the tail that will be rotated through all the rest of the pixels
- DrawTailPixels();
- // we use the index 0 animation to time how often we rotate all the pixels
- animations.StartAnimation(0, 66, LoopAnimUpdate);
- }
- void loop()
- {
- // this is all that is needed to keep it running
- // and avoiding using delay() is always a good thing for
- // any timing related routines
- animations.UpdateAnimations();
- strip.Show();
- }
|