Anfänger Fragen zum Adruino...

giGa977:
das mit den blink without delay... ja es klappt ja nur leider alle farben zugleich nicht durch einander....

Was Du für eine LED machst, kannst Du auch für viele LEDs verwenden.

Was Du für eine LED machst, packst Du in eine Funktion, die Du für jede Farbe aufrufst. Da Du die Konstanten und Variablen auch je Farbe benötigst, erstellst Du eine Struktur. Je Farbe übergibst Du die Struktur an die Funktion, die dann damit arbeitet. Da die Variablen von der Funktion verändert werden, ist es wichtig, daß die Funktion einen Zeiger auf die Struktur und keine Kopie der Struktur verwendet. Das macht "&" bei LEDS &b.

const int ledPinW =  12;              // the number of the White LED pin
const int schalterPin =  2;
unsigned long currentMillis;

struct LEDS {
  const int ledPin;                     // the number of the LED pin
  unsigned long previousMillis;         // will store last time LED was updated
  unsigned long interval;
};

LEDS led[] {
  {9, 0, 0}, // Rot
  {10, 0, 0}, // Gruen
  {11, 0, 0} // Blau
};

void blink (LEDS &b) {
  if (currentMillis - b.previousMillis >= b.interval) {
    b.previousMillis = currentMillis;
    b.interval = random(50, 500);
    digitalWrite(b.ledPin, !digitalRead(b.ledPin));
  }
}

void setup() {
  pinMode(schalterPin, INPUT_PULLUP);
  pinMode(ledPinW, OUTPUT);
  for (LEDS &l : led) pinMode(l.ledPin, OUTPUT);
}

void loop() {
  currentMillis = millis();
  if (digitalRead(schalterPin)) {
    digitalWrite(ledPinW, HIGH);
    for (LEDS &l : led) digitalWrite(l.ledPin, LOW);
  } else {
    digitalWrite(ledPinW, LOW);
    for (LEDS &l : led) blink(l);
  }
}

Nach einer Idee von combie kann man zur Initialisierung auch einen Contructor verwenden:

const int ledPinW =  12;              // the number of the White LED pin
const int schalterPin =  2;
unsigned long currentMillis;

struct LEDS {
  LEDS(const int ledPin): ledPin(ledPin), previousMillis(0), interval(0) {}
  
  const int ledPin;                     // the number of the LED pin
  unsigned long previousMillis;         // will store last time LED was updated
  unsigned long interval;
};

LEDS led[] {
  {9}, // Rot
  {10}, // Gruen
  {11} // Blau
};

void blink (LEDS &b) {
  if (currentMillis - b.previousMillis >= b.interval) {
    b.previousMillis = currentMillis;
    b.interval = random(50, 500);
    digitalWrite(b.ledPin, !digitalRead(b.ledPin));
  }
}

void setup() {
  pinMode(schalterPin, INPUT_PULLUP);
  pinMode(ledPinW, OUTPUT);
  for (LEDS &l : led) pinMode(l.ledPin, OUTPUT);
}

void loop() {
  currentMillis = millis();
  if (digitalRead(schalterPin)) {
    digitalWrite(ledPinW, HIGH);
    for (LEDS &l : led) digitalWrite(l.ledPin, LOW);
  } else {
    digitalWrite(ledPinW, LOW);
    for (LEDS &l : led) blink(l);
  }
}

Nun kann man die Funktiuon noch zur Methode machen:

const int ledPinW =  12;              // the number of the White LED pin
const int schalterPin =  2;
unsigned long currentMillis;

struct LEDS {
  LEDS(const int ledPin): ledPin(ledPin), previousMillis(0), interval(0) {}
  
void blink () {
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    interval = random(50, 500);
    digitalWrite(ledPin, !digitalRead(ledPin));
  }
}

  const int ledPin;                     // the number of the LED pin
  unsigned long previousMillis;         // will store last time LED was updated
  unsigned long interval;
};

LEDS led[] {
  {9},	// Rot
  {10},	// Gruen
  {11}	// Blau
};

void setup() {
  pinMode(schalterPin, INPUT_PULLUP);
  pinMode(ledPinW, OUTPUT);
  for (LEDS &l : led) pinMode(l.ledPin, OUTPUT);
}

void loop() {
  currentMillis = millis();
  if (digitalRead(schalterPin)) {
    digitalWrite(ledPinW, HIGH);
    for (LEDS &l : led) digitalWrite(l.ledPin, LOW);
  } else {
    digitalWrite(ledPinW, LOW);
    for (LEDS &l : led) l.blink();
  }
}

Suche Dir was aus, dann laß es schön blinken :slight_smile: