// 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 #include 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 colorGamma; // for any fade animations, best to correct gamma NeoPixelBus strip(PixelCount, PixelPin); // for esp8266 omit the pin //NeoPixelBus 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(); }