ESP32 C3基于arduino点亮24位ws2812彩色灯实现渐变色效果以及七彩流光效果

渐变色原理:

在这里插入图片描述

首先需要添加一个库文件

顺序为:项目->加载库->管理库
在这里插入图片描述
搜索:Adafruit_NeoPixel,并下载
在这里插入图片描述
源码:

// 调用Adafruit_NeoPixel模块
#include <Adafruit_NeoPixel.h>

// 设置灯珠数量
#define NUMPIXELS        24

// 设置SPI输出数据引脚
#define PIN_NEOPIXEL    6

// 初始化灯珠控制实例
Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

// 当前灯珠指向
int16_t idx = 0;


// 启动设置
void setup() {
  // 调试串口速率设置
  Serial.begin(115200);

  // 灯珠控制开始
  pixels.begin();

  // 设置亮度为255
  pixels.setBrightness(255);

  // 设置灯珠颜色,全部关闭
  pixels.fill(0x000000);

  delay(100);

  // 设置灯珠颜色
  pixels.fill(0xFF0000);

  delay(100);

  pixels.clear();
}


uint16_t c1 = 0;
uint16_t c2 = 0;
uint16_t c3 = 0;     
uint16_t sign_bit =0;
uint16_t sign = 1;
// 循环主体程序
void loop() {
    if(sign_bit == 0){//这个if语句在循环体内只运行一次,该if语句及下方if语句可以用switch代替
	      if(sign){
	        c1++;
	        if(c1>=255)
	          sign=0;
	      }else{
	        c2++;
	        if(c2>=255){
	          sign=1;
	          sign_bit = 1;
	        }
	      }
    }
    if(sign_bit == 1){
	      if(sign){
	        c1--;
	        if(c1<=0)
	          sign=0;
	      }else{
	        c3++;
	        if(c3>=255){
	          sign=1;
	          sign_bit = 2;
	        }
	      }
    }
    if(sign_bit == 2){
	      if(sign){
	        c2--;
	        if(c2<=0)
	          sign=0;
	      }else{
	        c1++;
	        if(c1>=255){
	          sign=1;
	          sign_bit = 3;
	        }
	      }
    }
    if(sign_bit == 3){
	      if(sign){
	        c3--;
	        if(c3<=0)
	          sign=0;
	      }else{
	        c2++;
	        if(c2>=255){
	          sign=1;
	          sign_bit = 1;
	        }
	      }
    }
  
    //在这里注释的是一个一个将灯珠点亮并实现渐变
    idx++;
    if(idx > 24){
      idx = 0;
    }
    pixels.setPixelColor(idx, pixels.Color(c1,c2,c3));

    
    /*=======================================
    全部点亮用该函数
	pixels.fill(pixels.Color(c1,c2,c3));
	=======================================*/
  
    delay(10);//延时,改变速度
    // 显示
    pixels.show();
  }
}

视频效果:

VID_20220802_091105

上方则就是实现渐变色的算法

至于实现七彩流光效果,原理图如下
在这里插入图片描述
我们先将灯珠的颜色分为24个等级,再将灯点亮,先不要让灯珠颜色转动,代码原理如上图
成功点亮后,初始化时将灯珠保存于数组中,在循环体中依次将数组中的元素往后移动一个位置
相关的方法有很多,也有直接将分好等级的灯珠每一个直接开始渐变的,下面的方法我认为是最简单理解的了
代码:

// 调用Adafruit_NeoPixel模块
#include <Adafruit_NeoPixel.h>

// 设置灯珠数量
#define NUMPIXELS        24

// 设置SPI输出数据引脚
#define PIN_NEOPIXEL    6

// LED引脚设置
#define PIN_LED         18

// 初始化灯珠控制实例
Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

// 当前灯珠指向
int16_t idx = 0;

//初始化将灯珠的等级保存于数组中
int16_t ArraySave[NUMPIXELS][3] = {0};

// 启动设置
void setup() {
  // 调试串口速率设置
  Serial.begin(115200);
  pinMode(PIN_LED, OUTPUT);

  // 灯珠控制开始
  pixels.begin();

  // 设置亮度为255
  pixels.setBrightness(255);

  // 设置灯珠颜色,全部关闭
  pixels.fill(0x000000);

  delay(100);

  // 设置灯珠颜色
  pixels.fill(0xFF0000);

  delay(100);

  pixels.clear();

  int j = 0;
  
  //将灯珠颜色根据图示分成24份
  for(j=0;j<NUMPIXELS/3;j++){
      pixels.setPixelColor(j,pixels.Color(248-255/(NUMPIXELS/3)*j,255/(NUMPIXELS/3)*j,0));
      ArraySave[j][0]=248-255/(NUMPIXELS/3)*j;
      ArraySave[j][1]=255/(NUMPIXELS/3)*j;
      ArraySave[j][2]=0;
  }
  for(j=0;j<NUMPIXELS/3;j++){
      pixels.setPixelColor(j+8,pixels.Color(0,248-255/(NUMPIXELS/3)*j,255/(NUMPIXELS/3)*j));
      ArraySave[j+NUMPIXELS/3][0]=0;
      ArraySave[j+NUMPIXELS/3][1]=248-255/(NUMPIXELS/3)*j;
      ArraySave[j+NUMPIXELS/3][2]=255/(NUMPIXELS/3)*j;
  }
  for(j=0;j<NUMPIXELS/3;j++){
      pixels.setPixelColor(j+16,pixels.Color(255/(NUMPIXELS/3)*j,0,248-255/(NUMPIXELS/3)*j));
      ArraySave[j+NUMPIXELS/3*2][0]=255/(NUMPIXELS/3)*j;
      ArraySave[j+NUMPIXELS/3*2][1]=0;
      ArraySave[j+NUMPIXELS/3*2][2]=248-255/(NUMPIXELS/3)*j;
  }
   //将灯珠颜色根据图示分成24份

}


uint16_t c1 = 0;
uint16_t c2 = 0;
uint16_t c3 = 0;     
uint16_t sign_bit =0;
uint16_t sign = 1;

// 循环主体程序
void loop(){
    uint16_t i = 0,k = 0;
    uint16_t t[3] = {0};
    for(k=0;k<3;k++){
        t[k]=ArraySave[0][k];
    }
    //NUMPIXELS-1防止ArraySave[i+1][k]越界
    for(i=0;i<(NUMPIXELS-1);i++){
      for(k=0;k<3;k++){
        ArraySave[i][k]=ArraySave[i+1][k];
      }
      pixels.setPixelColor(i,ArraySave[i][0],ArraySave[i][1],ArraySave[i][2]);
    }
    
    for(k=0;k<3;k++){
        ArraySave[NUMPIXELS-1][k]=t[k];  
    }
    pixels.setPixelColor(NUMPIXELS-1,ArraySave[NUMPIXELS-1][0],ArraySave[NUMPIXELS-1][1],ArraySave[NUMPIXELS-1][2]);
    
    delay(50);
    // 显示
    pixels.show();
}


视频效果:

VID_20220802_091200

当然,点亮的方式有很多种,可以实现很多花样,具体算法自己琢磨吧

  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
### 回答1: 要实现控制ws2812实现流星效果,我们可以使用Arduino来编写代码和控制。下面是一个简单的实现流程: 首先,我们需要连接ws2812珠到Arduino板上。将VCC引脚连接到Arduino的5V引脚,GND引脚连接到Arduino的GND引脚,将DI引脚连接到Arduino的数字引脚,例如D2。 接下来,在Arduino IDE中编写程序。首先,我们需要包含“Adafruit_NeoPixel”库,这是一个用于控制ws2812珠的库。 然后,我们需要定义珠的数量和引脚。使用“Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXELS, PIN, NEO_GRB + NEO_KHZ800);”来初始化珠。 接下来,我们需要在“setup”函数中设置引脚模式和数量。使用“strip.begin();”来初始化珠。 然后,在“loop”函数中编写流星效果的代码。我们可以使用for循环控制珠的数量,并在每个迭代中通过“strip.setPixelColor(i, strip.Color(255, 255, 255));”来设置珠的颜色。然后,我们可以使用“strip.show();”来将颜色应用到珠上。 在每个迭代之间,我们可以使用“strip.setPixelColor(i, strip.Color(0, 0, 0));”来将珠颜色设置为黑色,以模拟流星移动的效果。可以通过增加延迟来调整流星移动的速度。 最后,我们可以在Arduino上上传代码,珠就会展示流星效果了。 需要注意的是,这只是一个简单的流星效果实现方法。如果想要更复杂的效果,可以在代码中做更多的调整和改进。 ### 回答2: 要实现流星效果,可以通过Arduino控制WS2812珠来实现。首先,我们需要将WS2812珠与Arduino连接起来。通过连接DI(Digital Input)引脚和5V、GND引脚,将WS2812珠与Arduino连接在一起。 接下来,我们需要通过编写代码来实现流星效果。首先,在Arduino中安装FastLED库,该库可以帮助我们更方便地对WS2812珠进行控制。 然后,我们需要定义一些变量来控制流星的行为,比如流星的起始置、流星的速度、流星的长度等。在Arduino的setup函数中,我们可以初始化这些变量,同时设置WS2812珠的数量和引脚。 在Arduino的loop函数中,我们可以使用FastLED库提供的函数来控制WS2812珠的亮度和颜色。通过循环遍历每个珠,我们可以逐渐改变流星的置和亮度,从而实现流星效果。我们可以通过改变流星的起始置和速度来控制流星的移动方向和速度。 为了实现流星的效果,我们还可以使用一些特殊的算法,比如渐变亮度、尾巴效果等。通过增加尾巴效果,可以让流星在移动过程中留下一道模糊的尾巴,增加流星的真实感。 最后,通过将Arduino连接到电源,我们可以看到WS2812珠闪烁起来,模拟出流星落下的效果。通过调整代码中的参数,我们还可以改变流星的颜色、长度和速度,实现不同的流星效果。 总之,通过使用Arduino控制WS2812珠,并结合合适的代码和算法,我们可以轻松实现流星效果。这种效果可以应用于各种场景,比如舞台表演、节日布置等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡眼红瞳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值