我使用Arduino Uno来控制两个led。目标是能够轻松地创建flash模式(在数组中),并让它们循环播放。
我目前使用这个数组来存储模式:
int patterns[][64][3] = {
{
{HIGH, LOW, 500},
{LOW, HIGH, 500},
},
{
{HIGH, LOW, 250},
{LOW, HIGH, 250},
},
{
{HIGH, LOW, 125},
{LOW, HIGH, 125},
},
{
{HIGH, LOW, 250},
{LOW, LOW, 250},
{HIGH, LOW, 250},
{LOW, LOW, 250},
{LOW, HIGH, 250},
{LOW, LOW, 250},
{LOW, HIGH, 250},
{LOW, LOW, 250},
},
// {
// {HIGH, LOW, 125},
// {LOW, LOW, 125},
// {HIGH, LOW, 125},
// {LOW, LOW, 125},
//
// {LOW, HIGH, 125},
// {LOW, LOW, 125},
// {LOW, HIGH, 125},
// {LOW, LOW, 125},
// },
};
最后一个模式被注释掉,因为当我添加它时,Arduino不能很好地运行。输出通常看起来像这样:
Using data from EEPROM
CurrentPattern: 0, PatternPosition: 0
CurrentPattern: 0, PatternPosition: 1
CurrentPattern: 0, PatternPosition: 0
CurrentPattern: 0, PatternPosition: 1
CurrentPattern: 0, PatternPosition: 0
CurrentPattern: 0, PatternPosition: 1
CurrentPattern: 0, PatternPosition: 0
CurrentPattern: 0, PatternPosition: 1
现在看起来像这样:
00
00
00
00
00
00
00
01
我想这可能是某种内存问题…但似乎即使我使用像这样的模式数组:
int patterns[][64][3] = {
{
{HIGH, LOW, 500},
{LOW, HIGH, 500},
},
{
{HIGH, LOW, 250},
{LOW, HIGH, 250},
},
{
{HIGH, LOW, 125},
{LOW, HIGH, 125},
},
{
{HIGH, LOW, 125},
{LOW, HIGH, 125},
},
{
{HIGH, LOW, 125},
{LOW, HIGH, 125},
},
};
我也有同样的问题
第一个数组(最后一个模式注释掉)使用4 * 64 * 3 * sizeof(int)
字节。假设你有一个16位板,那是1536
字节。如果取消最后一个模式的注释,则数组使用5*64*3*2 = 1920
字节。另一个数组(在问题末尾附近)也使用1920
字节。因此,如果内存是问题,那么两个数组将有相同的问题。
如果你想要减少内存的使用,那么你就需要另一种方式来存储模式。一种解决方案是创建一个2D数组的数组,其中每个2D数组的大小仅为必要的大小。例如,下面是声明为2D数组的五个模式。注意,内存使用只有(3+3+3+9+9) * 3 * 2 = 162
字节。
int pattern0[][3] =
{
{HIGH, LOW, 500},
{LOW, HIGH, 500},
{0, 0, 0}
};
int pattern1[][3] =
{
{HIGH, LOW, 250},
{LOW, HIGH, 250},
{0, 0, 0}
};
int pattern2[][3] =
{
{HIGH, LOW, 125},
{LOW, HIGH, 125},
{0, 0, 0}
};
int pattern3[][3] =
{
{HIGH, LOW, 250},
{LOW, LOW, 250},
{HIGH, LOW, 250},
{LOW, LOW, 250},
{LOW, HIGH, 250},
{LOW, LOW, 250},
{LOW, HIGH, 250},
{LOW, LOW, 250},
{0, 0, 0}
};
int pattern4[][3] =
{
{HIGH, LOW, 125},
{LOW, LOW, 125},
{HIGH, LOW, 125},
{LOW, LOW, 125},
{LOW, HIGH, 125},
{LOW, LOW, 125},
{LOW, HIGH, 125},
{LOW, LOW, 125},
{0, 0, 0}
};
由于2D数组的大小不尽相同,因此需要一种方法来识别每个数组的末尾。这可以通过哨兵值来完成。在上面的示例中,我在第三列中使用了值0作为哨兵。
假设arduino编译器足够聪明,可以理解数组指针的数组,您可以将所有2D数组分组为单个数组,如下所示。生成的数组可以像您已经拥有的3D数组一样使用。
int (*patterns[])[3] =
{
pattern0,
pattern1,
pattern2,
pattern3,
pattern4,
NULL
};
下面是一些测试代码,通过打印出串行端口上的模式来证明/反驳数组是否正确设置。
void loop()
{
int i, j;
for ( i = 0; patterns[i] != NULL; i++ )
{
Serial.print( "Pattern " );
Serial.println( i + 1 );
for ( j = 0; patterns[i][j][2] != 0; j++ )
{
if ( patterns[i][j][0] == HIGH )
Serial.print( "HIGH " );
else
Serial.print( "LOW " );
if ( patterns[i][j][1] == HIGH )
Serial.print( "HIGH " );
else
Serial.print( "LOW " );
Serial.println( patterns[i][j][2] );
}
Serial.println( "" );
delay( 500 );
}
}