繁体   English   中英

Arduino的3D阵列

[英]3D array for Arduino

目前,我正在开发4x4x4 led多维数据集,我想为其编写自己的代码,但目前仍在使用3D阵列。 我在void setup()中声明了几个数组,并且尝试将它们也放入void loop()中。 尽管如此,在尝试编译时仍会返回错误。

简而言之,该代码应生成具有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

有人可以帮助我,或者至少可以指出正确的方向。

void loop() ,您在if块内声明xSeedySeedzSeed ,这使变量成为该if块的局部变量,这意味着在退出if块时它们超出范围。 void loop()函数的开始之前,在if块之前(在ledBuffer外部)声明它们,然后在ledBuffer之前声明它们,因为您试图在告诉编译器它们存在之前就使用这些变量,因此,编译器发出的消息是“未在此范围内声明”

编辑

另外,似乎您希望所有这些功能都在同一ledBuffer 3D阵列上运行。 您应该考虑将其声明为全局变量(如果使用的是C),或者如果您使用的是C ++,则可以考虑将其声明为类,并使用ledBuffer作为属性/字段。

我试图拆分您的代码并将其分解。 我没有Arduino构建系统,无法测试我的代码。 我不了解您将x,y,z映射到我尝试过的引脚号。

/* 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);                                                                   
};     

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM