Básicamente, tengo dos luces led conectadas al pin 2 (led 1) y al pin 3 (led 2), y quiero que el led 2 se encienda cada vez que se encienda el led 1 y se apague cada vez que se apague el led 1.
Mi código:
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);
}
Entonces, después de cargar este código, el LED 2 se enciende cada vez que se enciende el LED 1, pero el LED 2 no se apaga cuando el LED 1 se apaga.
Con la declaración if () arreglada como se menciona en otra respuesta, aún no funcionará porque enciende led1 y luego lo apaga al final del ciclo, por lo que cuando el programa vuelve a la parte superior del ciclo, led1 siempre es apagado.
Para obtener el efecto que desea, debe hacer if/else tanto después de encender led1 como después de apagar led1.
Esta línea:
if (digitalRead(led1 == HIGH))
Es incorrecto. Esto debería ser:
if (digitalRead(led1) == HIGH)
Porque desea verificar el valor de retorno de digitalRead()
. Sin embargo, esto no causa el problema.
Puedes ver el verdadero problema cuando tratas de pensar como el microcontrolador. Hace estos pasos (comienzo en digitalWrite(led1, HIGH)
):
Cuando se ejecuta 5, el valor de LED1 siempre es bajo. 5.2 siempre se ejecutará, 5.1 nunca. Si desea lograr esto mediante programación, podría usar algo como esto:
void loop() {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
delay(5000);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
delay(3000);
}
Si desea hacer esto con un si, puede hacer algo como esto:
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);
}
O ponga el bucle if en loop()
(es decir, sin una llamada de función).
También sería una buena práctica si configura el estado inicial de la máquina en su archivo setup()
. Por ejemplo, establezca ambos LED en alto o ambos LED en bajo. Si no hace esto, funcionará, pero puede dar resultados inesperados en los primeros segundos.
su declaración if es incorrecta, lo que quiere es
if (digitalRead(led1) == HIGH)
{
digitalWrite(led2, HIGH);
}
else
{
digitalWrite(led2, LOW); //This line won't work.
}
Sin embargo, como ya ha señalado Keelan, también hay otros problemas.
Su declaración "si" original se evaluaría de la siguiente manera: Primero, se evalúa la declaración "led1 == HIGH". Dado que definió led1 como 2, y "ALTO" está (presumiblemente) definido como 1, esto debería dar como resultado un FALSO booleano, o el valor 0. Este resultado (el valor 0) luego se pasa como entrada a la función digitalRead. Dado que esta función espera un número de pin de Arduino como entrada, efectivamente intenta leer el valor del pin 0 (que no creo que esté definido). Sin embargo, esto parece dar como resultado un valor mayor que uno, por lo que el cuerpo de la cláusula if se ejecuta cuando su LED2 está claramente encendido.
Como ya señaló Keelan, con solo el cambio en la declaración if, su LED2 nunca se encendería, ya que al final del bucle (), el LED1 siempre estaría apagado/bajo. Entonces, si todo lo que desea hacer es activar o desactivar varios pines, puede usar dos llamadas a digitalWrite(). Si necesita verificar si un pin es bajo o alto (por ejemplo, porque otras partes del código pueden cambiar su estado), entonces debe asegurarse de hacer la comparación con la salida de digitalRead(), y no dentro su entrada.
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);
}
}
Amós