ESP32基于arduino点亮24位彩色灯实现七彩流光效果二、(丝滑优化)

4 篇文章 2 订阅

七彩流光效果丝滑优化

由于上一篇ws2812的效果中的文章有提到丝滑优化的一点,本来不太想写,但评论区有人提问到如何实现更加丝滑的效果,没时间写,耽搁的时间太长,所以今天补上
原理:为了实现更加丝滑的显示效果,我们将之前的24个灯珠还是先初始化一下,将灯珠的颜色再分成24个等级,原理图如下:
在这里插入图片描述
在将上方的图示的各个RGB参数分成24个等级之后,再将24个灯珠每一个灯珠按照渐变色的效果来实现,渐变色的图示截用上一篇文章的图,如下:
在这里插入图片描述
附上代码:

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

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

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

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

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

//ws2812等级初始化
void ws2812_init(void)
{
  int j = 0;
  
  //将灯珠颜色根据图示分成24份
  for(j=0;j<NUMPIXELS/3;j++){
      pixels.setPixelColor(j,pixels.Color(255-255/(NUMPIXELS/3)*j,255/(NUMPIXELS/3)*j,0));
      ArraySave[j][0]=255-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,255-255/(NUMPIXELS/3)*j,255/(NUMPIXELS/3)*j));
      ArraySave[j+NUMPIXELS/3][0]=0;
      ArraySave[j+NUMPIXELS/3][1]=255-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,255-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]=255-255/(NUMPIXELS/3)*j;
  }
  //将灯珠颜色根据图示分成24份
}

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

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

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

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

  delay(100);

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

  delay(100);

  pixels.clear();

  //ws2812等级分成初始化
  ws2812_init();

}

void gradual_change(uint8_t num)
{
	if(ArraySave[num][0] == 0 && ArraySave[num][1] == 0){
		ArraySave[num][0]++;
		ArraySave[num][2]--;
		return;
	} else if(ArraySave[num][0] == 0){
		ArraySave[num][1]--;
		ArraySave[num][2]++;
		return;
	}
		
	if (ArraySave[num][1] == 0 && ArraySave[num][2] == 0){
		ArraySave[num][1]++;
		ArraySave[num][0]--;
		return;
	} else if(ArraySave[num][1] == 0){
		ArraySave[num][2]--;
		ArraySave[num][0]++;
		return;
	}
		
	if (ArraySave[num][2] == 0 && ArraySave[num][0] == 0){
		ArraySave[num][2]++;
		ArraySave[num][1]--;
	} else if(ArraySave[num][2] == 0){
		ArraySave[num][0]--;
		ArraySave[num][1]++;
	}
}

//循环主体程序
void loop(){
    uint8_t i = 0,k = 0;

    for(i=0;i<NUMPIXELS;i++){
      gradual_change(i);

      pixels.setPixelColor(i,ArraySave[i][0],ArraySave[i][1],ArraySave[i][2]);
    }

    delay(5);
    // 显示
    pixels.show();
}

经此代码烧录的效果如下:

七彩流光丝滑效果


现在的效果就嘎嘎丝滑啦😬

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

睡眼红瞳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值