【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块5

发布时间 2023-07-13 08:31:20作者: 行者花雕

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

 

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

  项目二十四:将噪声数据转换为 LED 阵列中的动态颜色

  实验开源代码

 

/*
  【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  实验一百四十六:64位WS2812B 8*8 xRGB 5050 LED模块 ws2812s像素点阵屏
  项目二十四:将噪声数据转换为 LED 阵列中的动态颜色
  实验接线
  Module    UNO
  VCC —— 3.3V
  GND —— GND
  DI  ——  D6
*/

#include <FastLED.h>

#define LED_PIN     6
#define BRIGHTNESS  26
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB

// Params for width and height
const uint8_t kMatrixWidth  = 8;
const uint8_t kMatrixHeight = 8;

// Param for different pixel layouts
const bool    kMatrixSerpentineLayout = true;


// This example combines two features of FastLED to produce a remarkable range of
// effects from a relatively small amount of code.  This example combines FastLED's
// color palette lookup functions with FastLED's Perlin noise generator, and
// the combination is extremely powerful.
//
// You might want to look at the "ColorPalette" and "Noise" examples separately
// if this example code seems daunting.
//
//
// The basic setup here is that for each frame, we generate a new array of
// 'noise' data, and then map it onto the LED matrix through a color palette.
//
// Periodically, the color palette is changed, and new noise-generation parameters
// are chosen at the same time.  In this example, specific noise-generation
// values have been selected to match the given color palettes; some are faster,
// or slower, or larger, or smaller than others, but there's no reason these
// parameters can't be freely mixed-and-matched.
//
// In addition, this example includes some fast automatic 'data smoothing' at
// lower noise speeds to help produce smoother animations in those cases.
//
// The FastLED built-in color palettes (Forest, Clouds, Lava, Ocean, Party) are
// used, as well as some 'hand-defined' ones, and some proceedurally generated
// palettes.


#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
#define MAX_DIMENSION ((kMatrixWidth>kMatrixHeight) ? kMatrixWidth : kMatrixHeight)

// The leds
CRGB leds[kMatrixWidth * kMatrixHeight];

// The 16 bit version of our coordinates
static uint16_t x;
static uint16_t y;
static uint16_t z;

// We're using the x/y dimensions to map to the x/y pixels on the matrix.  We'll
// use the z-axis for "time".  speed determines how fast time moves forward.  Try
// 1 for a very slow moving effect, or 60 for something that ends up looking like
// water.
uint16_t speed = 20; // speed is set dynamically once we've started up

// Scale determines how far apart the pixels in our noise matrix are.  Try
// changing these values around to see how it affects the motion of the display.  The
// higher the value of scale, the more "zoomed out" the noise iwll be.  A value
// of 1 will be so zoomed in, you'll mostly see solid colors.
uint16_t scale = 30; // scale is set dynamically once we've started up

// This is the array that we keep our computed noise values in
uint8_t noise[MAX_DIMENSION][MAX_DIMENSION];

CRGBPalette16 currentPalette( PartyColors_p );
uint8_t       colorLoop = 1;

void setup() {
  delay(3000);
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);

  // Initialize our coordinates to some random values
  x = random16();
  y = random16();
  z = random16();
}



// Fill the x/y array of 8-bit noise values using the inoise8 function.
void fillnoise8() {
  // If we're runing at a low "speed", some 8-bit artifacts become visible
  // from frame-to-frame.  In order to reduce this, we can do some fast data-smoothing.
  // The amount of data smoothing we're doing depends on "speed".
  uint8_t dataSmoothing = 0;
  if ( speed < 50) {
    dataSmoothing = 200 - (speed * 4);
  }

  for (int i = 0; i < MAX_DIMENSION; i++) {
    int ioffset = scale * i;
    for (int j = 0; j < MAX_DIMENSION; j++) {
      int joffset = scale * j;

      uint8_t data = inoise8(x + ioffset, y + joffset, z);

      // The range of the inoise8 function is roughly 16-238.
      // These two operations expand those values out to roughly 0..255
      // You can comment them out if you want the raw noise data.
      data = qsub8(data, 16);
      data = qadd8(data, scale8(data, 39));

      if ( dataSmoothing ) {
        uint8_t olddata = noise[i][j];
        uint8_t newdata = scale8( olddata, dataSmoothing) + scale8( data, 256 - dataSmoothing);
        data = newdata;
      }

      noise[i][j] = data;
    }
  }

  z += speed;

  // apply slow drift to X and Y, just for visual variation.
  x += speed / 8;
  y -= speed / 16;
}

void mapNoiseToLEDsUsingPalette()
{
  static uint8_t ihue = 0;

  for (int i = 0; i < kMatrixWidth; i++) {
    for (int j = 0; j < kMatrixHeight; j++) {
      // We use the value at the (i,j) coordinate in the noise
      // array for our brightness, and the flipped value from (j,i)
      // for our pixel's index into the color palette.

      uint8_t index = noise[j][i];
      uint8_t bri =   noise[i][j];

      // if this palette is a 'loop', add a slowly-changing base value
      if ( colorLoop) {
        index += ihue;
      }

      // brighten up, as the color palette itself often contains the
      // light/dark dynamic range desired
      if ( bri > 127 ) {
        bri = 255;
      } else {
        bri = dim8_raw( bri * 2);
      }

      CRGB color = ColorFromPalette( currentPalette, index, bri);
      leds[XY(i, j)] = color;
    }
  }

  ihue += 1;
}

void loop() {
  // Periodically choose a new palette, speed, and scale
  ChangePaletteAndSettingsPeriodically();

  // generate noise data
  fillnoise8();

  // convert the noise data to colors in the LED array
  // using the current palette
  mapNoiseToLEDsUsingPalette();

  FastLED.show();
  // delay(10);
}



// There are several different palettes of colors demonstrated here.
//
// FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p,
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p.
//
// Additionally, you can manually define your own color palettes, or you can write
// code that creates color palettes on the fly.

// 1 = 5 sec per palette
// 2 = 10 sec per palette
// etc
#define HOLD_PALETTES_X_TIMES_AS_LONG 1

void ChangePaletteAndSettingsPeriodically()
{
  uint8_t secondHand = ((millis() / 1000) / HOLD_PALETTES_X_TIMES_AS_LONG) % 60;
  static uint8_t lastSecond = 99;

  if ( lastSecond != secondHand) {
    lastSecond = secondHand;
    if ( secondHand ==  0)  {
      currentPalette = RainbowColors_p;
      speed = 20;
      scale = 30;
      colorLoop = 1;
    }
    if ( secondHand ==  5)  {
      SetupPurpleAndGreenPalette();
      speed = 10;
      scale = 50;
      colorLoop = 1;
    }
    if ( secondHand == 10)  {
      SetupBlackAndWhiteStripedPalette();
      speed = 20;
      scale = 30;
      colorLoop = 1;
    }
    if ( secondHand == 15)  {
      currentPalette = ForestColors_p;
      speed =  8;
      scale = 120;
      colorLoop = 0;
    }
    if ( secondHand == 20)  {
      currentPalette = CloudColors_p;
      speed =  4;
      scale = 30;
      colorLoop = 0;
    }
    if ( secondHand == 25)  {
      currentPalette = LavaColors_p;
      speed =  8;
      scale = 50;
      colorLoop = 0;
    }
    if ( secondHand == 30)  {
      currentPalette = OceanColors_p;
      speed = 20;
      scale = 90;
      colorLoop = 0;
    }
    if ( secondHand == 35)  {
      currentPalette = PartyColors_p;
      speed = 20;
      scale = 30;
      colorLoop = 1;
    }
    if ( secondHand == 40)  {
      SetupRandomPalette();
      speed = 20;
      scale = 20;
      colorLoop = 1;
    }
    if ( secondHand == 45)  {
      SetupRandomPalette();
      speed = 50;
      scale = 50;
      colorLoop = 1;
    }
    if ( secondHand == 50)  {
      SetupRandomPalette();
      speed = 90;
      scale = 90;
      colorLoop = 1;
    }
    if ( secondHand == 55)  {
      currentPalette = RainbowStripeColors_p;
      speed = 30;
      scale = 20;
      colorLoop = 1;
    }
  }
}

// This function generates a random palette that's a gradient
// between four different colors.  The first is a dim hue, the second is
// a bright hue, the third is a bright pastel, and the last is
// another bright hue.  This gives some visual bright/dark variation
// which is more interesting than just a gradient of different hues.
void SetupRandomPalette()
{
  currentPalette = CRGBPalette16(
                     CHSV( random8(), 255, 32),
                     CHSV( random8(), 255, 255),
                     CHSV( random8(), 128, 255),
                     CHSV( random8(), 255, 255));
}

// This function sets up a palette of black and white stripes,
// using code.  Since the palette is effectively an array of
// sixteen CRGB colors, the various fill_* functions can be used
// to set them up.
void SetupBlackAndWhiteStripedPalette()
{
  // 'black out' all 16 palette entries...
  fill_solid( currentPalette, 16, CRGB::Black);
  // and set every fourth one to white.
  currentPalette[0] = CRGB::White;
  currentPalette[4] = CRGB::White;
  currentPalette[8] = CRGB::White;
  currentPalette[12] = CRGB::White;

}

// This function sets up a palette of purple and green stripes.
void SetupPurpleAndGreenPalette()
{
  CRGB purple = CHSV( HUE_PURPLE, 255, 255);
  CRGB green  = CHSV( HUE_GREEN, 255, 255);
  CRGB black  = CRGB::Black;

  currentPalette = CRGBPalette16(
                     green,  green,  black,  black,
                     purple, purple, black,  black,
                     green,  green,  black,  black,
                     purple, purple, black,  black );
}


//
// Mark's xy coordinate mapping code.  See the XYMatrix for more information on it.
//
uint16_t XY( uint8_t x, uint8_t y)
{
  uint16_t i;
  if ( kMatrixSerpentineLayout == false) {
    i = (y * kMatrixWidth) + x;
  }
  if ( kMatrixSerpentineLayout == true) {
    if ( y & 0x01) {
      // Odd rows run backwards
      uint8_t reverseX = (kMatrixWidth - 1) - x;
      i = (y * kMatrixWidth) + reverseX;
    } else {
      // Even rows run forwards
      i = (y * kMatrixWidth) + x;
    }
  }
  return i;
}

  

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

  项目二十五: "太平洋"柔和的蓝绿色海浪

  实验开源代码

 

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

 项目二十五: "太平洋"柔和的蓝绿色海浪

 实验接线

 Module  UNO

 VCC —— 3.3V

 GND —— GND

 DI —— D6

*/

#define FASTLED_ALLOW_INTERRUPTS 0

#include <FastLED.h>

FASTLED_USING_NAMESPACE

#define DATA_PIN      6

#define NUM_LEDS      64

#define MAX_POWER_MILLIAMPS 500

#define LED_TYPE      WS2812B

#define COLOR_ORDER     GRB

//////////////////////////////////////////////////////////////////////////

CRGB leds[NUM_LEDS];

void setup() {

 delay( 3000); // 3 second delay for boot recovery, and a moment of silence

 FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS)

 .setCorrection( TypicalLEDStrip );

 FastLED.setBrightness(30);

 FastLED.setMaxPowerInVoltsAndMilliamps( 5, MAX_POWER_MILLIAMPS);

}

void loop()

{

 EVERY_N_MILLISECONDS( 20) {

  pacifica_loop();

  FastLED.show();

 }

}

//////////////////////////////////////////////////////////////////////////

//

// The code for this animation is more complicated than other examples, and

// while it is "ready to run", and documented in general, it is probably not

// the best starting point for learning. Nevertheless, it does illustrate some

// useful techniques.

//

//////////////////////////////////////////////////////////////////////////

//

// In this animation, there are four "layers" of waves of light.

//

// Each layer moves independently, and each is scaled separately.

//

// All four wave layers are added together on top of each other, and then

// another filter is applied that adds "whitecaps" of brightness where the

// waves line up with each other more. Finally, another pass is taken

// over the led array to 'deepen' (dim) the blues and greens.

//

// The speed and scale and motion each layer varies slowly within independent

// hand-chosen ranges, which is why the code has a lot of low-speed 'beatsin8' functions

// with a lot of oddly specific numeric ranges.

//

// These three custom blue-green color palettes were inspired by the colors found in

// the waters off the southern coast of California, https://goo.gl/maps/QQgd97jjHesHZVxQ7

//

CRGBPalette16 pacifica_palette_1 =

{ 0x000507, 0x000409, 0x00030B, 0x00030D, 0x000210, 0x000212, 0x000114, 0x000117,

 0x000019, 0x00001C, 0x000026, 0x000031, 0x00003B, 0x000046, 0x14554B, 0x28AA50

};

CRGBPalette16 pacifica_palette_2 =

{ 0x000507, 0x000409, 0x00030B, 0x00030D, 0x000210, 0x000212, 0x000114, 0x000117,

 0x000019, 0x00001C, 0x000026, 0x000031, 0x00003B, 0x000046, 0x0C5F52, 0x19BE5F

};

CRGBPalette16 pacifica_palette_3 =

{ 0x000208, 0x00030E, 0x000514, 0x00061A, 0x000820, 0x000927, 0x000B2D, 0x000C33,

 0x000E39, 0x001040, 0x001450, 0x001860, 0x001C70, 0x002080, 0x1040BF, 0x2060FF

};

void pacifica_loop()

{

 // Increment the four "color index start" counters, one for each wave layer.

 // Each is incremented at a different speed, and the speeds vary over time.

 static uint16_t sCIStart1, sCIStart2, sCIStart3, sCIStart4;

 static uint32_t sLastms = 0;

 uint32_t ms = GET_MILLIS();

 uint32_t deltams = ms - sLastms;

 sLastms = ms;

 uint16_t speedfactor1 = beatsin16(3, 179, 269);

 uint16_t speedfactor2 = beatsin16(4, 179, 269);

 uint32_t deltams1 = (deltams * speedfactor1) / 256;

 uint32_t deltams2 = (deltams * speedfactor2) / 256;

 uint32_t deltams21 = (deltams1 + deltams2) / 2;

 sCIStart1 += (deltams1 * beatsin88(1011, 10, 13));

 sCIStart2 -= (deltams21 * beatsin88(777, 8, 11));

 sCIStart3 -= (deltams1 * beatsin88(501, 5, 7));

 sCIStart4 -= (deltams2 * beatsin88(257, 4, 6));

 // Clear out the LED array to a dim background blue-green

 fill_solid( leds, NUM_LEDS, CRGB( 2, 6, 10));

 // Render each of four layers, with different scales and speeds, that vary over time

 pacifica_one_layer( pacifica_palette_1, sCIStart1, beatsin16( 3, 11 * 256, 14 * 256), beatsin8( 10, 70, 130), 0 - beat16( 301) );

 pacifica_one_layer( pacifica_palette_2, sCIStart2, beatsin16( 4, 6 * 256, 9 * 256), beatsin8( 17, 40, 80), beat16( 401) );

 pacifica_one_layer( pacifica_palette_3, sCIStart3, 6 * 256, beatsin8( 9, 10, 38), 0 - beat16(503));

 pacifica_one_layer( pacifica_palette_3, sCIStart4, 5 * 256, beatsin8( 8, 10, 28), beat16(601));

 // Add brighter 'whitecaps' where the waves lines up more

 pacifica_add_whitecaps();

 // Deepen the blues and greens a bit

 pacifica_deepen_colors();

}

// Add one layer of waves into the led array

void pacifica_one_layer( CRGBPalette16& p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff)

{

 uint16_t ci = cistart;

 uint16_t waveangle = ioff;

 uint16_t wavescale_half = (wavescale / 2) + 20;

 for ( uint16_t i = 0; i < NUM_LEDS; i++) {

  waveangle += 250;

  uint16_t s16 = sin16( waveangle ) + 32768;

  uint16_t cs = scale16( s16 , wavescale_half ) + wavescale_half;

  ci += cs;

  uint16_t sindex16 = sin16( ci) + 32768;

  uint8_t sindex8 = scale16( sindex16, 240);

  CRGB c = ColorFromPalette( p, sindex8, bri, LINEARBLEND);

  leds[i] += c;

 }

}

// Add extra 'white' to areas where the four layers of light have lined up brightly

void pacifica_add_whitecaps()

{

 uint8_t basethreshold = beatsin8( 9, 55, 65);

 uint8_t wave = beat8( 7 );

 for ( uint16_t i = 0; i < NUM_LEDS; i++) {

  uint8_t threshold = scale8( sin8( wave), 20) + basethreshold;

  wave += 7;

  uint8_t l = leds[i].getAverageLight();

  if ( l > threshold) {

   uint8_t overage = l - threshold;

   uint8_t overage2 = qadd8( overage, overage);

   leds[i] += CRGB( overage, overage2, qadd8( overage2, overage2));

  }

 }

}

// Deepen the blues and greens

void pacifica_deepen_colors()

{

 for ( uint16_t i = 0; i < NUM_LEDS; i++) {

  leds[i].blue = scale8( leds[i].blue, 145);

  leds[i].green = scale8( leds[i].green, 200);

  leds[i] |= CRGB( 2, 5, 7);

 }

}

  

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

   项目二十六:简单的WS2812FX自动模式循环

  实验开源代码

 

 

/*
  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验一百四十六:64位WS2812B 8*8 xRGB 5050 LED模块 ws2812s像素点阵屏
  项目二十六:简单的WS2812FX自动模式循环
  实验接线
  Module    UNO
  VCC —— 3.3V
  GND —— GND
  DI  ——  D6
*/

#include <WS2812FX.h>

#define LED_COUNT 64
#define LED_PIN    6

#define TIMER_MS 5000

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);

unsigned long last_change = 0;
unsigned long now = 0;

void setup() {
  ws2812fx.init();
  ws2812fx.setBrightness(25);
  ws2812fx.setSpeed(1000);
  ws2812fx.setColor(0x007BFF);
  ws2812fx.setMode(FX_MODE_STATIC);
  ws2812fx.start();
}

void loop() {
  now = millis();
  ws2812fx.service();
  if(now - last_change > TIMER_MS) {
    ws2812fx.setMode((ws2812fx.getMode() + 1) % ws2812fx.getModeCount());
    last_change = now;
  }
}

  

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

   项目二十七:模拟的火焰山动画

  实验开源代码

 

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

 项目二十七:模拟的火焰山动画

 实验接线

 Module  UNO

 VCC —— 3.3V

 GND —— GND

 DI —— D6

*/

#include "FastLED.h" // be sure to install and include the FastLED lib

#include <WS2812FX.h>

#define NUM_LEDS 64

#define LED_PIN 6

WS2812FX ws2812fx = WS2812FX(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

// declare global parameters used by Fire2012

bool gReverseDirection = false;

void setup() {

 Serial.begin(115200);

 // init WS2812FX to use a custom effect

 ws2812fx.init();

 ws2812fx.setBrightness(25);

 ws2812fx.setColor(BLUE);

 ws2812fx.setSpeed(1000);

 ws2812fx.setMode(FX_MODE_CUSTOM);

 ws2812fx.setCustomMode(myCustomEffect);

 ws2812fx.start();

}

void loop() {

 ws2812fx.service();

}

// in the custom effect run the Fire2012 algorithm

uint16_t myCustomEffect() {

 Fire2012();

 // return the animation speed based on the ws2812fx speed setting

 return (ws2812fx.getSpeed() / NUM_LEDS);

}

/*

  paste in the Fire2012 code with a small edit at the end which uses the

  setPixelColor() function to copy the color data to the ws2812fx instance.

*/

// Fire2012 by Mark Kriegsman, July 2012

// as part of "Five Elements" shown here: http://youtu.be/knWiGsmgycY

////

// This basic one-dimensional 'fire' simulation works roughly as follows:

// There's a underlying array of 'heat' cells, that model the temperature

// at each point along the line. Every cycle through the simulation,

// four steps are performed:

// 1) All cells cool down a little bit, losing heat to the air

// 2) The heat from each cell drifts 'up' and diffuses a little

// 3) Sometimes randomly new 'sparks' of heat are added at the bottom

// 4) The heat from each cell is rendered as a color into the leds array

//   The heat-to-color mapping uses a black-body radiation approximation.

//

// Temperature is in arbitrary units from 0 (cold black) to 255 (white hot).

//

// This simulation scales it self a bit depending on NUM_LEDS; it should look

// "OK" on anywhere from 20 to 100 LEDs without too much tweaking.

//

// I recommend running this simulation at anywhere from 30-100 frames per second,

// meaning an interframe delay of about 10-35 milliseconds.

//

// Looks best on a high-density LED setup (60+ pixels/meter).

//

//

// There are two main parameters you can play with to control the look and

// feel of your fire: COOLING (used in step 1 above), and SPARKING (used

// in step 3 above).

//

// COOLING: How much does the air cool as it rises?

// Less cooling = taller flames. More cooling = shorter flames.

// Default 50, suggested range 20-100

#define COOLING 55

// SPARKING: What chance (out of 255) is there that a new spark will be lit?

// Higher chance = more roaring fire. Lower chance = more flickery fire.

// Default 120, suggested range 50-200.

#define SPARKING 120

void Fire2012()

{

 // Array of temperature readings at each simulation cell

 static byte heat[NUM_LEDS];

 // Step 1. Cool down every cell a little

 for ( int i = 0; i < NUM_LEDS; i++) {

  heat[i] = qsub8( heat[i], random8(0, ((COOLING * 10) / NUM_LEDS) + 2));

 }

 // Step 2. Heat from each cell drifts 'up' and diffuses a little

 for ( int k = NUM_LEDS - 1; k >= 2; k--) {

  heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;

 }

 // Step 3. Randomly ignite new 'sparks' of heat near the bottom

 if ( random8() < SPARKING ) {

  int y = random8(7);

  heat[y] = qadd8( heat[y], random8(160, 255) );

 }

 // Step 4. Map from heat cells to LED colors

 for ( int j = 0; j < NUM_LEDS; j++) {

  CRGB color = HeatColor( heat[j]);

  int pixelnumber;

  if ( gReverseDirection ) {

   pixelnumber = (NUM_LEDS - 1) - j;

  } else {

   pixelnumber = j;

  }

  // **** modified for use with WS2812FX ****

  //leds[pixelnumber] = color;

  ws2812fx.setPixelColor(pixelnumber, color.red, color.green, color.blue);

  // **** modified for use with WS2812FX ****

 }

}

  

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

  项目二十八:随机追逐的彗星效果

  实验开源代码

 

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

 项目二十八:随机追逐的彗星效果

 实验接线

 Module  UNO

 VCC —— 3.3V

 GND —— GND

 DI —— D6

*/

#include <WS2812FX.h>

#define LED_COUNT 64

#define LED_PIN  6

WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {

 Serial.begin(115200);

 ws2812fx.init();

 ws2812fx.setBrightness(25);

 // segment 0 is the builtin comet effect

 ws2812fx.setSegment(0, 0,      LED_COUNT / 2 - 1, FX_MODE_COMET, RED, 1000, false);

 // segment 1 is our custom effect

 ws2812fx.setCustomMode(myCustomEffect);

 ws2812fx.setSegment(1, LED_COUNT / 2, LED_COUNT - 1,  FX_MODE_CUSTOM, RED, 50, false);

 ws2812fx.start();

}

void loop() {

 ws2812fx.service();

}

uint16_t myCustomEffect(void) { // random chase

 WS2812FX::Segment* seg = ws2812fx.getSegment(); // get the current segment

 for (uint16_t i = seg->stop; i > seg->start; i--) {

  ws2812fx.setPixelColor(i, ws2812fx.getPixelColor(i - 1));

 }

 uint32_t color = ws2812fx.getPixelColor(seg->start + 1);

 int r = random(6) != 0 ? (color >> 16 & 0xFF) : random(256);

 int g = random(6) != 0 ? (color >> 8 & 0xFF) : random(256);

 int b = random(6) != 0 ? (color    & 0xFF) : random(256);

 ws2812fx.setPixelColor(seg->start, r, g, b);

 return seg->speed; // return the delay until the next animation step (in msec)

}

  

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

  项目二十九:自定义效果的演示

  实验开源代码

 

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十八:64位 WS2812B8*8 xRGB 5050 LED模块 ws2812s像素点阵屏

 项目二十九:自定义效果的演示

 实验接线

 Module  UNO

 VCC —— 3.3V

 GND —— GND

 DI —— D6

*/

#include <WS2812FX.h>

//include the custom effects

//#include "custom/BlockDissolve.h"

#include "custom/DualLarson.h"

//#include "custom/MultiComet.h"

//#include "custom/Oscillate.h"

//#include "custom/RainbowLarson.h"

//#include "custom/RandomChase.h"

//#include "custom/TriFade.h"

//#include "custom/VUMeter.h"

#define LED_COUNT 64

#define LED_PIN  6

WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {

 Serial.begin(115200);

  

 ws2812fx.init();

 ws2812fx.setBrightness(25);

 // setup the custom effects

 uint8_t dualLarsonMode = ws2812fx.setCustomMode(F("Dual Larson"), dualLarson);

 uint32_t colors[] = {RED, BLUE, WHITE};

 ws2812fx.setSegment(0, 0, LED_COUNT - 1, dualLarsonMode, colors, 2000, FADE_SLOW);

 ws2812fx.start();

}

void loop() {

 ws2812fx.service();

}

  

Arduino实验场景图