forked from Makuna/NeoPixelBus
removed the need to provide the pin argument for Esp8266 NeoPixelBus where it was ignored. Added another DotStar color feature. Fixed DotStar color features to use RgbColor when there is no need for RgbwColor.
98 lines
2.8 KiB
Arduino
98 lines
2.8 KiB
Arduino
// 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();
|
|
}
|
|
|
|
|