2015-04-15 65 views
0

目前我正在研究我的4x4x4 LED立方体,我想为它编写自己的代码,但目前我被卡在使用3D阵列上。我在void setup()中声明了几个数组,并且我也尝试将它们放入void loop()中。尽管如此,当试图编译时,它仍然会返回错误。Arduino的3D阵列

简而言之,代码应该生成一个带有XYZ值的随机点。然后它必须将其写入缓冲区,此缓冲区必须将其投影并多路传输到LED立方体上。

我做了返回错误粗体的行。

的错误是:

LedCube1.0.ino: In function 'void loop()':  
LedCube1.0.ino:41:3: error: 'ledBuffer' was not declared in this scope  
LedCube1.0.ino:41:13: error: 'xSeed' was not declared in this scope  
LedCube1.0.ino:41:20: error: 'ySeed' was not declared in this scope  
LedCube1.0.ino:41:27: error: 'zSeed' was not declared in this scope  
LedCube1.0.ino:42:7: error: 'rainstep' was not declared in this scope  
LedCube1.0.ino: In function 'int allOff()':  
LedCube1.0.ino:76:9: error: 'ledBuffer' was not declared in this scope 
LedCube1.0.ino: In function 'int allOn()': 
LedCube1.0.ino:86:9: error: 'ledBuffer' was not declared in this scope  
Error compiling. 

代码:

void setup() {                 
    //sets all pins as output             
    for(int a=22;a<53;a++){              
     pinMode(a, OUTPUT);              
    }                   
    //declares the sizes of the cube           
    int width = 4;                
    int depth = 4;                
    int height = 4;                
    int ledBuffer[4][4][4] = { //creates a buffer that can store values generated by a function 
     {                  
      {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}       
     },                  
     {                  
      {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}       
     },                  
     {                  
      {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0},       
     },                  
     {                  
      {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0},       
     }                  
    };                   
    //defines to which connector each layer is connected      
    int ledXY[4][4] = {               
     {22,24,26,28} ,               
     {30,32,34,36},               
     {23,25,27,29},               
     {31,33,35,37}               
    };                   
    int ledZ[4] = {38,40,42,44};            
    //create variables to start generating raindrops       
    int rainstep = 0;               
    int xSeed = 0;                
    int ySeed = 0;                
    int zSeed = 0;                
} 

void loop() {                 
    //generatedrop                
    ledBuffer[xSeed][ySeed][zSeed] = 0;           
    if (rainstep == 0)               
    {                   
     int xSeed=random(0,3);             
     int ySeed=random(0,3);             
     int zSeed=random(0,3);             
    }                   
    else                  
    {                   
     zSeed = zSeed - rainstep;            
    }                   
    ledBuffer[xSeed][ySeed][zSeed] = 1;           

    //updatecube                
    for(int i=0; i<80;i++){              
     int currentZ = i%4;              
     allOff;                 
     for(int j=0;j<4;j++){             
      for(int k=0; i<4;i++){            
       if(ledBuffer[i][j][k]==0){          
        digitalWrite(ledBuffer[i][j][k],HIGH);      
       }else{               
        digitalWrite(ledBuffer[i][j][k],LOW);      
       }                
      }                 
     }                  
    }                   
}          

//function declares entire array 0            
int allOff(){                 
    for(int c=0;c<4;c++){              
     for(int d=0;d<4;d++){             
      for(int e=0;e<4;e++){            
       ledBuffer[c][d][e]=0;           
      }                 
     }                  
    }                   
};                    
//function declares entire array 1            
int allOn(){                 
    for(int c=0;c<4;c++){              
     for(int d=0;d<4;d++){             
      for(int e=0;e<4;e++){            
       ledBuffer[c][d][e]=1;           
      }                 
     }                  
    }                   
};     
I re 

有人可以帮助我,或至少点我在正确的方向。

+2

在测试任何代码之前,不应该编写这么多的代码。你试图至少得到两件新事物同时工作;独立开发它们,然后将它们挂在一起。 – Beta

回答

1

void loop(),您声明xSeedySeedzSeedif块,这使得局部变量,如果块,这意味着他们走出去的范围时你,如果块退出内部。在ledBuffer之前(在void loop()函数的开始处)声明它们之前(在外部)if块,因为在您告诉编译器它们存在之前您正试图使用​​这些变量,因此编译器的消息是它们“未声明在此范围内”

编辑

而且,看来你想所有这些功能相同的ledBuffer 3D阵列上运行。您应该考虑将其声明为全局变量(如果您使用的是C),或者如果您使用的是C++,则可以考虑将其作为类,并将ledBuffer作为属性/字段。

0

我试图拆分你的代码并将其因式分解。我没有Arduino构建系统,我无法测试我的代码。 我不明白你的映射x,y,z到pin号码我已经尝试了一个。

/* Struct for global conf */ 
static struct {                 
    int ledBuffer[4][4][4];              
    int ledXY[4][4];               
    int ledZ[4];                
} _G;                   

void setup() {                 
    _G.ledXY = {                
     {22, 24, 26, 28} ,              
     {30, 32, 34, 36},              
     {23, 25, 27, 29},              
     {31, 33, 35, 37}              
    };                   
    _G.ledZ = {38,40,42,44};             

    //sets all used pins as output             
    for(int i = 0; i < 4; i++){             
     pinMode(_G.ledZ[i], OUTPUT);           
     for (int j = 0; j < 4; j++) {           
      pinMode(_G.ledXY[i][j], OUTPUT);         
     }                  
    }                   
    allOn(); /* switch on all led*/                 
    allOff(); /* switch off all led */                 
}                    

void loop() {                 
    static int xSeed;               
    static int ySeed;               
    static int zSeed;               

    _G.ledBuffer[xSeed][ySeed][zSeed] = 0;          

    if (zSeed == 0)                
    {                   
     xSeed = random(0, 3);             
     ySeed = random(0, 3);             
     zSeed = random(0, 3);             
    } else {                 
     zSeed--;                
    }                   
    _G.ledBuffer[xSeed][ySeed][zSeed] = 1;          

    doLight();                 
} 

static void doLight();               

    for (int step = 0; step < 80; step++) { /* Perhaps use sleep instead */         
     allOff();                
     for(int i = 0; i < 4; i++){            
      for(int j = 0; j < 4; j++){           
       for(int k = 0; i < 4; i++){          
        digitalSwitch(i, j, k, ledBuffer[i][j][k]);     
       }                
      }                 
     }                  
    }                   
}                    

static void digitalSwitch(int x, int y, int z, int on) { 
    /* convert x y z to the correct pin*/      
    digitalWrite(_G.ledXY[x][y], _G.[ledZ[z]], on ? HIGH : LOW);    
}                    


static void _all(int on) {              
    for(int i = 0; i < 4; i++){             
     for(int j = 0; j < 4; j++){            
      for(int k = 0; i < 4; i++){           
       digitalSwitch(i, j, k, on);          
      }                 
     }                  
    }                   
}                    
int allOff(){                 
    _all(0);                 
};                    

int allOn(){                 
    _all(1);                 
};