七彩流光效果丝滑优化
由于上一篇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();
}
经此代码烧录的效果如下:
七彩流光丝滑效果
现在的效果就嘎嘎丝滑啦😬