arduino学习——WS2812灯带

简介

关于WS2812的简介看这里(https://blog.csdn.net/STCode_G/article/details/111652978?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162858277116780269855155%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162858277116780269855155&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-111652978.first_rank_v2_pc_rank_v29&utm_term=ws2812%E7%81%AF%E5%B8%A6&spm=1018.2226.3001.4187)

示例程序

#include <FastLED.h>    
#define DATA_PIN 3    //设置引脚
#define LED_TYPE WS2812   //灯带类型
#define NUM_LEDS 30  //灯珠数量 
#define COLOR_ORDER GRB  //灯珠顺序
#define BRIGHTNESS 128
uint8_t max_brightness=128;  //最大亮度

CRGB leds[NUM_LEDS];   // 给灯带命名
void setup() {
  // put your setup code here, to run once:
    FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds,NUM_LEDS);  //初始化灯带
    FastLED.setBrightness(max_brightness);  //设置灯带亮度

}

void loop() {
  // put your main code here, to run repeatedly:
for (int i=0;i<=29;i++){
  leds[i]= CRGB::Red;
  FastLED.show();
  delay(100);

  leds[i]=CRGB::Black;
  FastLED.show();
  delay(100);  //实例从第一个灯带起亮红色然后熄灭
}
}

程序拓展(1)

void loop() {
  // put your main code here, to run repeatedly:
  for (int i=0;i<=29;i++){
  myled[i]=CRGB::Green;
  FastLED.show();
  delay(25);
  }
  for (int i=0;i<=29;i++){
    myled[i]=CRGB::Black;
    FastLED.show();
    delay(25);
  }
}

程序会从第一个灯依次点亮直到最后一颗灯,然后又从第一颗灯熄灭

程序拓展(2)

void loop(){
  for (int i=1;i<=28;i++){
  myled[i-1]=CRGB::Red;
  myled[i]=CRGB::Red;
  myled[i+1]=CRGB::Red;

  myled[i-1]=CRGB::Green;
  myled[i]=CRGB::Green;
  myled[i+1]=CRGB::Green;

  myled[i-1]=CRGB::Blue;
  myled[i]=CRGB::Blue;
  myled[i+1]=CRGB::Blue;

  myled[i-1]=CRGB::Black;
  myled[i]=CRGB::Black;
  myled[i+1]=CRGB::Black;
  }
}

示例程序每三个依次闪烁红绿蓝

拓展程序(3)—fill_solid()函数

void loop() {
  // put your main code here, to run repeatedly:
  fill_solid(myled,30,CRGB::Green);
  FastLED.show();
  delay(100);

  fill_solid(myled,30,CRGB::Black);
  FastLED.show();
  delay(100);

  fill_solid(myled,30,CRGB::Red);
  FastLED.show();
  delay(100);

  fill_solid(myled,30,CRGB::Black);
  FastLED.show();
  delay(100);

  fill_solid(myled,30,CRGB::Blue);
  FastLED.show();
  delay(100);

  fill_solid(myled,30,CRGB::Black);
  FastLED.show();
  delay(100);

}

让所有灯珠以红绿蓝顺序同步点亮闪烁

fill_solid(myled+3,3,CRGB::Red);

该代码可使第四个灯珠以后的三个灯珠连续闪烁红绿蓝,同样的,我们可以加一个for循环让它动起来

void loop() {
  // put your main code here, to run repeatedly:
  for (int i=0;i<=26;i++){
  fill_solid(myled+i,3,CRGB::Green);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Black);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Red);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Black);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Blue);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Black);
  FastLED.show();
  delay(25);
  }
}
void loop() {
  // put your main code here, to run repeatedly:
  for (int i=0;i<=NUM_LEDS-3;i++){
  fill_solid(myled+i,3,CRGB::Green);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Black);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Red);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Black);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Blue);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Black);
  FastLED.show();
  delay(25);
  }

  for (int i=NUM_LEDS-3;i>=0;i--){
  fill_solid(myled+i,3,CRGB::Green);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Black);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Red);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Black);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Blue);
  FastLED.show();
  delay(25);

  fill_solid(myled+i,3,CRGB::Black);
  FastLED.show();
  delay(25);
  }
}

灯带颜色的设置

(1)CRGB RGBcolorName(rVal,gVal,bVal);

此为RGB自定义颜色
FastLED颜色名称列表:
CRGB::AliceBlue
CRGB::Amethyst
CRGB::AntiqueWhite
CRGB::Aqua
CRGB::Aquamarine
CRGB::Azure
CRGB::Beige
CRGB::Bisque
CRGB::Black
CRGB::BlanchedAlmond
CRGB::Blue
CRGB::BlueViolet
CRGB::Brown
CRGB::BurlyWood
CRGB::CadetBlue
CRGB::Chartreuse
CRGB::Chocolate
CRGB::Coral
CRGB::CornflowerBlue
CRGB::Cornsilk
CRGB::Crimson
CRGB::Cyan
CRGB::DarkBlue
CRGB::DarkCyan
CRGB::DarkGoldenrod
CRGB::DarkGray
CRGB::DarkGreen
CRGB::DarkKhaki
CRGB::DarkMagenta
CRGB::DarkOliveGreen
CRGB::DarkOrange
CRGB::DarkOrchid
CRGB::DarkRed
CRGB::DarkSalmon
CRGB::DarkSeaGreen
CRGB::DarkSlateBlue
CRGB::DarkSlateGray
CRGB::DarkTurquoise
CRGB::DarkViolet
CRGB::DeepPink
CRGB::DeepSkyBlue
CRGB::DimGray
CRGB::DodgerBlue
CRGB::FireBrick
CRGB::FloralWhite
CRGB::ForestGreen
CRGB::Fuchsia
CRGB::Gainsboro
CRGB::GhostWhite
CRGB::Gold
CRGB::Goldenrod
CRGB::Gray
CRGB::Green
CRGB::GreenYellow
CRGB::Honeydew
CRGB::HotPink
CRGB::IndianRed
CRGB::Indigo
CRGB::Ivory
CRGB::Khaki
CRGB::Lavender
CRGB::LavenderBlush
CRGB::LawnGreen
CRGB::LemonChiffon
CRGB::LightBlue
CRGB::LightCoral
CRGB::LightCyan
CRGB::LightGoldenrodYellow
CRGB::LightGreen
CRGB::LightGrey
CRGB::LightPink
CRGB::LightSalmon
CRGB::LightSeaGreen
CRGB::LightSkyBlue
CRGB::LightSlateGray
CRGB::LightSteelBlue
CRGB::LightYellow
CRGB::Lime
CRGB::LimeGreen
CRGB::Linen
CRGB::Magenta
CRGB::Maroon
CRGB::MediumAquamarine
CRGB::MediumBlue
CRGB::MediumOrchid
CRGB::MediumPurple
CRGB::MediumSeaGreen
CRGB::MediumSlateBlue
CRGB::MediumSpringGreen
CRGB::MediumTurquoise
CRGB::MediumVioletRed
CRGB::MidnightBlue
CRGB::MintCream
CRGB::MistyRose
CRGB::Moccasin
CRGB::NavajoWhite
CRGB::Navy
CRGB::OldLace
CRGB::Olive
CRGB::OliveDrab
CRGB::Orange
CRGB::OrangeRed
CRGB::Orchid
CRGB::PaleGoldenrod
CRGB::PaleGreen
CRGB::PaleTurquoise
CRGB::PaleVioletRed
CRGB::PapayaWhip
CRGB::PeachPuff
CRGB::Peru
CRGB::Pink
CRGB::Plaid
CRGB::Plum
CRGB::PowderBlue
CRGB::Purple
CRGB::Red
CRGB::RosyBrown
CRGB::RoyalBlue
CRGB::SaddleBrown
CRGB::Salmon
CRGB::SandyBrown
CRGB::SeaGreen
CRGB::Seashell
CRGB::Sienna
CRGB::Silver
CRGB::SkyBlue
CRGB::SlateBlue
CRGB::SlateGray
CRGB::Snow
CRGB::SpringGreen
CRGB::SteelBlue
CRGB::Tan
CRGB::Teal
CRGB::Thistle
CRGB::Tomato
CRGB::Turquoise
CRGB::Violet
CRGB::Wheat
CRGB::White
CRGB::WhiteSmoke
CRGB::Yellow
CRGB::YellowGreen
(2)HSV颜色表达方法
HSV颜色简介
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色表达方法。该方法中的三个参数分别是:色调(H),饱和度(S),明亮度(V)。

HSV参数
色调H
HSV颜色之色调(H)
HSV颜色之色调(H)

色调参数取值范围为0~255。如上图所示,从红色开始按逆时针方向计算。红色为0,绿色为85,蓝色为170。
饱和度S
饱和度S表示颜色接近光谱色的程度。取值范围为0~255,值越大,颜色越饱和(越接近本色)。值越小,颜色越接近白色。当数值为零时,颜色为白色。

明亮度V
明亮度V表示颜色明亮的程度,取值范围为0~255。对于FastLED库来说,该数值越大,则控制光带的亮度越亮。反之数值越小,则控制光带的亮度越低。当数值为零时,光带完全熄灭。

CHSV HSVcolorName(hVal, sVal, vVal)

参数
hVal – 色调数值
sVal – 饱和度数值
vVal – 明亮度数值

CHSV颜色设置示例

CHSV myHSVcolor(0,200,200);
void loop() {
  // put your main code here, to run repeatedly:
  myHSVcolor.h++;
  fill_solid(myled,30,myHSVcolor);
  FastLED.show();
  delay(10);
}

将产生从0—255的渐变色

程序拓展(1)

void loop() {
  // put your main code here, to run repeatedly:
  for(int i=0;i<NUM_LEDS-1;i++){
    fill_solid(myled+i,1,myHSVcolor);
    FastLED.show();
    delay(100);
    myHSVcolor.h+=2;
  }
  
  for (int i=NUM_LEDS-1;i>=0;i--){
    fill_solid(myled+i,1,myHSVcolor);
    FastLED.show();
    delay(100);
    myHSVcolor.h+=2;
  }

}

这套代码可以使灯带产生依次渐变色,每种颜色从第一个灯珠开始从头到尾从未到头渐变,

程序拓展(2)

void loop() {
  // put your main code here, to run repeatedly:
  myHSVcolor.h+=20;
  for(int i=0;i<NUM_LEDS-3;i++){
    fill_solid(myled+i,3,myHSVcolor);
    FastLED.show();
    delay(100);
    fill_solid(myled+i,3,CRGB::Black);
  }
  myHSVcolor.h+=20;
  for (int i=NUM_LEDS-3;i>=0;i--){
    fill_solid(myled+i,3,myHSVcolor);
    FastLED.show();
    delay(100);
    fill_solid(myled+i,3,CRGB::Black);
  }

}

这套代码可使灯带每次亮三个灯珠,显示出弹簧灯的效果

fill_rainbow()函数

fill_rainbow(leds, 30, beginHue, deltaHue)
以上语句将leds光带的从头数30个灯珠设置为渐变彩虹色。beginHue参数为起始色调数值。deltaHue为相邻LED灯珠色调差。

fill_rainbow(leds+5, 30, 0, 1)
以上语句将leds光带的从头数30个灯珠设置为渐变彩虹色。起始色调数值为0。相邻LED灯珠色调差为1。

示例

uint8_t beginHue;
void loop() {
  // put your main code here, to run repeatedly:
  beginHue++;
  fill_rainbow(myled,30,beginHue,9);
  FastLED.show();
  delay(25);

}

灯带会以渐变彩虹显示

fill_gradient()函数

fill_gradient_RGB(leds, 0, CRGB::Red, 29, CRGB::Blue)
以上语句将leds光带的从头数30个灯珠设置为渐变色。灯带头部起始颜色为红色。灯带尾部结束颜色为蓝色。灯带中间为由红色到蓝色的渐变色。

fill_gradient(leds, 0, CHSV(50, 255,255) , 29, CHSV(150,255,255), SHORTEST_HUES)
以上语句将leds光带的从头数30个灯珠设置为渐变色。灯带头部起始颜色为HSV(50, 255,255)色彩。灯带尾部结束颜色为CHSV(150,255,255)色彩。灯带颜色过度采用短色调过渡方式。

fill_gradient(leds, 0, CHSV(50, 255,255) , 29, CHSV(150,255,255), LONGEST_HUES)
以上语句将leds光带的从头数30个灯珠设置为渐变色。灯带头部起始颜色为HSV(50, 255,255)色彩。灯带尾部结束颜色为CHSV(150,255,255)色彩。灯带颜色过度采用长色调过渡方式。

示例

void loop() {
  // put your main code here, to run repeatedly:
  fill_gradient(myled,0,CHSV(15,200,200),29,CHSV(100,200,200),LONGEST_HUES);
  FastLED.show();
  delay(25);

}

palette色板

(1)FastLED库函数fill_palette()函数
fill_palette (leds, 30, 0, 8, OceanColors_p, 255, LINEARBLEND )
以上语句将leds光带的从头数30个灯珠设置为渐变色。渐变色的色彩全部来自FastLED预设色板OceanColors_p。灯带头部第一个灯珠的色板色彩序号为0,相邻的两个灯珠见色板色彩序列号差8。色彩过渡为线性过渡效果。

fill_palette(leds+5, 15, 31, 5, ForestColors_p, 255, LINEARBLEND );
以上语句将leds光带从头数的第6个灯带开始15个灯珠设置为渐变色。渐变色的色彩全部来自FastLED预设色板ForestColors_p。起始色板色彩序号为31,相邻的两个灯珠见色板色彩序列号差5。色彩过渡为线性过渡效果。
系统预设色板列表
FastLED库配有8种预设色板。:
CloudColors_p
LavaColors_p
OceanColors_p
ForestColors_p
RainbowColors_p
RainbowStripeColors_p
PartyColors_p
HeatColors_p

示例

uint8_t startIndex;
void loop() {
  // put your main code here, to run repeatedly:
  startIndex++;
  fill_palette(myled,NUM_LEDS,startIndex,8,ForestColors_p,255,LINEARBLEND);
  FastLED.show();
  delay(25);

}

产生一个流动灯效果

自定义色板

用户自定义色板
用户自定义RGB色板
CRGBPalette16 myColorPalette = CRGBPalette16(
CRGB::Green, CRGB::Green, CRGB::Black, CRGB::Black,
CRGB::Purple, CRGB::Purple, CRGB::Black, CRGB::Black,
CRGB::Green, CRGB::Green, CRGB::Black, CRGB::Black,
CRGB::Purple, CRGB::Purple, CRGB::Black, CRGB::Black );

用户自定义HSV色板
CHSVPalette16 myColorPalette = CHSVPalette16 myHSVColorPalette = CHSVPalette16 (
CHSV(0, 255, 200), CHSV(15, 255, 200), CHSV(31, 255, 200), CHSV(47, 255, 200),
CHSV(0, 255, 0), CHSV(15, 255, 0), CHSV(31, 255, 0), CHSV(47, 255, 0),
CHSV(0, 255, 200), CHSV(15, 255, 200), CHSV(31, 255, 200), CHSV(47, 255, 200),
CHSV(0, 0, 200), CHSV(15, 0, 200), CHSV(31, 0, 200), CHSV(47, 0, 200));

用户自定义PROGMEM色板
const TProgmemPalette16 myProgmemPalette PROGMEM = {
CRGB::Red, CRGB::Gray, CRGB::Blue, CRGB::Black,
CRGB::Red, CRGB::Gray, CRGB::Blue, CRGB::Black,
CRGB::Red, CRGB::Red, CRGB::Gray, CRGB::Gray,
CRGB::Blue, CRGB::Blue, CRGB::Black, CRGB::Black };

ColorFromPalette()函数

leds[0] = ColorFromPalette( RainbowColors_p, 0, 128, LINEARBLEND);
以上语句将leds光带的第一个灯珠设置为RainbowColors_p色板中颜色序号为0的颜色(红色)。LED亮度为128。色彩过渡为线性过渡效果(LINEARBLEND)。

leds[9] = ColorFromPalette( OceanColors_p, 120, 255, LINEARBLEND);
以上语句将leds光带的第十个灯珠设置为OceanColors_p色板中颜色序号为120的颜色。LED亮度为255。色彩过渡为线性过渡效果(LINEARBLEND)。

fadeToBlacBy()函数

fadeToBlackBy( leds, 30, 10);
以上语句将leds光带的30个灯珠亮度调低10。(注:LED亮度值可选数值范围为0 – 255)

FastLED.setBrightness()函数

FastLED.setBrightness(128);
以上语句将LED亮度设置为128。该亮度为最大亮度(255)的一半左右

random8()函数

random8函数将返回0-255之间的随机数值。返回值最大值可以设置为自定义的0-255间数值
random8()
以上语句将返回0-255之间的随机数值。

random8(10)
以上语句将返回0-9之间的随机数值。

beatsin8()函数

beatsin8可以视作一个信号发生器。它的返回值会沿着正弦曲线返回数值。
参数
beats_per_minute: 每分钟产生循环次数
lowest: 最小值
lowest: 最大值

示例语句
以下图示为 beatsin8(10, 0, 255) 返回值示意图。↓
这一示例语句中第一个参数为10。这说明此函数所产生的正弦曲线周期时间为6秒(1分钟有60秒,60除以参数10等于6秒钟)。第二个参数为0。这说明此函数所产生的正弦曲线最小返回值为0(如图中绿色数字所示)。第三个参数为255。这说明此函数所产生的正弦曲线最大返回值为255(如图中红色数字所示)。
在这里插入图片描述
以下图示为 beatsin8(20, 90, 100) 返回值示意图。↓
这一示例语句修改了上面的示例语句的第一个参数。因此示意图中正弦曲线周期时间由6秒变为3秒(如图中绿色蓝字所示)。
在这里插入图片描述

EVERY_N_SECONDS()函数

EVERY_N_SECONDS函数所包含的程序内容将定时执行。执行时间间隔由函数参数决定。
用法
EVERY_N_SECONDS(10)
以上函数所包含的程序内容将定时执行,执行时间间隔为10秒钟。

EVERY_N_SECONDS(1)
以上函数所包含的程序内容将定时执行,执行时间间隔为1秒钟。

自定义addGlitter()函数

void loop(){
  fill_gradient(myled,0,CHSV(50,255,255),29,CHSV(150,255,255),LONGEST_HUES);
  addGlitter(60);
  FastLED.show();
  delay(50);
}
void addGlitter(uint8_t chanceOfGlitter){
  if (random8()<chanceOfGlitter){
    myled[random8(NUM_LEDS)]=CRGB::White;
}
}

/*
– addGlitter 函数说明(WWW.TAICHI-MAKER.COM) –
random8()的返回值是0-255之间的随机整数。当random8()返回值小于
用户传递到addGlitter函数中的chanceOfGlitter参数时,Arduino将在任意
leds灯带上的任意序号灯珠(leds[ random8(NUM_LEDS) ] )上
显示白色( CRGB::White)。否则addGlitter函数将不进行任何操作而返回。

基于以上原因,如果用户传递到addGlitter函数中的chanceOfGlitter参数越大,
则产生随机点亮闪烁效果的机会也就越大。

通过以上操作,灯带将产生随机点亮LED为白色的效果,犹如星光闪烁。
*/

LED灯带项目

这一部分是将所学部分应用,并且还有我自己的一些体会和问题
首先我参考了太极创客的方法,在项目下建立库文件,这些库文件可以存放我的函数,而实现这个库文件我是用Visuo Studio这个编译软件创建源文件“xxx.h”,然后将这个文件移动到和这个项目同一个目录下面,然后将函数写在库里面,这里说一说我遇到的问题,我将#include “addglitter”写入并验证时出现了一个错误““myled” was not clear in this scope”,熟悉C语言的人都知道,这是变量范围出现了问题,之后我回看太极创客的代码,发现他的全局变量定义为struct myled[NUM_LEDS],可是还是不行,最终我一一对比我的代码和他的代码发现了一个十分细微的差别,他的代码中,#include ”addglitter“位于所有的变量之后,而我的则是写在代买开头,修改后也确实可行,但我不懂这个问题,网上也没查到,所以写在这里有机会请教大佬。