Arduino-Code - einfache if, else-Anweisung?

Grundsätzlich habe ich zwei LED-Leuchten an Pin 2 (LED 1) und Pin 3 (LED 2) angeschlossen, und ich möchte, dass LED 2 jedes Mal aufleuchtet, wenn LED 1 aufleuchtet, und jedes Mal ausgeschaltet wird, wenn LED 1 ausgeschaltet wird.

Mein Code:

int led1=2;
int led2=3;

void setup()
{
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
}

void loop()
{
    if (digitalRead(led1 == HIGH))
    {
        digitalWrite(led2, HIGH);
    }
    else
    {
        digitalWrite(led2, LOW); //This line won't work.
    } 
    digitalWrite(led1, HIGH);
    delay(5000);
    digitalWrite(led1, LOW);
    delay(3000);
}

Nachdem ich diesen Code hochgeladen habe, leuchtet LED 2 auf, wenn LED 1 aufleuchtet, aber LED 2 schaltet sich nicht aus, wenn LED 1 ausschaltet.

Antworten (4)

Wenn die if () -Anweisung wie in einer anderen Antwort erwähnt behoben wurde, funktioniert sie immer noch nicht, da Sie led1 ein- und am Ende der Schleife ausschalten. Wenn das Programm also wieder an den Anfang der Schleife gelangt, ist led1 immer aus.

Um den gewünschten Effekt zu erzielen, müssen Sie if/else sowohl nach dem Einschalten von led1 als auch nach dem Ausschalten von led1 ausführen.

Diese Linie:

if (digitalRead(led1 == HIGH))

Ist falsch. Das sollte sein:

if (digitalRead(led1) == HIGH)

Weil Sie den Rückgabewert von überprüfen möchten digitalRead(). Dies verursacht jedoch nicht das Problem.

Sie können das eigentliche Problem erkennen, wenn Sie versuchen, als Mikrocontroller zu denken. Es führt diese Schritte aus (ich beginne bei digitalWrite(led1, HIGH)):

  1. Stellen Sie LED1 hoch
  2. Warten
  3. Stellen Sie LED1 niedrig ein
  4. Warten
  5. Überprüfen:
    1. Wenn LED1 hoch ist, setze LED2 hoch
    2. Wenn LED1 niedrig ist, setze LED2 niedrig
  6. Gehen Sie zu 1.

Wenn 5 ausgeführt wird, ist der Wert von LED1 immer niedrig. 5.2 wird immer ausgeführt, 5.1 nie. Wenn Sie dies programmgesteuert erreichen möchten, können Sie Folgendes verwenden:

void loop() {
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    delay(5000);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    delay(3000);
}

Wenn Sie dies mit einem if tun möchten, können Sie entweder Folgendes tun:

void calcLed2() {
    if (digitalRead(led1) == HIGH) {
        digitalWrite(led2, HIGH);
    } else {
        digitalWrite(led2, LOW);
    }
}

void loop() {
    digitalWrite(led1, HIGH);
    calcLed2();
    delay(5000);
    digitalWrite(led1, LOW);
    delay(3000);
}

Oder setzen Sie die if-Schleife in die loop()(dh ohne Funktionsaufruf).

Es wäre auch eine gute Übung, wenn Sie den Anfangszustand der Maschine in Ihrer setup(). Stellen Sie zum Beispiel beide LEDs hoch oder beide LEDs niedrig ein. Wenn Sie dies nicht tun, funktioniert es, kann jedoch in den ersten Sekunden zu unerwarteten Ergebnissen führen.

Sind Sie sicher, dass LED1 immer hoch ist, wenn 5 ausgeführt wird? Sicherlich ist LED1 immer niedrig?

Ihre if-Anweisung ist falsch, was Sie wollen, ist

if (digitalRead(led1) == HIGH)
{
    digitalWrite(led2, HIGH);
}
else
{
    digitalWrite(led2, LOW); //This line won't work.
} 

Wie Keelan jedoch bereits betont hat, gibt es auch andere Probleme.

Ihre ursprüngliche „if“-Anweisung würde wie folgt ausgewertet: Zuerst wird die „led1 == HIGH“-Anweisung ausgewertet. Da Sie led1 als 2 definiert haben und "HIGH" (vermutlich) als 1 definiert ist, sollte dies zu einem booleschen FALSE oder dem Wert 0 führen. Dieses Ergebnis (der Wert 0) wird dann als Eingabe an die digitalRead-Funktion übergeben. Da diese Funktion eine Arduino-Pin-Nummer als Eingabe erwartet, versucht sie effektiv, den Wert von Pin 0 zu lesen (was meiner Meinung nach nicht definiert ist). Dies scheint jedoch zu einem Wert größer als eins zu führen, sodass der Körper der if-Klausel ausgeführt wird, wenn Ihre LED2 offensichtlich eingeschaltet ist.

Wie Keelan bereits betonte, würde sich Ihre LED2 mit nur der Änderung der if-Anweisung niemals wirklich einschalten, da LED1 am Ende der Schleife () immer aus/niedrig wäre. Wenn Sie also nur mehrere Pins ein- oder ausschalten möchten, können Sie einfach zwei Aufrufe von digitalWrite() verwenden. Wenn Sie überprüfen müssen, ob ein Pin niedrig oder hoch ist (z. B. weil andere Teile des Codes seinen Zustand ändern können), müssen Sie sicherstellen, dass Sie den Vergleich mit der Ausgabe von digitalRead() durchführen, und nicht innerhalb seine Eingabe.

Das stimmt, aber nicht die Ursache des Problems.
Nein, das ist nicht das einzige Problem, aber das war der Grund, warum es nie in den else-Teil ging. Da sich unsere Antworten überschnitten haben, ziehe ich meine gerne zurück.
Schau dir meine Antwort an. Sie unterscheidet sich deutlich von deiner. Mit Ihrem Code würde LED2 auch nicht niedrig werden, da die if-Schleife nur ausgeführt wird, wenn LED1 hoch ist. Wenn unsere Antworten im Wesentlichen gleich wären, hätte ich meine zurückgezogen, weil Sie es früher waren, aber Ihre Antwort beantwortet die Frage nicht.
Danke Camil und fm, aber sobald ich meinen Code zu if (digitalRead (led1) == HIGH) ändere; LED 2 geht nicht einmal an. was ist los?
int led1=2;
int led2=3;

void setup()
{
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
}

void loop()
{
    if (digitalRead(led1 == HIGH))
    {
        digitalWrite(led2, HIGH);
    }
    else if (digitalWrite(led1, LOW) )
    {
        digitalWrite(led2, LOW);
    } 
}
Bitte erläutern Sie Ihren Code. Bedenken Sie auch, dass dies eine 2 Jahre alte Frage ist.