Código de Arduino: ¿simple si, sino una declaración?

3

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 el led 1 se encienda y se apague cada vez que el led 1 se apaga .

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 ilumina cuando el LED 1 se enciende, pero el LED 2 no se apaga cuando el LED 1 se apaga.

    
pregunta Tony Yi

4 respuestas

3

Con la instrucción if () corregida como se menciona en otra respuesta, aún no funcionará porque enciendes led1, luego lo apagas al final del bucle, de modo que cuando el programa vuelve a la parte superior del bucle, led1 siempre está apagado.

Para obtener el efecto que deseas, debes hacer el if / else tanto después de encender el led1 como después de apagar el led1.

    
respondido por el Peter Bennett
7

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 problema real cuando intentas pensar como el microcontrolador. Hace estos pasos (comienzo en digitalWrite(led1, HIGH) ):

  1. Establecer LED1 alto
  2. espera
  3. Establecer LED1 bajo
  4. espera
  5. comprobar:
    1. Si el LED1 es alto, establezca el LED2 alto
    2. Si el LED1 está bajo, configure el LED2 bajo
  6. ve al 1.

Cuando se ejecuta 5, el valor de LED1 es siempre bajo. 5.2 siempre será ejecutado, 5.1 nunca. Si quieres lograr esto mediante programación, puedes usar algo como esto:

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

Si quieres hacer esto con un if, puedes 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 el loop() (es decir, sin una llamada de función).

También sería una buena práctica si establece el estado inicial de la máquina en su setup() . Por ejemplo, configure ambos LEDs alto o ambos LED bajos. Si no lo hace, funcionará, pero podría dar resultados inesperados en los primeros segundos.

    
respondido por el Keelan
3

tu sentencia if es incorrecta, lo que quieres es

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

Sin embargo, como Camil ya ha señalado, también hay otros problemas.

Su declaración "if" original se evaluaría de la siguiente manera: Primero, se evalúa la declaración "led1 == HIGH". Ya que definió led1 como 2, y "ALTO" (presumiblemente) se define como 1, esto debería dar como resultado un FALSO booleano, o el valor 0. Este resultado (el valor 0) se pasa luego como entrada a la función digitalRead. Como esta función espera un número de pin de Arduino como entrada, intenta efectivamente leer el valor del pin 0 (que no creo que esté definido). No obstante, parece que esto da como resultado un valor mayor que uno, de modo que el cuerpo de la cláusula if se ejecuta a medida que su LED2 está evidentemente encendido.

Como Camil ya señaló, con solo el cambio en la sentencia if, su LED2 nunca se encenderá, ya que al final del bucle (), el LED1 siempre estará apagado / bajo. Entonces, si todo lo que quieres hacer es activar o desactivar varios pines, puedes usar dos llamadas de 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 de su entrada.

    
respondido por el fm_andreas
-2
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);
    } 
}
    
respondido por el Bharat Gautam

Lea otras preguntas en las etiquetas