TL;DR我认为我将数组错误地传递给了一个函数,因此从中读取的数据不正确,可能会损坏Arduino内存。
完整代码可在>此处找到<
经过一番阅读,我仍然有点困惑将数组传递到函数中并在该函数中修改其数据的最佳方法。
到目前为止,这两个问题有一定的帮助,从而使我的代码得以编译;但经过一点测试,我遇到了一些问题,当我在函数中时,我希望看到的数据没有被正确地读取回来。
阵列/指针/参考混淆
在C中通过引用传递数组?
基本程序
它点亮了3个基本颜色为紫色的LED灯带(在最初的褪色后,每盏灯都会一个接一个地熄灭),然后沿着灯带形成一种颜色轨迹效果(7像素长),并从头开始循环回来。
视频可以在这里看到效果https://www.youtube.com/watch?v=S8tVfFfsiqI
我打算做同样的效果,但我后来尝试重新考虑我的代码,这样每个人都可以更容易地调整颜色的参数。
原始源代码可在此处找到>单击查看<(随意复制/修改/使用代码,任何人都可以使用,非常有趣)
我现在要做的
因此,现在的目标是从上面重新考虑代码,以便更容易根据用户的偏好设置Trail效果的颜色。因此,我想在其他地方定义踪迹的颜色,然后将踪迹的每个实例传递到处理更新它的函数中(这是在不使用类的情况下完成的,只有Structs和Arrays,因为这对该代码所针对的非编程类型来说是令人困惑的)
//Setting up Trail effect length
#define TRAIL_LENGTH 7
typedef struct Color {
byte r;
byte g;
byte b;
};
typedef struct TrailPixel {
uint16_t position;
Color color;
};
//Function Prototypes
void trailEffectForward (Adafruit_NeoPixel &strip, struct TrailPixel (*trailArray)[TRAIL_LENGTH] );
//Make the arrays
TrailPixel trailLeft[TRAIL_LENGTH];
TrailPixel trailBottom[TRAIL_LENGTH];
TrailPixel trailRight[TRAIL_LENGTH];
正如你从上面看到的,我创建了两个Structs,然后用这些Structs组成3个数组。然后,我用…填充每个轨迹效果的"位置"值。。。
for (int i = 0; i < TRAIL_LENGTH; i++) {
trailLeft[i].position = i + 5; //start just off the strip
trailBottom[i].position = 15 - i; //start off screen, but timed in a way so to look like the Left and Right trails converge onto the bottom at the same time
trailRight[i].position = i + 5; //start just off strip
}
在代码的后面,我调用了我想处理效果的函数,并将数组的细节交给它。我想在这个函数中,命令更新光带上的像素颜色,然后为下次更新位置。
但是事情很快就被搞砸了,以至于我的Arduino每隔几秒钟就会重新启动一次,颜色也没有像预期的那样。
以下是我目前如何调用轨迹效果函数。。。
trailEffectForward ( stripBottom , &trailBottom );
在那里尝试弄清楚发生了什么之后,我添加了一些串行输出来检查值。
void trailEffectForward(Adafruit_NeoPixel &strip, TrailPixel (*trailArray)[TRAIL_LENGTH]) {
Serial.println("---------------------");
Serial.println(trailArray[0]->position);
Serial.println(trailArray[1]->position);
Serial.println(trailArray[2]->position);
Serial.println(trailArray[3]->position);
Serial.println(trailArray[4]->position);
Serial.println(trailArray[5]->position);
Serial.println(trailArray[6]->position);
我预计如果事情按计划进行,我会看到的数字
---------------------
15
14
13
12
11
10
9
但我最终得到的是:(
---------------------
15
5
5
43
1000
0
0
可以找到当前处于"正在工作"状态的完整代码http://chiggenwingz.com/quads/ledcode/quad_leds_v0.2workinprogress.ino
注意:当我试图缩小问题的范围时,我已经评论了很多将颜色应用于像素的肉。基本上,我希望上面列出的输出停止发生。
再次在您自己的项目中使用任何代码:)
好吧,我从这里找到了答案[在C]中传递一个结构数组
所以之前的功能是。。。
void trailEffectForward(Adafruit_NeoPixel &strip, TrailPixel (*trailArray)[TRAIL_LENGTH])
现在这个
void trailEffectForward(Adafruit_NeoPixel &strip, struct TrailPixel trailArray[TRAIL_LENGTH] )
去掉了所有指针/引用的有趣内容。我相信必须把"struct"这个词放在那里。
所以当我调用函数时,我以前使用。。。
trailEffectForward ( stripBottom , &trailBottom );
但现在我用这个
trailEffectForward ( stripBottom , trailBottom );
我不再有损坏的数据,一切似乎又恢复了正常工作。
希望这能在未来几年帮助到一些人:)