forked from Makuna/NeoPixelBus
Topology, Tiles, and Mosaic layout Animation Curves Color Gamma correct change timescale dynamically on NeoPixelAnimator bilinear color blend methods new samples to support new features
122 lines
3.2 KiB
Arduino
122 lines
3.2 KiB
Arduino
// NeoPixelCylon
|
|
// This example will move a Cylong Red Eye back and forth across the
|
|
// the full collection of pixels on the strip.
|
|
//
|
|
// This will demonstrate the use of the NeoEase animation ease methods; that provide
|
|
// simulated acceleration to the animations.
|
|
//
|
|
//
|
|
|
|
#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 uint8_t PixelPin = 2; // make sure to set this to the correct pin, ignored for Esp8266
|
|
const RgbColor CylonEyeColor(HtmlColor(0x7f0000));
|
|
|
|
NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> strip(PixelCount, PixelPin);
|
|
|
|
NeoPixelAnimator animations(2); // only ever need 2 animations
|
|
|
|
uint16_t lastPixel = 0; // track the eye position
|
|
int8_t moveDir = 1; // track the direction of movement
|
|
|
|
// uncomment one of the lines below to see the effects of
|
|
// changing the ease function on the movement animation
|
|
AnimEaseFunction moveEase =
|
|
// NeoEase::Linear;
|
|
// NeoEase::QuadraticInOut;
|
|
// NeoEase::CubicInOut;
|
|
NeoEase::QuarticInOut;
|
|
// NeoEase::QuinticInOut;
|
|
// NeoEase::SinusoidalInOut;
|
|
// NeoEase::ExponentialInOut;
|
|
// NeoEase::CircularInOut;
|
|
|
|
void FadeAll(uint8_t darkenBy)
|
|
{
|
|
RgbColor color;
|
|
for (uint16_t indexPixel = 0; indexPixel < strip.PixelCount(); indexPixel++)
|
|
{
|
|
color = strip.GetPixelColor(indexPixel);
|
|
color.Darken(darkenBy);
|
|
strip.SetPixelColor(indexPixel, color);
|
|
}
|
|
}
|
|
|
|
void FadeAnimUpdate(const AnimationParam& param)
|
|
{
|
|
if (param.state == AnimationState_Completed)
|
|
{
|
|
FadeAll(10);
|
|
animations.RestartAnimation(param.index);
|
|
}
|
|
}
|
|
|
|
void MoveAnimUpdate(const AnimationParam& param)
|
|
{
|
|
// apply the movement animation curve
|
|
float progress = moveEase(param.progress);
|
|
|
|
// use the curved progress to calculate the pixel to effect
|
|
uint16_t nextPixel;
|
|
if (moveDir > 0)
|
|
{
|
|
nextPixel = progress * PixelCount;
|
|
}
|
|
else
|
|
{
|
|
nextPixel = (1.0f - progress) * PixelCount;
|
|
}
|
|
|
|
// if progress moves fast enough, we may move more than
|
|
// one pixel, so we update all between the calculated and
|
|
// the last
|
|
if (lastPixel != nextPixel)
|
|
{
|
|
for (uint16_t i = lastPixel + moveDir; i != nextPixel; i += moveDir)
|
|
{
|
|
strip.SetPixelColor(i, CylonEyeColor);
|
|
}
|
|
}
|
|
strip.SetPixelColor(nextPixel, CylonEyeColor);
|
|
|
|
lastPixel = nextPixel;
|
|
|
|
if (param.state == AnimationState_Completed)
|
|
{
|
|
// reverse direction of movement
|
|
moveDir *= -1;
|
|
|
|
// done, time to restart this position tracking animation/timer
|
|
animations.RestartAnimation(param.index);
|
|
}
|
|
}
|
|
|
|
void SetupAnimations()
|
|
{
|
|
// fade all pixels providing a tail that is longer the faster
|
|
// the pixel moves.
|
|
animations.StartAnimation(0, 5, FadeAnimUpdate);
|
|
|
|
// take several seconds to move eye fron one side to the other
|
|
animations.StartAnimation(1, 2000, MoveAnimUpdate);
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
strip.Begin();
|
|
strip.Show();
|
|
|
|
SetupAnimations();
|
|
}
|
|
|
|
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();
|
|
}
|