Simple Led Reihe will nicht

Nabend
Ich möchte das alle Leds aus dem Array über die millis() verzögert auf High gehen.
Jedoch geht nur die an Pin 2 an, oder wenn die if Zeile oberhalb der for Schleife sitzt alle an.
Wo hab ich hier den Denkfehler...

MfG Ronny

int ledPin[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
unsigned long previousMillis = 0;
const long interval = 500;

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

void loop() {

  unsigned long currentMillis = millis();

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

    if (currentMillis - previousMillis >= interval) {

      previousMillis = currentMillis;

      digitalWrite(ledPin[i], HIGH);
    }
  }
}

Fatale Bereichsüberschreitung.

Das Array hat nur 12 Zellen, du lässt die Schleife aber von 0 bis 23 laufen.

E:\Programme\arduino\portable\packages\arduino\hardware\avr\1.8.6\cores\arduino\main.cpp: In function 'main':
E:\Programme\arduino\portable\sketchbook\sketch_feb10d\sketch_feb10d.ino:7:21: warning: iteration 12 invokes undefined behavior [-Waggressive-loop-optimizations]
    7 |     pinMode(ledPin[i], OUTPUT);
      |                     ^
E:\Programme\arduino\portable\sketchbook\sketch_feb10d\sketch_feb10d.ino:6:21: note: within this loop
    6 |   for (int i = 0; i < sizeof (ledPin); i++) {
      |                     ^

ein int ist auf einem Arduino Uno 2 Byte groß, daher überschreitest du mit deiner for loop die größe deines Arrays.

du könntest

  • für Pins statt int einfach ein uint8_t verwenden, oder
  • die Anzahlermittlung absichern mit sizeof(ledPin)/sizeof(ledPin[0])
  • eine auto range based for loop verwenden
constexpr uint8_t ledPin[] {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
unsigned long previousMillis = 0;
const long interval = 500;

void setup() {
  for (size_t i = 0; i < sizeof (ledPin) / sizeof(ledPin[0]); i++) {
    pinMode(ledPin[i], OUTPUT);
  }
}

void loop() {
  unsigned long currentMillis = millis();
  for (auto &pin : ledPin) {
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      digitalWrite(pin, HIGH);
    }
  }
}

Da ist noch ein anderer Schnitzer. Die for-Schleife zählt unabhängig vom millis()-Vergleich die Pins hoch. Eigentlich braucht es einen eigenen Zähler der erst nach Ablauf des millis()-Vergleiches erhöht wird.

int ledPin[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
const byte pinNum = sizeof(ledPin)/sizeof(ledPin[0]);
byte count = 0;
unsigned long previousMillis = 0;
const long interval = 500;

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

void loop() {

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    digitalWrite(ledPin[count], HIGH);
    count++;
    if(count == pinNum) count = 0;
  }
}

(Mit Handy getippt, evtuelle Tippfehler drin)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.