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

news2024/11/25 6:42:58

重要的内容写在前面:

  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.coloradmin.cn/o/1827756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业化运维(2)_nginx

###1.nginx源码安装部署### ###2.平滑升级### &#xff08;1&#xff09;版本升级 当服务器在运行时&#xff0c;需要升级的情况下&#xff0c;平滑升级即就是不断开服务器就可以进行升级&#xff0c;最大限度保证数据的完整性。 下载nginx新版本软件&#xff0c;正常执行./c…

【Pandas驯化-03】Pandas中常用统计函数mean、count、std、info使用

【Pandas驯化-03】Pandas中常用统计函数mean、count、std、info使用 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微…

机器学习周报第46周

目录 摘要Abstract一、文献阅读1.1 摘要1.2 研究背景1.3 论文方法1.4 模块分析1.5 网络规格1.6 高效的端到端对象检测1.7 mobile former模块代码 目录 摘要Abstract一、文献阅读1.1 摘要1.2 研究背景1.3 论文方法1.4 模块分析1.5 网络规格1.6 高效的端到端对象检测1.7 mobile f…

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类?

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类&#xff1f; 制作耳机壳的胶粘剂有很多种类&#xff0c;常见的有环氧树脂胶水、UV树脂胶、快干胶、热熔胶等。 这些胶粘剂都有不同的特点和适用场景&#xff0c;可以根据自己的需求选择合适的类型。 例如&#xff1a; 环氧树脂…

九、BGP路由属性和选路

目录 一、属性分类 1.1、公认属性 1.2、可选属性 二、选路原则 0、丢弃不可达 取值越大越优 1、Preferred-Value 2、Local_Preference 取值越小越优 3、路由优先级 4、AS_Path 5、Origin 6、MED 7、路由来源 8、Next_Hop的IGP度量值 BGP路由等价负载分担&#…

springboot景区寄存管理系统(源码+sql+论文报告)

针对传统人工行李寄存效率低和安全性不足等问题&#xff0c;设计并实现了一种由网页控制器组成的智能行李寄存系统。首先能够实现行李的寄存管理和行李柜管理以及记录查询和通知公告以及管理员等灵活控制菜单显示权限。经过研究和测试结果显示&#xff0c;该行李寄存系统实现了…

【什么!Grok记录被打破了】坏消息不是Meta的 llama3 400,好消息是Nvidia发布的Nemotron-4 340B且支持开源

Nvidia 发布了开创性的开放模型系列 “Nemotron-4 340B”&#xff0c;再次巩固了其作为人工智能创新领域无可争议的领导者的地位。这一发展标志着人工智能行业的一个重要里程碑&#xff0c;因为它使各行各业的企业能够创建功能强大的特定领域 LLM&#xff0c;而无需大量昂贵的真…

QT系列教程(11) TextEdit实现Qt 文本高亮

文本高亮 对于textedit里录入的部分单词我们可以实现高亮&#xff0c;实现高亮主要依赖于QSyntaxHighlighter。 我们先创建一个Qt Application类&#xff0c;类名MainWindow, 然后新增一个C类&#xff0c;类名为MySyntaxHighlighter。 #ifndef MYSYNTAXHIGHLIGHTER_H #define …

深入分析 Android BroadcastReceiver (三)

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

yml配置文件快速上手

yml配置文件快速上手 springboot中&#xff0c;有三种文件可以作为配置文件 xml文件(不推荐&#xff0c;臃肿)application.propertis文件&#xff08;层次不够分明&#xff09;yml文件&#xff08;推荐&#xff0c;层次分明&#xff0c;语法简洁&#xff09; yml文件的基本语…

记录:利用 Agora 在 Unity3D MRTK场景中创建实时视频聊天应用

目录 准备1. 安装Agora_Unity_RTC_SDK2. 创建UI3. script具体内容4. 使用测试 本质是两部带摄像机的设备同时进入Agora聊天室内视频。 去年实现过一次这个功能&#xff0c;用的是Agora_Unity_RTC_SDK 4.2.2版本的&#xff0c;今年使用失败&#xff0c;遂重新安装最新版本Agora…

Github 2024-06-15Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-15统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目1JavaScript项目1Deno: 现代JavaScript和TypeScript运行时 创建周期:2118 天开发语言:Rust, JavaScript协议类型:M…

浪潮信息打造业界首款50℃进液温度服务器 PUE逼近理论极限1.0!

在科技飞速发展的今天&#xff0c;浪潮信息以其前瞻性的技术创新思维&#xff0c;再次突破行业极限&#xff0c;推出业界首个支持50℃进液温度的浸没式液冷服务器NF5180G7。这一创新成果不仅展现了浪潮信息在液冷技术领域的深厚实力&#xff0c;更标志着服务器冷却技术的一次重…

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

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

(南京观海微电子)——液晶屏显示不良及修复

TFT LCD信号驱动 屏横线 横暗线、暗带、竖线、竖带 原因&#xff1a; 1、COF与玻璃Bonding不良&#xff1b; 2、COF或玻璃遭到损伤&#xff08;ESD或机械折伤&#xff09;&#xff1b; 3、ASG电路失效&#xff08;仅对ASG技术panel而言&#xff09; 解决方案&#xff1…

STM32定时器篇——Systick定时器的使用(实现delay延时函数)

一、Systick定时器的简介&#xff1a; Systick定时器就是系统滴答定时器&#xff0c;一个24 位的倒计数定时器对于CM3,CM4内核芯片&#xff0c;都有Systick定时器。当Systick计到0时&#xff0c;将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中…

SpringBoot【2】集成 MyBatis Plus

SpringBoot 集成 MyBatis Plus 前言修改 pom.xml修改配置文件添加 实体类添加 持久层接口添加 持久层 XxxMapper.xml 文件添加 业务接口层添加 业务接口实现类添加 控制层添加 MyBatis 配置AutoFillMetaObjectHandlerMyBatisPlusConfig 验证 前言 由于 MySQL 备份/恢复测试&am…

LeetCode 算法:回文链表 c++

原题链接&#x1f517;&#xff1a;回文链表 难度&#xff1a;简单⭐️ 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head…

如何用 Google Chrome 浏览器浏览经过 XSLT 渲染的 XML 文件

对于经过XSLT渲染的XML文件&#xff0c;本来&#xff0c;可以直接用 IE (Internet Explorer) 打开&#xff0c;就能看到渲染之后的样子&#xff0c;很方便。但是后来&#xff0c;微软把 IE 换成了 Microsoft Edge&#xff0c;按理说这是比 IE 更先进的浏览器&#xff0c;可是偏…

Swift 是 C++ 的最佳继任者

苹果称 Swift 是 C 的最佳继任者 Swift 是苹果公司在 2014 年推出的&#xff0c;一款旨在替代 Objective-C 的编程语言。但苹果语言和运行时总监 Ted Kremenek 在 WWDC24 的主题演讲中表示&#xff0c;Swift 也将取代 C。 “Swift 的安全性、速度和易用性&#xff0c;加上内…