1. 安装 Adafruit_NeoPixel 库

Github地址:Adafruit_NeoPixel

打开 Arduino, 项目 -> 加载库 -> 管理库,在搜索框中输入 “Adafruit_NeoPixel”,单击 安装 即可;

2.打开项目

安装成功后在 Arduino 可看到已加载 Adafruit NeoPixel 库

3.线路连接

D6 连接绿色线,

 

// NeoPixel 测试程序,展示如何使用 WHITE 通道来控制 RGBW 灯条
// 仅适用于 RGBW 型号的灯条(在普通的 RGB 灯条上显示效果不佳)。

#include <Arduino.h>
#ifdef ESP8266  // 添加 ESP8266 特有的头文件和定义
  #include <ESP8266WiFi.h>
  #define LED_PIN D6 // NodeMCU 的 D6 引脚,对应 ESP8266 的 GPIO12
#else
  #define LED_PIN 6    // 如果不是 ESP8266,则使用默认的引脚 6
#endif

#include <FastLED.h> //包含FastLED库

// 连接到 Arduino 的 NeoPixel 灯珠数量
#define NUM_LEDS  60  // 使用更通用的名称 NUM_LEDS

// NeoPixel 灯条的亮度,范围从 0 (最小) 到 255 (最大)
#define BRIGHTNESS 50 // 设置亮度为最大值的 1/5 (max = 255)

// 声明 NeoPixel 灯条对象:
CRGB leds[NUM_LEDS];  // 定义一个 CRGB 数组,用于存储灯珠颜色数据

uint8_t gHue = 0; // 全局色相变量,用于颜色循环
#define FADE_AMOUNT 1 // 定义渐变量,数值越大,渐变越快
#define RAINBOW_SPEED 1 //彩虹速度,值越小,速度越慢
#define CHANGE_INTERVAL 5000 // 颜色改变间隔,单位毫秒
#define CHANCE_OF_GLITTER 10 // 闪烁概率,0-255,值越大概率越高

//定义一个全局变量保存上一次的模式
int previousMode = -1;
unsigned long lastChangeTime = 0;

// 颜色模式函数
void addGlitter( fract8 chanceOfGlitter) {
  if( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}

void confetti() {
  // 随机彩色斑点,闪烁并平滑淡入
  fadeToBlackBy( leds, NUM_LEDS, 10);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV( gHue + random8(64), 200, 255);
}

void sinelon() {
  // 彩色点来回扫描,带有淡化轨迹
  fadeToBlackBy( leds, NUM_LEDS, 20);
  int pos = beatsin16( 13, 0, NUM_LEDS-1 );
  leds[pos] += CHSV( gHue, 255, 192);
}

void bpm() {
  // 彩色条纹以定义的每分钟节拍数 (BPM) 跳动
  uint8_t BeatsPerMinute = 62;
  CRGBPalette16 palette = PartyColors_p;
  uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
  for( int i = 0; i < NUM_LEDS; i++) { //9948
    leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
  }
}

void juggle() {
  // 八个彩色点,彼此交织并不同步
  fadeToBlackBy( leds, NUM_LEDS, 20);
  byte dothue = 0;
  for( int i = 0; i < 8; i++) {
    leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255);
    dothue += 32;
  }
}

void rainbowGlitter() {
  rainbow();
  addGlitter(CHANCE_OF_GLITTER);
}

//彩虹色填充函数
void rainbow() {
  for( int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CHSV( gHue + i * 256 / NUM_LEDS, 255, 255);
  }
}


// 随机选择颜色模式
void randomColorMode() {
  static CRGB target_leds[NUM_LEDS]; // static 保证只初始化一次

    // 使用一个更长的间隔时间来切换颜色模式
    if (millis() - lastChangeTime >= CHANGE_INTERVAL) {

        int mode = random(7); // 随机选择 0 到 6

        // 避免连续选择相同的模式
        while(mode == previousMode){
            mode = random(7);
        }
        previousMode = mode;

        //生成新的目标颜色
        switch (mode) {
            case 0:
                confetti();
                break;
            case 1:
                sinelon();
                break;
            case 2:
                bpm();
                break;
            case 3:
                juggle();
                break;
            case 4:
                addGlitter(80);
                break;
            case 5:
                fill_solid(target_leds, NUM_LEDS, CHSV(random8(), 255, 255));
                break;
            case 6:
                rainbowGlitter(); // 彩虹色加闪烁
                break;
        }

        //将目标颜色数据赋值给target_leds
        for(int i = 0; i < NUM_LEDS; i++){
            target_leds[i] = leds[i]; //复制当前leds的状态到目标
        }

        lastChangeTime = millis(); // 更新上次改变时间
    }

    //渐变过渡到目标颜色
    for(int i = 0; i < NUM_LEDS; i++){
        nblend(leds[i], target_leds[i], FADE_AMOUNT); //渐变,每次改变FADE_AMOUNT
    }
}

void loop() {
  randomColorMode(); // 运行随机颜色模式
  FastLED.show();    // 显示颜色
  FastLED.delay(10); // 适当的延迟

  gHue += RAINBOW_SPEED; // 增加全局色相,实现颜色循环
}

void setup() { // 确保 setup 函数存在
  FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS); // 初始化 FastLED 库
  FastLED.setBrightness(BRIGHTNESS);                    // 设置全局亮度
  randomSeed(analogRead(0)); // 随机数种子初始化

}