/******************头文件定义************************/
#include <FastLED.h> //加载灯带头文件
/******************头文件定义************************/
#include <Arduino.h>
/******************宏定义***********************/
#define NUM_LEDS 60 //灯珠数量
#define LED_TYPE WS2812 //灯带型号
#define COLOR_ORDER GRB //输入颜色的顺序 根据手册决定
CRGB leds[NUM_LEDS]; //构建灯珠对象
#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) //求数组长度 总长度/单个长度
/******************宏定义***********************/
/****************外部电路引脚定义**********************/
#define DATA_PIN 3 //灯带引脚定义
/****************外部电路引脚定义**********************/
/*********************变量数组等定义************************/
CHSV myHSV(80, 255, 200); //定义色板 色调,饱和度,亮度
uint8_t gCurrentPatternNumber = 0; // 函数数组下标
uint8_t gHue = 0; // 颜色转换标志位CHSV myHSV(0,255,200);//色调,饱和度,亮度 All_colors所用
uint8_t max_bright = 200; //亮度
/*********************变量数组等定义************************/
/*****************函数数组定义*********************/
typedef void (*SimplePatternList[])(); //创建函数数组指针
SimplePatternList gPatterns = {All_colors, Run_light, rainbow_run, confetti, juggle};
//循环遍历的模式列表。每个模式定义为下面的一个单独的函数。
/*****************函数数组定义*********************/
void nextPattern(void) //进入下一个函数
{
gCurrentPatternNumber = ((gCurrentPatternNumber + 1) % ARRAY_SIZE(gPatterns));
// 类似数组下标++ 取余是为了进行下一周期循环
}
void All_colors(void) //所有统一颜色渐变色
{
myHSV.h += 5; //色调每次自加
fill_solid(leds, NUM_LEDS, myHSV); //全部点亮HSV颜色
}
void rainbow_run(void) //整体流水彩虹灯
{
fill_rainbow(leds, NUM_LEDS, gHue, 9); // 1.对象 2.灯珠数量 3.起始位置 4.每加一次的色调差
}
void confetti(void) //随机位置亮随机颜色
{
fadeToBlackBy(leds, NUM_LEDS, 50); //以50的速度逐渐熄灭
leds[random8(NUM_LEDS)] = CHSV(gHue + random8(64), 200, 178); //随机灯珠亮随机颜色
// random8是随机数函数
}
void Run_light(void) //流水彩虹灯
{
uint8_t i; //自加变量
for (i = 0; i < NUM_LEDS - 3; i++) // i<总灯带数-3 为了快速反弹-3 开启循环
{
leds[i] = CHSV(i * 2, 255, 192); //第i个灯 CHSV(1.亮的颜色 2.饱和度 3.亮度)
delay(30); //速度调节
FastLED.show(); // show LED
fadeToBlackBy(leds, NUM_LEDS, 80); //以80速度逐渐熄灭
}
for (i = NUM_LEDS - 2; i > 0; i--) //往返效果
{
leds[i] = CHSV(i * 2, 255, 192); //第i个灯 CHSV(1.亮的颜色 2.饱和度 3.亮度)
delay(30); //速度调节
FastLED.show(); // show LED
fadeToBlackBy(leds, NUM_LEDS, 80); //以80速度逐渐熄灭
}
}
void juggle(void) //正弦函数灯珠渐变颜色
{
fadeToBlackBy(leds, NUM_LEDS, 20); //以20的速度逐渐熄灭
uint8_t dothue = 0; //颜色变化的变量
for (int i = 0; i < 8; i++)
{
leds[beatsin8(i + 7, 0, NUM_LEDS - 1)] = CHSV(dothue, 200, 200); //点亮的灯珠以正弦函数确定
dothue += 32; //色调加32
}
}
/*把WS2812Init放入setup函数*/
void WS2812Init(void)
{
delay(1000); //上电延迟
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
//初始化灯带模板 无需变动复制粘贴即可
FastLED.setBrightness(max_bright); //初始化亮度
}
/*把WS2812Run放入loop函数*/
void WS2812Run(void)
{
gPatterns[gCurrentPatternNumber](); //首先调用第一个函数
FastLED.show(); // show灯带
delay(50); // 运行下一个函数之间延迟
EVERY_N_MILLISECONDS(10) { gHue += 10; } // 10毫秒执行一次gHue++
EVERY_N_SECONDS(8) { nextPattern(); } // 8秒调用nextPattern();函数一次
}
/********************主函数************************/
void setup()
{
WS2812Init();
}
void loop()
{
WS2812Run();
}