零基础入门学用Arduino 第三部分(三)

重要的内容写在前面:

  1. 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。
  2. 个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路(强烈推荐先学数电,不然可能会有一些地方理解起来很困难)、模拟电路等,然后就是C++(注意C++是必学的)
  3. 文章中的代码都是跟着老师边学边敲的,不过比起老师的版本我还把注释写得详细了些,并且个人认为重要的地方都有详细的分析。
  4. 一些函数的介绍有参考太极创客官网给出的中文翻译,为了便于现查现用,把个人认为重要的部分粘贴了过来并做了一些修改。
  5. 如有错漏欢迎指正。

视频链接:3-0 本章介绍_哔哩哔哩_bilibili

太极创客官网:太极创客 – Arduino, ESP8266物联网的应用、开发和学习资料

三、LED灯带

1、FastLED库的安装

        需要说明的是,在后面FastLED库的介绍中并不会详细介绍FastLED库的全部函数,仅展示部分函数的基本使用方法,另外不必深究一些弄不清的语法。

2、WS2812 LED灯带

(1)配合RGB-LED控制芯片,Arduino只需一个数字输入/输出引脚即可控制一个RGB-LED,如果将若干个RGB-LED控制芯片串联,那么Arduino只需一个数字输入/输出引脚即可控制若干个RGB-LED。

(2)将RGB-LED控制芯片与RGB-LED集成在一起,就是数字RGB-LED,虽然它与普通的RGB-LED一样有四个引脚,但二者的功能却不一样,数字RGB-LED的引脚功能取决于集成在它内部的芯片型号。下图所示的是WS2812(B) LED示意图,图中未说明的两个引脚,较短的一个接5V电源,较长的一个接GND,灯带中灯珠的供电电路连接方式为并联,控制信号电路的连接方式为串联,每一个WS2812 LED灯珠需60mA的电流才能达到最大亮度。

(3)下图所示的是WS2812(B) LED灯带实物。当不需要太长的灯带时,可以沿着灯带上的切割线(有一个剪刀图标)进行剪裁,然后自行在裁剪处焊接插针,不会影响灯带的正常使用。

3、使用Arduino控制LED灯带的电路

(1)开发时的Arduino控制LED电路如下图所示。

(2)使用时的Arduino控制LED电路(当USB未连接电脑时,Arduino可通过+5V引脚由电源模块进行供电)如下图所示。

4、FastLED库使用——基本点灯操作

(1)单个灯珠闪烁:

#include "FastLED.h"            //此程序需要使用FastLED库

#define NUM_LEDS 30             //LED灯珠数量
#define DATA_PIN 9              //Arduino输出控制信号引脚
#define LED_TYPE WS2812         //LED灯带型号
#define COLOR_ORDER GRB         //RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128;       //LED亮度控制变量,可使用数值为0~255,数值越大,光带亮度越高

CRGB leds[NUM_LEDS];            //为每个LED灯珠建立对象,将它们存放在数组leds中

void setup() 
{ 
  Serial.begin(9600);           //启动串行通讯
  delay(1000);                  //稳定性等待
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  //初始化灯带对象(不必纠结C++语法) 
  FastLED.setBrightness(max_bright);                              //设置灯带亮度 
}

void loop() 
{ 
  leds[0] = CRGB::Red;      //设置灯带中第一个灯珠颜色为红色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
  FastLED.show();           //更新LED色彩
  delay(500);               //等待500毫秒

  leds[0] = CRGB::Black;    //设置灯带中第一个灯珠颜色为黑色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
  FastLED.show();           //更新LED色彩
  delay(500);               //等待500毫秒  
}

①首先使用addLeds函数对灯带数组leds进行初始化,其中尖括号中的参数依次是灯带型号、输出灯带控制信号的Arduino引脚号、RGB灯珠中红绿蓝三种颜色的LED排列顺序,小括号中的参数依次是灯珠对象数组和灯珠数量;然后使用setBrightness函数设置灯带亮度,这个函数的作用不是点灯,而是设置当灯被点亮后的亮度参数。

②颜色参数的表示方式为“CRGB::<颜色名>”(Black表示熄灭灯珠),可以直接将颜色参数赋值给灯珠对象,然后使用show函数更新灯带的显示。

③对于灯珠对象数组,leds[0]控制灯带的第一个灯珠,leds[1]控制灯带的第二个灯珠,以此类推,通过反复让leds[0]在红色和黑色之间徘徊,可实现第一个灯珠闪烁的效果。

(2)一个光点顺着灯带“运动”:

#include "FastLED.h"            //此程序需要使用FastLED库

#define NUM_LEDS 30             //LED灯珠数量
#define DATA_PIN 9              //Arduino输出控制信号引脚
#define LED_TYPE WS2812         //LED灯带型号
#define COLOR_ORDER GRB         //RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128;       //LED亮度控制变量,可使用数值为0~255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS];            //为每个LED灯珠建立对象,将它们存放在数组leds中

void setup() 
{ 
  Serial.begin(9600);           //启动串行通讯
  delay(1000);                  //稳定性等待
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  //初始化灯带对象
  FastLED.setBrightness(max_bright);                              //设置灯带亮度
}

void loop() 
{ 
  //依次点亮和熄灭灯带中灯珠,产生"光点移动"效果
  for (int i = 0; i <= NUM_LEDS; i++) 
  {
    leds[i] = CRGB::Red;
    FastLED.show();     //第i个灯珠显示红色
    delay(50);
    leds[i] = CRGB::Black;
    FastLED.show();     //第i个灯珠熄灭
    delay(50);    
  }
  delay(500);
}

①首先使用addLeds函数对灯带数组leds进行初始化,其中尖括号中的参数依次是灯带型号、输出灯带控制信号的Arduino引脚号、RGB灯珠中红绿蓝三种颜色的LED排列顺序,小括号中的参数依次是灯珠对象数组和灯珠数量;然后使用setBrightness函数设置灯带亮度,这个函数的作用不是点灯,而是设置当灯被点亮后的亮度参数。

②颜色参数的表示方式为“CRGB::<颜色名>”(Black表示熄灭灯珠),可以直接将颜色参数赋值给灯珠对象,然后使用show函数更新灯带的显示。

③对于灯珠对象数组,leds[0]控制灯带的第一个灯珠,leds[1]控制灯带的第二个灯珠,以此类推,使用for循环顺序遍历leds数组,每轮循环都仅控制一个灯珠的亮灭,由此可以实现依次点亮和熄灭灯带中灯珠,产生“光点移动”效果。

(3)一个变色的光点顺着灯带“运动”:

#include "FastLED.h"            //此程序需要使用FastLED库

#define NUM_LEDS 30             //LED灯珠数量
#define DATA_PIN 9              //Arduino输出控制信号引脚
#define LED_TYPE WS2812         //LED灯带型号
#define COLOR_ORDER GRB         //RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128;       //LED亮度控制变量,可使用数值为0~255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS];            //为每个LED灯珠建立对象,将它们存放在数组leds中

void setup() 
{ 
  Serial.begin(9600);           //启动串行通讯
  delay(1000);                  //稳定性等待
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  //初始化灯带对象
  FastLED.setBrightness(max_bright);                              //设置灯带亮度
}

void loop() 
{ 
  //依次使用不同色彩点亮单个LED灯珠
  for (int i = 0; i <= NUM_LEDS; i++) 
  {
    leds[i] = CRGB::Red;
    FastLED.show();         //第i个灯珠显示红色
    delay(20);
    leds[i] = CRGB::Green;
    FastLED.show();         //第i个灯珠显示绿色
    delay(20);   
    leds[i] = CRGB::Blue;
    FastLED.show();         //第i个灯珠显示蓝色
    delay(20);      
    leds[i] = CRGB::Black;
    FastLED.show();         //第i个灯珠熄灭
    delay(20);    
  }
  delay(500);
}

①首先使用addLeds函数对灯带数组leds进行初始化,其中尖括号中的参数依次是灯带型号、输出灯带控制信号的Arduino引脚号、RGB灯珠中红绿蓝三种颜色的LED排列顺序,小括号中的参数依次是灯珠对象数组和灯珠数量;然后使用setBrightness函数设置灯带亮度,这个函数的作用不是点灯,而是设置当灯被点亮后的亮度参数。

②颜色参数的表示方式为“CRGB::<颜色名>”(Black表示熄灭灯珠),可以直接将颜色参数赋值给灯珠对象,然后使用show函数更新灯带的显示。

③对于灯珠对象数组,leds[0]控制灯带的第一个灯珠,leds[1]控制灯带的第二个灯珠,以此类推,使用for循环顺序遍历leds数组,每轮循环都仅控制一个灯珠多次变色,由此可以实现变色光点在灯带上“移动”的效果。

(4)三个连续的变色光点顺着灯带“运动”:

#include "FastLED.h"            //此程序需要使用FastLED库

#define NUM_LEDS 30             //LED灯珠数量
#define DATA_PIN 9              //Arduino输出控制信号引脚
#define LED_TYPE WS2812         //LED灯带型号
#define COLOR_ORDER GRB         //RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128;       //LED亮度控制变量,可使用数值为0~255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS];            //为每个LED灯珠建立对象,将它们存放在数组leds中

void setup() 
{ 
  Serial.begin(9600);           //启动串行通讯
  delay(1000);                  //稳定性等待
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  //初始化灯带对象
  FastLED.setBrightness(max_bright);                              //设置灯带亮度
}

void loop() 
{ 
  //依次使用不同色彩点亮多个连续的LED灯珠
  for (int i = 0; i <= NUM_LEDS; i++) 
  {
    leds[i-1] = CRGB::Red;   //第i-1个灯珠显示红色
    leds[i] = CRGB::Red;     //第i个灯珠显示红色
    leds[i+1] = CRGB::Red;   //第i+1个灯珠显示红色
    FastLED.show();delay(50);
    leds[i-1] = CRGB::Green; //第i-1个灯珠显示绿色
    leds[i] = CRGB::Green;   //第i个灯珠显示绿色
    leds[i+1] = CRGB::Green; //第i+1个灯珠显示绿色
    FastLED.show();delay(50);   
    leds[i-1] = CRGB::Blue;  //第i-1个灯珠显示蓝色
    leds[i] = CRGB::Blue;    //第i个灯珠显示蓝色
    leds[i+1] = CRGB::Blue;  //第i+1个灯珠显示蓝色
    FastLED.show();delay(50);      
    leds[i-1] = CRGB::Black; //第i-1个灯珠熄灭
    leds[i] = CRGB::Black;   //第i个灯珠熄灭
    leds[i+1] = CRGB::Black; //第i+1个灯珠熄灭
    FastLED.show();delay(50);    
  }
  delay(500);
}

①首先使用addLeds函数对灯带数组leds进行初始化,其中尖括号中的参数依次是灯带型号、输出灯带控制信号的Arduino引脚号、RGB灯珠中红绿蓝三种颜色的LED排列顺序,小括号中的参数依次是灯珠对象数组和灯珠数量;然后使用setBrightness函数设置灯带亮度,这个函数的作用不是点灯,而是设置当灯被点亮后的亮度参数。

②颜色参数的表示方式为“CRGB::<颜色名>”(Black表示熄灭灯珠),可以直接将颜色参数赋值给灯珠对象,然后使用show函数更新灯带的显示。

③对于灯珠对象数组,leds[0]控制灯带的第一个灯珠,leds[1]控制灯带的第二个灯珠,以此类推,使用for循环顺序遍历leds数组,每轮循环都控制连续的三个灯珠多次变色,由此可以实现多个连续的变色光点在灯带上“移动”的效果。

(5)灯带的灯珠全部被点亮,然后全部被熄灭,以此往复:

#include "FastLED.h"            //此程序需要使用FastLED库

#define NUM_LEDS 30             //LED灯珠数量
#define DATA_PIN 9              //Arduino输出控制信号引脚
#define LED_TYPE WS2812         //LED灯带型号
#define COLOR_ORDER GRB         //RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128;       //LED亮度控制变量,可使用数值为0~255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS];            //为每个LED灯珠建立对象,将它们存放在数组leds中

void setup() 
{ 
  Serial.begin(9600);           //启动串行通讯
  delay(1000);                  //稳定性等待
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  //初始化灯带对象
  FastLED.setBrightness(max_bright);                              //设置灯带亮度
}

void loop() 
{ 
  //点亮灯带所有灯珠
  for (int i = 0; i <= NUM_LEDS; i++) 
  {    
    leds[i] = CRGB::Red;FastLED.show();
  }
  delay(500);
   //熄灭灯带所有灯珠
  for (int i = 0; i <= NUM_LEDS; i++) 
  {
    leds[i] = CRGB::Black;FastLED.show();  
  }
  delay(500);
}

①首先使用addLeds函数对灯带数组leds进行初始化,其中尖括号中的参数依次是灯带型号、灯带控制信号连接的Arduino引脚号、RGB灯珠中红绿蓝三种颜色的LED排列顺序,小括号中的参数依次是灯珠对象数组和灯珠数量。

②颜色参数的表示方式为“CRGB::<颜色名>”(Black表示熄灭灯珠),可以直接将颜色参数赋值给灯珠对象,然后使用show函数更新灯带的显示。

③对于灯珠对象数组,leds[0]控制灯带的第一个灯珠,leds[1]控制灯带的第二个灯珠,以此类推,使用for循环顺序遍历leds数组,第一次遍历将leds控制的灯珠全部点亮,第二次遍历将leds控制的灯珠全部熄灭,不过由于程序的执行本身要耗费一定时间,而show函数又被置于循环之中而不是循环之外,leds数组控制的灯珠经常还没全部被赋为红色或黑色就调用show函数,所以在视觉上灯带上的灯珠并不是同时被点亮,也不是同时被熄灭。

5、FastLED库使用——批量点灯操作

(1)灯带的灯珠全部同时被点亮,然后全部同时被熄灭,以此往复:

#include "FastLED.h"            //此程序需要使用FastLED库

#define NUM_LEDS 30             //LED灯珠数量
#define DATA_PIN 9              //Arduino输出控制信号引脚
#define LED_TYPE WS2812         //LED灯带型号
#define COLOR_ORDER GRB         //RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128;       //LED亮度控制变量,可使用数值为0~255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS];            //为每个LED灯珠建立对象,将它们存放在数组leds中

void setup() 
{ 
  Serial.begin(9600);           //启动串行通讯
  delay(1000);                  //稳定性等待
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  //初始化灯带对象
  FastLED.setBrightness(max_bright);                              //设置灯带亮度
}

void loop () 
{       
 fill_solid(leds, 30, CRGB::Red);        //点亮leds控制的30个灯珠
 FastLED.show();   
 delay(500);
 
 fill_solid(leds, 30, CRGB::Black);      //熄灭leds控制的30个灯珠 
 FastLED.show(); 
 delay(500);       
}

①fill_solid函数的作用是批量更改leds数组控制的灯珠的颜色,第一个参数是leds数组名,第二个参数是需要更改颜色的灯珠数量,第三个参数是更改后的颜色参数。

②fill_solid函数中并没有调用show函数,它仅更改leds数组的存储内容,调用show函数时才会将leds中的颜色参数落实到实物LED灯带上。

(2)灯带头部前三个灯珠全部同时被点亮,然后全部同时被熄灭,以此往复:

#include "FastLED.h"            //此程序需要使用FastLED库

#define NUM_LEDS 30             //LED灯珠数量
#define DATA_PIN 9              //Arduino输出控制信号引脚
#define LED_TYPE WS2812         //LED灯带型号
#define COLOR_ORDER GRB         //RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128;       //LED亮度控制变量,可使用数值为0~255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS];            //为每个LED灯珠建立对象,将它们存放在数组leds中

void setup() 
{ 
  Serial.begin(9600);           //启动串行通讯
  delay(1000);                  //稳定性等待
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  //初始化灯带对象
  FastLED.setBrightness(max_bright);                              //设置灯带亮度
}

void loop () 
{       
  //从灯带头开始,点亮熄灭3个LED
  fill_solid(leds, 3, CRGB::Red);
  FastLED.show();  
  delay(500);
  fill_solid(leds, 3, CRGB::Black);
  FastLED.show();  
  delay(500);              
}

①fill_solid函数的作用是批量更改leds数组控制的灯珠的颜色,第一个参数是leds数组名,第二个参数是需要更改颜色的灯珠数量,第三个参数是更改后的颜色参数。

②fill_solid函数中并没有调用show函数,它仅更改leds数组的存储内容,调用show函数时才会将leds中的颜色参数落实到实物LED灯带上。

③fill_solid函数的作用并不仅是同时控制灯带上的所有灯珠,可以仅控制部分,当第一个参数是leds数组名时,第二个参数是从灯带头部开始往后,需要控制的灯珠数量,将其取值为3,意味着仅控制灯带头部的前3个灯珠。

(3)灯带中部的连续三个灯珠全部同时被点亮,然后全部同时被熄灭,以此往复:

#include "FastLED.h"            //此程序需要使用FastLED库

#define NUM_LEDS 30             //LED灯珠数量
#define DATA_PIN 9              //Arduino输出控制信号引脚
#define LED_TYPE WS2812         //LED灯带型号
#define COLOR_ORDER GRB         //RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128;       //LED亮度控制变量,可使用数值为0~255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS];            //为每个LED灯珠建立对象,将它们存放在数组leds中

void setup() 
{ 
  Serial.begin(9600);           //启动串行通讯
  delay(1000);                  //稳定性等待
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  //初始化灯带对象
  FastLED.setBrightness(max_bright);                              //设置灯带亮度
}

void loop () 
{ 
  //从灯带头开始的第6个灯珠开始点亮熄灭3个LED
  fill_solid(leds+5, 3, CRGB::Red);
  FastLED.show();   
  delay(500);
  
  fill_solid(leds+5, 3, CRGB::Black);
  FastLED.show();
  delay(500);             
}

①fill_solid函数的作用是批量更改leds数组控制的灯珠的颜色,第一个参数是leds数组名,第二个参数是需要更改颜色的灯珠数量,第三个参数是更改后的颜色参数。

②fill_solid函数中并没有调用show函数,它仅更改leds数组的存储内容,调用show函数时才会将leds中的颜色参数落实到实物LED灯带上。

③fill_solid函数不只能从灯带头部第一个灯珠开始控制,它还可以从灯带中部的灯珠开始控制,当第一个参数是leds数组名与整型量的加法时,这里的“leds”是leds数组元素的首地址,而“leds+5”则是leds[5]的地址,那么fill_solid函数将从leds[5]开始更改leds数组的存储内容,也就是从灯带头部往后的第6个灯珠开始更改灯珠颜色参数,第二个参数为3,则fill_solid函数从第6个灯珠开始往后更改3个灯珠的颜色参数。

(4)三个光点组成的色条在灯带上反复摆动:

#include "FastLED.h"            //此程序需要使用FastLED库

#define NUM_LEDS 30             //LED灯珠数量
#define DATA_PIN 9              //Arduino输出控制信号引脚
#define LED_TYPE WS2812         //LED灯带型号
#define COLOR_ORDER GRB         //RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128;       //LED亮度控制变量,可使用数值为0~255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS];            //为每个LED灯珠建立对象,将它们存放在数组leds中

void setup() 
{ 
  Serial.begin(9600);           //启动串行通讯
  delay(1000);                  //稳定性等待
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  //初始化灯带对象
  FastLED.setBrightness(max_bright);                              //设置灯带亮度
}

void loop () 
{       
  for (int i = 0; i < NUM_LEDS-3; i++)  //色条正向运动
  {
    fill_solid(leds+i, 3, CRGB::Red);
    FastLED.show();delay(50);
    fill_solid(leds+i, 3, CRGB::Black); 
    FastLED.show();delay(50);
  }  
  for (int i = NUM_LEDS-3; i > 0; i--)  //色条逆向运动
  {
    fill_solid(leds+i, 3, CRGB::Red);
    FastLED.show();delay(50);
    fill_solid(leds+i, 3, CRGB::Black); 
    FastLED.show();delay(50);
  }                
}

①fill_solid函数的作用是批量更改leds数组控制的灯珠的颜色,第一个参数是leds数组名,第二个参数是需要更改颜色的灯珠数量,第三个参数是更改后的颜色参数。

②fill_solid函数中并没有调用show函数,它仅更改leds数组的存储内容,调用show函数时才会将leds中的颜色参数落实到实物LED灯带上。

③当fill_solid函数的第一个参数是leds数组名与整型量的加法时,这里的“leds”是leds数组元素的首地址,而“leds+i”则是leds[i]的地址,那么fill_solid函数将从leds[i]开始更改leds数组的存储内容,也就是从灯带头部往后的第i个灯珠开始更改灯珠颜色参数,第二个参数为3,则fill_solid函数从第i个灯珠开始往后更改3个灯珠的颜色参数。不断改变i的值,被选中的灯珠也会随之改变。

6、FastLED库使用——自定义颜色

(1)除了FastLED库提供的颜色参数外,程序员还可以自定义颜色,FastLED提供了两种自定义颜色的方法,分别是CRGB方法与CHSV方法:

①CRGB方法就是将三原色(红色、绿色、蓝色)以不同比重(或者说数值)相加在一起得到其它颜色。

定义方式:CRGB <颜色变量名>(<rValue>,<gValue>,<bValue>);

#include "FastLED.h" 

#define NUM_LEDS 30
#define LED_DT 9  
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB 
uint8_t max_bright = 128;

CRGB leds[NUM_LEDS];
//CRGB方法定义颜色                        
CRGB myRGBcolor(50,0,50);  //myRGBcolor(rValue,gValue,bValue)——创建RGB颜色变量
                            //rValue: 红色数值 0 - 255
                            //gValue: 绿色数值 0 - 255
                            //bValue: 蓝色数值 0 - 255
void setup() 
{ 
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(max_bright);
}
void loop () 
{ 
  myRGBcolor.r = 0; //更改红色数值,myRGBcolor(0, 0 ,50)
  myRGBcolor.b = 0; //更改蓝色数值,myRGBcolor(0, 0 ,0)
  fill_solid(leds, NUM_LEDS, myRGBcolor);FastLED.show();delay(500);  

  myRGBcolor.r = 50; //更改红色数值,myRGBcolor(50, 0 ,0)
  myRGBcolor.b = 50; //更改蓝色数值,myRGBcolor(50, 0 ,50)
  fill_solid(leds, NUM_LEDS, myRGBcolor);FastLED.show();delay(500);   
}

②CHSV方法同样有三个参数,它们分别为色调(H)、饱和度(S)和明亮度(V),色调的意义如下图的扇形图所示,饱和度的意义如下图右下角的渐变图所示(以色调H=0为例),明亮度的意义如下图右上角的渐变图所示(以色调H=0为例),通过不同数值的组合可以得到不同的颜色。

定义方式:CHSV <颜色变量名>(<hValue>,<sValue>,<vValue>);

#include "FastLED.h" 

#define NUM_LEDS 30
#define LED_DT 9  
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB 
uint8_t max_bright = 128;

CRGB leds[NUM_LEDS];
//CHSV方法定义颜色  
CHSV myHSVcolor(80,255,200);    //myHSVcolor(色调,饱和度,明亮度)——创建HSV颜色变量

void setup() 
{ 
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(max_bright);
}
void loop () 
{ 
  myHSVcolor.h++;  //修改yHSVcolor.h,即myHSVcolor的色调数值      
  fill_solid(leds, NUM_LEDS, myHSVcolor);FastLED.show();delay(10);       
}

(2)将下面的程序下载到开发板中,可以看见灯带全部被点亮,而且有一个“变色段”在灯带上运动,凡是“变色段”经过的地方,都会变成“变色段”所带有的颜色,而且“变色段”本身也在不断变色。

#include "FastLED.h" 

#define NUM_LEDS 30
#define LED_DT 9  
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB 
uint8_t max_bright = 128;

CRGB leds[NUM_LEDS];
//CHSV方法定义颜色  
CHSV myHSVcolor(80,255,200);    //myHSVcolor(色调,饱和度,明亮度)——创建HSV颜色变量

void setup() 
{ 
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(max_bright);
}

void loop () 
{ 
  for (int i = 0; i < NUM_LEDS-3; i++)  //变色段正向运动
  {
    myHSVcolor.h++;  //修改色调
    fill_solid(leds+i, 3, myHSVcolor);  //leds+i~leds+1+3是变色段
    FastLED.show();
    delay(50);
  }  
  for (int i = NUM_LEDS-3; i >= 0; i--)  //变色段逆向运动
  {
    myHSVcolor.h++;  //修改色调
    fill_solid(leds+i, 3, myHSVcolor);  //leds+i~leds+1+3是变色段
    FastLED.show();
    delay(50);
  }     
}

(3)将下面的程序下载到开发板中,可以看见灯带有一个“变色段”在灯带上运动,“变色段”以外的灯珠全部熄灭。

#include "FastLED.h" 

#define NUM_LEDS 30
#define LED_DT 9  
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB 
uint8_t max_bright = 128;

CRGB leds[NUM_LEDS];
//CHSV方法定义颜色  
CHSV myHSVcolor(80,255,200);    //myHSVcolor(色调,饱和度,明亮度)——创建HSV颜色变量

void setup() 
{ 
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(max_bright);
}

void loop () 
{
  for (int i = 0; i < NUM_LEDS-3; i++)   //变色段正向运动
  {
    myHSVcolor.h++;  //修改色调
    fill_solid(leds+i, 3, myHSVcolor);
    FastLED.show();delay(50);

    fill_solid(leds+i, 3, CRGB::Black); 
    FastLED.show();    
  }  

  for (int i = NUM_LEDS-3; i >= 0; i--)   //变色段逆向运动
  {
    myHSVcolor.h++;   //修改色调
    fill_solid(leds+i, 3, myHSVcolor);
    FastLED.show();delay(50);

    fill_solid(leds+i, 3, CRGB::Black); 
    FastLED.show();        
  }     
}

7、FastLED库使用——色调渐变灯带

(1)fill_rainbow函数有四个参数,其中最后一个参数可选,第一个参数是灯带对象的数组名,第二个参数是从第一个参数对应的灯珠开始往后需要控制的灯珠数量,第三个参数是起始色调值:

①若放弃可选参数,fill_rainbow函数会将选中的第一个灯珠颜色设置为起始色调,往后的灯珠色调呈递增趋势,递增值取决于需要控制的灯珠数量,最后所选的全部灯珠将呈现渐变的彩虹色。

②若采用可选参数,fill_rainbow函数会将选中的第一个灯珠颜色设置为起始色调,往后的灯珠色调呈递增趋势,递增值取决于可选参数值,如下图所示。

#include "FastLED.h"    

#define NUM_LEDS 30        
#define LED_DT 9            
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB     

uint8_t max_bright = 128;   

CRGB leds[NUM_LEDS];   

uint8_t beginHue;

void setup() 
{ 
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); 
  FastLED.setBrightness(max_bright);    
}

void loop () 
{  
  beginHue++;    //初始色调改变
  fill_rainbow(leds, NUM_LEDS, beginHue, 9);   //色调递增值取9
  FastLED.show();
  delay(25); 
} 

(2)fill_gradient_RGB函数有5个参数,第一个参数是灯带对象的数组名,第二个参数是第一个需要控制的灯珠在数组中的下标,第三个参数是起始RGB颜色(可用FastLED库提供的颜色参数,也可用CRGB方法自定义颜色变量),第四个参数是最后一个需要控制的灯珠在数组中的下标,第五个参数是结束RGB颜色(可用FastLED库提供的颜色参数,也可用CRGB方法自定义颜色变量),fill_gradient_RGB函数将会把选中的灯珠按起始和结束RGB颜色进行渐变设置,第一个灯珠设置为起始RGB颜色,最后一个灯珠设置为结束RGB颜色。

#include "FastLED.h"    

#define NUM_LEDS 30        
#define LED_DT 9            
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB     

uint8_t max_bright = 128;   

CRGB leds[NUM_LEDS];   

void setup() 
{ 
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); 
  FastLED.setBrightness(max_bright);    
}

void loop () 
{       
  fill_gradient_RGB(leds, 0, CRGB::Red, 29, CRGB::Blue); 
  FastLED.show();
  delay(50);
} 

(3)fill_gradient函数有6个参数,第一个参数是灯带对象的数组名,第二个参数是第一个需要控制的灯珠在数组中的下标,第三个参数是起始颜色(可用FastLED库提供的颜色参数,也可用CRGB或者CHSV方法自定义颜色变量),第四个参数是最后一个需要控制的灯珠在数组中的下标,第五个参数是结束颜色(可用FastLED库提供的颜色参数,也可用CRGB或者CHSV方法自定义颜色变量),第六个参数是渐变方向,fill_gradient函数将会把选中的灯珠按起始和结束颜色进行渐变设置,第一个灯珠设置为起始颜色,最后一个灯珠设置为结束颜色,另外从一个颜色渐变到另外一个颜色有两个渐变方向,在灯珠数量相同的前提下,一个方向的色调变化值较大,对应参数“LONGEST_HUES”,另一个方向的色调变化值较小,对应参数“SHORTEST_HUES”。

#include "FastLED.h"    

#define NUM_LEDS 30        
#define LED_DT 9            
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB     

uint8_t max_bright = 128;   

CRGB leds[NUM_LEDS];   

uint8_t beginHue;

void setup() 
{ 
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); 
  FastLED.setBrightness(max_bright);    
}

void loop () 
{       
  fill_gradient(leds, 0, CHSV(50, 255,255) , 29, CHSV(150,255,255), LONGEST_HUES);
  FastLED.show();
  delay(50);
} 

8、FastLED库使用——从调色板取色点灯

(1)下图所示的是FastLED库预设的其中两个调色板(截止3.7.0版本,预设的调色板共有8种),Arduino可以根据颜色序号从调色板上获取相应的颜色,当然,除了FastLED库预设的调色板,程序员也可自定义调色板然后使用之。

(2)fill_palette函数有7个参数,依次是灯带数组名、灯珠数量、起始颜色序号、相邻光珠的颜色序号差、调色板名(可以是库预设的,也可以是自定义的)、亮度值及线性渐变(LINEARBLEND)/非线性渐变(NOBLEND),其作用就是按照颜色序号将指定调色板上的颜色依次赋予灯带上的各个灯珠,若采用线性渐变,第一个灯珠的颜色对应起始颜色序号在调色板上的取色,再往后颜色序号将按照相邻光珠的颜色序号差进行递增,当颜色序号大于255时,大于255的部分从0开始继续递增。

(3)使用库预设的调色板CloudColors_p:在fill_palette函数中直接传入调色板名即可。

#include "FastLED.h"  

#define NUM_LEDS 30     
#define LED_DT 9       
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB  

uint8_t max_bright = 128; 

CRGB leds[NUM_LEDS];                                   

uint8_t colorIndex;

void setup() 
{                                           
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);  
  FastLED.setBrightness(max_bright);             
}

void loop () 
{     
  colorIndex++;    //每次给灯珠上色前,起始颜色序号都递增1
  fill_palette (leds, NUM_LEDS, colorIndex, 8, CloudColors_p, 255, LINEARBLEND);
  FastLED.show();
  delay(25);
}

(4)使用CRGBPalette16自定义调色板:这种方法需要16个RGB颜色参数,其中第一个参数对应调色板上颜色序号0-15的颜色,第二个参数对应调色板上颜色序号16-31的颜色,以此类推。

定义方式:CRGBPalette16 <调色板名> = CRGBPalette16(<16个逗号分隔的RGB颜色参数>);

#include "FastLED.h"  

#define NUM_LEDS 30     
#define LED_DT 9       
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB  

uint8_t max_bright = 128; 

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);

CRGB leds[NUM_LEDS];                                   

uint8_t colorIndex;

void setup() 
{                                           
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);  
  FastLED.setBrightness(max_bright);             
}

void loop () 
{     
  colorIndex++;    //每次给灯珠上色前,起始颜色序号都递增1
  fill_palette (leds, NUM_LEDS, colorIndex, 8, myColorPalette, 255, LINEARBLEND);
  FastLED.show();
  delay(25);
}

(5)使用CHSVPalette16自定义调色板:这种方法需要16个HSV颜色参数,其中第一个参数对应调色板上颜色序号0-15的颜色,第二个参数对应调色板上颜色序号16-31的颜色,以此类推。

定义方式:CHSVPalette16 <调色板名> = CHSVPalette16(<16个逗号分隔的HSV颜色参数>);

#include "FastLED.h"  

#define NUM_LEDS 30     
#define LED_DT 9       
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB  

uint8_t max_bright = 128; 

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));

CRGB leds[NUM_LEDS];                                   

uint8_t colorIndex;

void setup() 
{                                           
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);  
  FastLED.setBrightness(max_bright);             
}

void loop () 
{     
  colorIndex++;    //每次给灯珠上色前,起始颜色序号都递增1
  fill_palette (leds, NUM_LEDS, colorIndex, 8, myHSVColorPalette, 255, LINEARBLEND);
  FastLED.show();
  delay(25);
}

(6)对于自定义调色板,它由16个颜色参数进行定义,而在程序运行过程中基本不会修改调色板,那么调色板完全可以作为只读的内容,如果将其存放在SARM中将会非常浪费SARM的空间,对此可以将其存放在FLASH中,从而很好地利用存储空间。存储在FALSH中的调色板,其定义方式见下例,同样需要16个颜色参数,其中第一个参数对应调色板上颜色序号0-15的颜色,第二个参数对应调色板上颜色序号16-31的颜色,以此类推。

#include "FastLED.h"  

#define NUM_LEDS 30     
#define LED_DT 9       
#define LED_TYPE WS2812 
#define COLOR_ORDER GRB  

uint8_t max_bright = 128; 

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};   

CRGB leds[NUM_LEDS];                                   

uint8_t colorIndex;

void setup() 
{                                           
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);  
  FastLED.setBrightness(max_bright);             
}

void loop () 
{     
  colorIndex++;    //每次给灯珠上色前,起始颜色序号都递增1
  fill_palette (leds, NUM_LEDS, colorIndex, 8, myProgmemPalette, 255, LINEARBLEND);
  FastLED.show();
  delay(25);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/713284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python-基础篇-类与对象/面向对象程序设计-是什么

文章目录 定义一&#xff1a;面对对象是一种编程思想定义一&#xff1a;面向对象是一种抽象1、面向对象的两个基本概念2、面向对象的三大特性 定义一&#xff1a;你是土豪&#xff0c;全家都是土豪面向对象编程基础类和对象定义类创建和使用对象访问可见性问题面向对象的支柱 定…

C++初学者指南第一步---4.基本类型

C初学者指南第一步—4.基本类型 文章目录 C初学者指南第一步---4.基本类型1.变量声明2.快速概览Booleans 布尔型Characters 字符型Signed Integers 有符号整数Unsigned Integers 无符号整数Floating Point Types 浮点数类型 3.Common Number Representations 常用的数字表示常用…

用Copilot画漫画,Luma AI生成视频:解锁创意新玩法

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;各种创意工具也层出不穷。今天&#xff0c;我们就来介绍一种全新的创作方式&#xff1a;使用Copilot画漫画&#xff0c;再将漫画放入Luma AI生成视频。 Copilot&#xff1a;你的AI绘画助手 Copilot是一款基于人工智…

【Kubernetes项目部署】k8s集群+高可用、负载均衡+防火墙

项目架构图 &#xff08;1&#xff09;部署 kubernetes 集群 详见&#xff1a;http://t.csdnimg.cn/RLveS &#xff08;2&#xff09; 在 Kubernetes 环境中&#xff0c;通过yaml文件的方式&#xff0c;创建2个Nginx Pod分别放置在两个不同的节点上&#xff1b; Pod使用hostP…

TCP及UDP协议

tcp是点到点的&#xff0c;只有一条路径&#xff0c;到达顺序和发送顺序是相同的 回复的确认号是序发送端的序列号加上data的长度 1910 发送端的序列号也是那么算的 ack和下一个seq一样 那就没问题 三次握手四次挥手&#xff1a; 为啥是三次呢&#xff1f; 假如一次&#xf…

SpringBoot使用jasypt实现数据库信息的脱敏,以此来保护数据库的用户名username和密码password(容易上手,详细)

1.为什么要有这个需求&#xff1f; 一般当我们自己练习的时候&#xff0c;username和password直接是爆露出来的 假如别人路过你旁边时看到了你的数据库账号密码&#xff0c;他跑到他的电脑打开navicat直接就是一顿连接&#xff0c;直接疯狂删除你的数据库&#xff0c;那可就废…

学习笔记——网络管理与运维——SNMP(SNMP架构)

三、SNMP架构 1、SNMP结构概述 SNMP被设计为工作在TCP/IP协议族上&#xff0c;基于TCP/IP协议工作&#xff0c;对网络中支持SNMP协议的设备进行管理。所有支持SNMP协议的设备都提供SNMP这个统一界面&#xff0c;使得管理员可以使用统一的操作进行管理&#xff0c;而不必理会设…

基于Spring+Vue的前后端分离的计算器

麻雀虽小&#xff0c;五脏俱全 该项目已部署上线&#xff1a;http://calculator.wushf.top/ 并通过Gitee Go流水线实现持续部署。 需求分析 表达式求值 支持加减乘除四则运算、支持高精度 获取日志 Api文档定义 前后端分离&#xff0c;人不分离 通过Apifox定义接口细节&#…

「TCP 重要机制」三次握手四次挥手

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 三次握手&四次挥手 &#x1f349;连接管理&#x1f34c;三次握手&#x1f34c;意义&#x1f34c;四次挥手&#x1f34c;TCP 状态转换…

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例&#xff1a;监听网络状态变化 2.2. 自定义广播示例&#xff1a;发送自定义广播 2.3. 有序广播示例&#xff1a;有序广播 2.4. …

[算法刷题—二分法]寻找插入位置

题目展示: 本道题本身并不是很难,主要是学习和分析二分查找插入位置的方法。 首先大体上分为两种情况: 一.target在待查找的数组之中,返回对应值的下标索引。 二.target不在待查找的数组之中&#xff0c;需要返回target插入位置的索引(原数组有序) 第一种情况不难&#xff…

跟着AI学AI_08 NumPy 介绍

NumPy&#xff08;Numerical Python&#xff09;是一个用于科学计算的基础库&#xff0c;它为 Python 提供了支持大规模多维数组和矩阵 NumPy 介绍 NumPy&#xff08;Numerical Python&#xff09;是一个用于科学计算的基础库&#xff0c;它为 Python 提供了支持大规模多维数…

最新版点微同城源码34.7+全套插件+小程序前后端(含安装教程)

模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89394996 更多资源下载&#xff1a;关注我。

【单元测试】Spring Boot 的测试库

Spring Boot 的测试库 1.了解回归测试框架 JUnit2.了解 assertThat3.了解 Mockito4.了解 JSONPath5.测试的回滚 单元测试&#xff08;unit test&#xff09;是为了检验程序的正确性。一个单元可能是单个 程序、类、对象、方法 等&#xff0c;它是应用程序的最小可测试部件。 单…

ATMEGA16读写24C256

代码&#xff1a; #include <mega16.h> #include <stdio.h> #include <i2c.h> #include <delay.h> // Declare your global variables here #define EEPROM_BUS_ADDRESS 0xa0 #asm.equ __i2c_port0x15.equ __sda_bit1 .equ __scl_bit0 #endasm uns…

课设--学生成绩管理系统(二)

欢迎来到 Papicatch的博客 目录 &#x1f40b;引言 &#x1f988;编写目的 &#x1f988;项目说明 &#x1f40b;产品介绍 &#x1f988;产品概要说明 &#x1f988;产品用户定位 &#x1f988;产品中的角色 &#x1f40b; 产品总体业务流程图 &#x1f40b; 产品功…

Pixel Transformer:用像素代替补丁可以提升图像分类精度

在快速发展的人工智能领域&#xff0c;ViTs已成为各种计算机视觉任务的基础模型。ViTs通过将图像划分为小块并将这些小块作为标记来处理图像。6月刚发布一篇论文&#xff0c;引入了一种新颖的方法&#xff0c;即像素级Transformers&#xff0c;它通过将单个像素视为令牌来挑战这…

【深度学习】基于EANet模型的图像识别和分类技术

1.引言 1.1.EANet模型简介 EANet&#xff08;External Attention Transformer&#xff09;是一种深度学习模型&#xff0c;它结合了Transformer架构和外部注意力机制&#xff0c;特别适用于图像分类等计算机视觉任务。以下是关于EANet的详细解释&#xff1a; 1.1.1 定义与背…

2024年了,苹果可以通话录音了

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 6月11日凌晨&#xff0c;苹果在WWDC24大会上&#xff0c;密集输出了酝酿多时的AI应用更新。苹果对通话、对话、图…

从传统到智能:数字孪生在火电厂中的应用

通过图扑 HT 可视化技术数字孪生正在运行的火力发电厂&#xff0c;搭建数字化运营平台&#xff0c;对发电厂进行工厂式精细化的数字化管理&#xff0c;提升企业对整个发电厂业务进行数字化管理能力。