Código Arduino: ¿si simple, declaración de lo contrario?

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.

Respuestas (4)

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)):

  1. Establecer LED1 alto
  2. Esperar
  3. Establecer LED1 bajo
  4. Esperar
  5. Controlar:
    1. Si LED1 es alto, configure LED2 alto
    2. Si el LED1 es bajo, configure el LED2 bajo
  6. Ir a 1.

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.

¿Estás seguro de que LED1 siempre está alto cuando se ejecuta 5? ¿Seguramente el LED1 siempre está bajo?

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.

Eso es cierto, pero no lo que causa el problema.
No, no es el único problema, pero esa fue la razón por la que nunca entró en la otra parte. Dado que nuestras respuestas se superpusieron, estoy feliz de retirar la mía.
Mira mi respuesta. Es significativamente diferente a la tuya. Con su código, LED2 tampoco bajaría, porque el bucle if solo se ejecuta cuando LED1 está alto. Si nuestras respuestas fueran esencialmente las mismas, habría retirado la mía porque lo hiciste antes, sin embargo, tu respuesta no responde a la pregunta.
Gracias Camil y fm, pero una vez que cambio mi código a if (digitalRead(led1) == HIGH); El led 2 ni siquiera enciende. ¿qué está sucediendo?
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);
    } 
}
Por favor explique su código. Considere también que esta es una pregunta de hace 2 años.