我有一个Arduino,我正在尝试找到一种最有效的方法来为数组中的像素设置动画。该数组由3个30 uint8_t
s的数组表示。 (30像素* R + G + B级别0-255)。
将像素独立移动到阵列的最佳方法是什么?这是一个内存受限的环境(2 KB RAM),该数组占用720个字节。我原本试图为每个像素使用一个数组,并且内存不足。使用if语句的第二个实现,它运行良好,但制作新模式非常繁琐。我正在寻找一种解决问题的方法,这可能比我现在解决的方法更好。
以下是我想制作动画的模式示例。
X moves forward 1 each cycle.
Y moves forward 3 places then back 2.
Z moves backwards 3 places each cycle.
|_|X|_|_|_|_|_|_|_|_|_|_|_|_|Y|_|_|_|_|_|_|_|_|_|_|_|_|_|_|Z|
|_|_|X|_|_|_|_|_|_|_|_|_|_|_|_|_|_|Y|_|_|_|_|_|_|_|_|Z|_|_|_|
|_|_|_|X|_|_|_|_|_|_|_|_|_|_|_|Y|_|_|_|_|_|_|_|Z|_|_|_|_|_|_|
这是我要使用的代码。
void animateScene1() {
for(int i = 0; i <= numPixels; i++) {
setColor(i, X);
if(i < 15) {
if(i % 2 == 0)
setColor((i+15)+3), Y);
else
setColor((i+15)-2), Y);
}
if(i < 10)
setColor(numPixels-3*i, Z);
}
}
有更好方法的想法吗?
答案 0 :(得分:2)
这样的功能怎么样?
int pixelAt(int index, int min, int max, int a, int b, int b_2)
{
int pixel = -1;
if (min <= index && index <= max)
{
pixel = a * index + b;
if (i % 2)
{
pixel += b_2;
}
}
return pixel;
}
然后你会:
for (int i = 0; i < numPixels; i++)
{
// This assumes setColor(-1, x) does nothing
setColor(pixelAt(i, 0, numPixels, 1, 0, 0), X);
setColor(pixelAt(i, 0, 15, 1, 18, -5), Y);
setColor(pixelAt(i, 0, 10, -3, numPixels, 0), Z);
}
当然,如果添加新的要求,pixelAt
函数会变得复杂得多,例如更改偶数的乘法因子,以不同的方式处理3的倍数等等。但是,您可以使用类似于这个减少你必须写的功能的数量。一个用于简单模式,一个用于偶数/奇数模式,一个用于三倍数,等等。取决于模式的不同程度,以及代码的内存空间。