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.
124 lines
3.3 KiB
Arduino
124 lines
3.3 KiB
Arduino
// NeoPixelCylon
|
|
// This example will move a Cylon 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);
|
|
// for esp8266 omit the pin
|
|
//NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> strip(PixelCount);
|
|
|
|
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();
|
|
}
|