Frage wegen LEDs ansteuern

Hi,
und zwar will ich 2 LED's mit meinem Arduino ansteuern.
Ich möchte es mit if- machen quasi so, dass die eine LED angeht und nach einer gewissen Zeit ausgeht und wenn diese LED eben für die kurze Zeit aus ist soll die andere Leuchten. Ich weiß leider auch nicht woran das Problem bei meinem Code liegt eig sollte es funktionieren???
LG und danke schonmal für alle antworten :slight_smile:

int Ledstatus1 = 0;
int Ledstatus2 = 1;
void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
Serial.begin(9600);
}


void loop() {
Ledstatus1 = digitalRead(13);
Ledstatus2 = digitalRead(12);

digitalWrite(13, HIGH);
delay(1000);
Ledstatus1++;

digitalWrite(13, LOW);
delay(1000);


if  (Ledstatus1 == 0) {
  Ledstatus2 = 1;
  digitalWrite(12, HIGH);
}

}

Ich hab auch schon viel rumprobiert mit Ledstatus2 ohne, mit Ledstatus++ und ohne etc...

Code bitte in Code Tags </> anzeigen.

Serial.begin() gehört in setup(), nicht in loop().

Vermutlich mußt Du Deine Taster entprellen, siehe Debounce Beispiel in der IDE.

was für taster und wie entprellen?

Sorry, da war ich im falschen Film :frowning:

Das ist hier immer FALSE.

Entscheide Dich: LED Status entweder mit Variablen vorgeben oder mit digitalRead() abfragen. Sonst geht alles mögliche durcheinander.

Es ist in so einem einfachen Programm nicht unbedingt notwendig, aber ein Zustandsdiagramm könnte Dir weiterhelfen. Siehe "Endlicher Automat" oder "state machine".

Also schribe ich quasi so?

if digitalWrite(13, LOW) {
 digitalWrite(12,HIGH);
}

Wenn Du jetzt noch digitalRead und Write richtig verwendest...

if digitalRead(13, LOW) {
 digitalWrite(12,HIGH);
}


wenn ich es so mache kommt dieser Fehler

exit status 1
expected '(' before 'digitalRead'

Bei if muß die Bedingung immer eingeklammert werden: if (...)

Also ich habe es jetzt hinbekommen, dass die 2te LED angeht aber wie bekomme ich diese immer aus wenn die andere gerade leuchtet?

Im einfachsten Fall gibt es eine Zustandsvariable die angibt, ob LED 1 oder 2 leuchten soll. Am Ende von loop() werden dann die LEDs entsprechend ein/aus geschaltet. Dann muß man nur noch festlegen, wann diese Variable ihren Zustand ändern soll.

const byte ledPin[2] = {13, 12};
const unsigned long einZeit[2] = {1000, 500};
unsigned long startZeit = 0;
byte number = 0;
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start...:"));
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    pinMode(ledPin[b], OUTPUT);
  }
  digitalWrite(ledPin[0], HIGH);
  digitalWrite(ledPin[1], LOW);
  startZeit = millis();
}


void loop()
{
  if (digitalRead(ledPin[number]) && millis() - startZeit >= einZeit[number])
  {
    Serial.println(F("Tik..:"));
    startZeit = millis();
    digitalWrite(ledPin[number], !digitalRead(ledPin[number]));
    number++;
    if (number >= (sizeof(ledPin)))
      number = 0;
    digitalWrite(ledPin[number], !digitalRead(ledPin[number]));
  }
}

zweite Variante:

const byte ledPin[2] = {13, 12};
const unsigned long einAusZeit[2] = {1000, 500}; // Ein, Aus
unsigned long startZeit = 0;
byte number = 0;
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start...:"));
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    pinMode(ledPin[b], OUTPUT);
  }
  digitalWrite(ledPin[0], HIGH);
  digitalWrite(ledPin[1], LOW);
  startZeit = millis();
}


void loop()
{
  if (millis() - startZeit >= einAusZeit[number])
  {
    Serial.println(F("Tik..:"));
    startZeit = millis();
    digitalWrite(ledPin[0], !digitalRead(ledPin[0]));
    number++;
    if (number >= sizeof(einAusZeit)/sizeof(einAusZeit[0])) number = 0;
  }
  digitalWrite(ledPin[1], !digitalRead(ledPin[0]));
}

Und noch kürzer wegen den 2 LED:
(Nur loop geändert gegenüber dem 2ten Code:

void loop()
{
  if (millis() - startZeit >= einAusZeit[!digitalRead(ledPin[0])])
  {
    Serial.println(F("Tik..:"));
    digitalWrite(ledPin[0], !digitalRead(ledPin[0]));
    startZeit = millis();
  }
  digitalWrite(ledPin[1], !digitalRead(ledPin[0]));
}

Hallo,
@my_xy_projekt hat Dir ja schon eine Version gemacht. Allerdings ist die eventuell noch ein bisschen zu hoch für Dich. Er verwendet z.B Arrays für die LED pin´s und für die Zeit millis(). Falls Du damit noch nichts anfangen kannst hab ich hier mal einen Version zum einsteigen für Dich.

const byte led1pin = 13;// pin festlegen als const ändert sich ja nicht
const byte led2pin = 12;
bool merker; // eine Hilfsvariable vom Typ bool

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(led1pin, OUTPUT);// pin Mode festlegen
  pinMode(led2pin, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (merker == true) { // merker abfragen
    digitalWrite(led1pin, HIGH);
    digitalWrite(led2pin, LOW);
  }
  else {
    digitalWrite(led1pin, LOW);
    digitalWrite(led2pin, HIGH);
  }

  delay(1000);
  merker = not merker;// merker wird invertiert
}

Als nächsten und wichtigen Schritt solltest Du lernen wie man millis() verwendet. dazu hab ich Dir den Sketch schon mal so vorbereitete das es mit einer zusätzlichen if.. Abfrage, da wo jetzt das delay(1000) ist, recht einfach ist. Dann kannst Du im nächsten Schritt die if.. else Konstruktion rausnehmen und die Ausgabe auf die pins mit in die if... Verzweigung der milli() Abfrage nehmen. In Etwas so.

digitalWrite(pin,merker);

merker hat ja mal den zustand LOW und mal HIGH

Die Verwendung von einem Array für die Pins macht hier denke ich keinen richtigen Sinn, und @my_xy_projekt hat sie ja letztlich auch fest codiert.

Heinz

Naja, bei der Verwendung mit number (Sketch 1) wohl schon.
Im Letzten eher nicht, da der fest auf 2 LED verdrahtet ist.
In den anderen Varianten, lässt sich das aber einfach erweitern. - und ja, es kommt auf den Kenntnisstand an, aber der TO ist kein ganz neuer Teilnehmer :wink:

Na denne..