mirror of https://github.com/arendst/Tasmota.git
98 lines
2.8 KiB
C++
98 lines
2.8 KiB
C++
// 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();
|
|
}
|
|
|
|
|