这是一个有效的arduino和C ++数组

时间:2014-10-30 13:39:55

标签: c++ arduino

我想使用以下命名约定

创建几个数组
const int zone2[] = {11};
const int zone3[] = {12,13};
const int zone4[] = {14};

然后我想创建一个循环并检查获取我正在执行以下操作的数组的值。

// read the state of the pushbutton value:
byte myInput =2;

//Outer loop checks the state of the Input Pins
//Inner loop iterates through corresponding array and pulls pins high or low depending on ButtonState

for (myInput = 2;myInput<5; myInput++) {
    buttonState = digitalRead(myInput);

    int ArrayCount;

    String zoneChk = "zone" + String(myInput);
    ArrayCount = sizeof(zoneChk) / sizeof( int ) ; // sizeof( int ) is the newpart
    int arrayPosition;

    for (arrayPosition = 0;arrayPosition < ArrayCount ; arrayPosition++) {
        if (buttonState == HIGH) {     
            // turn LED on:    
            digitalWrite(zoneChk[arrayPosition], HIGH);  
        } 
        else {
            // turn LED off:
            digitalWrite(zoneChk[arrayPosition], LOW);
        }
    } 
}

我被告知数组对于C ++ arduino是无效的,我不太确定,只是随便学习。我希望控制一些房屋灯区域有效的房间和阵列的内容,房间内的不同灯光。我称他们为Zones'x'所以我可以减少代码需要检查每个房间的开关。

感谢

2 个答案:

答案 0 :(得分:0)

String zoneChk = "zone" + String(myInput);
ArrayCount = sizeof(zoneChk) / sizeof( int ) ; // sizeof( int ) is the newpart

Nooo no no no no。

const int * const zones[] = {zone2, zone3, zone4};

 ...

for (int z = 0; z < 3; ++z)
{
  // access zones[z]
}

另外,请考虑将每个zoneX(以及可选zones)空终止,以便您知道何时到达目的地。

答案 1 :(得分:0)

String zoneChk = "zone" + String(myInput);
ArrayCount = sizeof(zoneChk) / sizeof( int ) ; // sizeof( int ) is the newpart

这不允许您在运行时访问zone2..5变量。您正在创建一个与zone2变量无关的“zone2”字符串。

下面的代码编译,但我没有Arduino与我完全测试它。它仍然允许您在不对代码进行任何修改的情况下更改zone2,3,4的大小。如果你想要更多的区域,你将不得不添加更多的case语句(包含注释掉的zone5代码)。

如果你想让它完全动态,我们可以为区域使用多维数组,但这应该是最小代码的良好开端

for (myInput = 2;myInput<5; myInput++) {
    int buttonState = digitalRead(myInput);

    int ArrayCount;
    const int *zoneChk;

    //This is the part you will have to add to if you want more zones
    switch(myInput){
        case 2:
          ArrayCount = sizeof(zone2) / sizeof (zone2[0]);
          zoneChk = zone2;
        break;
        case 3:
          ArrayCount = sizeof(zone3) / sizeof (zone3[0]);
          zoneChk = zone3;
        break;
        case 4:
          ArrayCount = sizeof(zone4) / sizeof (zone4[0]);
          zoneChk = zone4;
        break;
        //ex. case 5
        //case 5:
        //  ArrayCount = sizeof(zone5) / sizeof (zone5[0]);
        //  zoneChk = zone5;
        //break;
    }

    int arrayPosition;

    for (arrayPosition = 0;arrayPosition < ArrayCount ; arrayPosition++) {
        if (buttonState == HIGH) {     
            // turn LED on:    
            digitalWrite(zoneChk[arrayPosition], HIGH);  
        } 
        else {
            // turn LED off:
            digitalWrite(zoneChk[arrayPosition], LOW);
        }
    } 
}