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.
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)
):
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.
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.
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);
}
}
Amos