2012-10-19 108 views
2

我寫了下面的代碼,一次點亮一行LED。for循環結束時的延遲

int ledPins[] = {7,8,9,10,11,12,13}; 

void setup() { 
    for (int i = 0; i < sizeof(ledPins); i++) { 
    pinMode(ledPins[i], OUTPUT); 
    } 
} 

void loop() { 
    for (int i = 0; i < sizeof(ledPins); i++) { 
    digitalWrite(i, HIGH); 
    delay(1000); 
    digitalWrite(i, LOW); 
    delay(1000); 
    } 
} 

上述工作正常。然而,在完成for循環之後,重複之前會有很長的延遲(約10秒)。

爲什麼會有這麼長的延遲?這是預期還是與我的代碼有問題?

+0

是否應該按順序閃爍所有LED? –

+0

@JanDvorak是的,它閃爍每個LED的順序,然後有(不需要的)延遲... – smilledge

+2

如果sizeof'返回大小以字節爲單位,並且每個int都不止一個字節,則會閃爍更多的LED是。 –

回答

4

函數sizeof(array)返回內存中數組的大小,以字節爲單位。並且因爲sizeof(int)可能不是1,所以您會得到比預期更大的值。

sizeof可用於確定數組中元素的數量,方法是將整個數組的大小除以單個元素的大小。

所以這行:

for (int i = 0; i < sizeof(ledPins); i++) { 

應該寫成:

for (int i = 0; i < sizeof(ledPins)/sizeof(int); i++) { 

見: http://en.wikipedia.org/wiki/Sizeof

+0

很好的答案,謝謝! – smilledge

+0

@Jan Dvorak。 Arduino不是從C++「派生」的。它使用GCC,這是C++。如果你不相信這會將IDE切換到詳細模式,並觀察編譯器的工作。只有IDE試圖通過生成原型來僞裝C++編譯器(並且做得不好),並且這個庫會將主要鏈接到您的草圖,以便您擁有setup + loop而不是main。 –

+0

@UdoKlein對不起,我現在找不到我的原始資源。維基百科和標籤wiki現在都是正確的。 –

1

在作爲陣中擁有固定的大小很簡單做到這一點這種情況下:

#define NO_LEDS 7 

int ledPins[NO_LEDS] = {7,8,9,10,11,12,13}; 

void setup() { 
    for (int i = 0; i < NO_LEDS; i++) { 
    pinMode(ledPins[i], OUTPUT); 
    } 
} 

或者將數組大小的計算移動到一個變量中並使用它。

int ledPins[] = {7,8,9,10,11,12,13}; 
int noLeds; 

void setup() { 
    noLeds = sizeof(ledPins)/sizeof(int); 

    for (int i = 0; i < noLeds; i++) { 
    pinMode(ledPins[i], OUTPUT); 
    } 
} 
+0

#define NO_LEDS 7最好是像const一樣unsigned int no_leds = 7;編譯後的代碼將會是相同的,但您可以通過編譯器進行類型檢查。 –

+0

關於第二段代碼,最好將其計算爲一個常量。這是const unsigned int noLeds = sizeof(ledPins)/ sizeof(int);絕對不需要將其作爲變量。 –