1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > arduino学习——WS2812灯带

arduino学习——WS2812灯带

时间:2021-03-30 12:05:45

相关推荐

arduino学习——WS2812灯带

WS2812灯带程序

简介示例程序程序拓展(1)程序拓展(2)拓展程序(3)---fill_solid()函数灯带颜色的设置(1)CRGB RGBcolorName(rVal,gVal,bVal);CHSV颜色设置示例程序拓展(1)程序拓展(2)fill_rainbow()函数示例fill_gradient()函数示例palette色板示例自定义色板ColorFromPalette()函数fadeToBlacBy()函数FastLED.setBrightness()函数random8()函数beatsin8()函数EVERY_N_SECONDS()函数自定义addGlitter()函数LED灯带项目

简介

关于WS2812的简介看这里(/STCode_G/article/details/111652978?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162858277116780269855155%2522%252C%2522scm%2522%253A%25220713.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 128uint8_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-) –

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“位于所有的变量之后,而我的则是写在代买开头,修改后也确实可行,但我不懂这个问题,网上也没查到,所以写在这里有机会请教大佬。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。