les vencimos · offline

L13. Decidir con if

El mundo entra (22–38%)

Maestro

if es la primera decisión. Si la lectura es la que esperas, haces una cosa. Si no, la otra. En este curso, apretado es LOW, así que se compara con LOW usando dos iguales. Un solo igual no compara: asigna. Esa confusión apaga más tardes que el cable mal puesto.

La forma es pequeña. if (digitalRead(2) == LOW) { enciende } else { apaga }. Las llaves marcan el grupo. Sin llaves, solo la línea de debajo entra en el if, y la siguiente se ejecuta siempre. Por eso el curso pone llaves aunque haya una sola línea.

El doble igual pregunta. El igual sencillo guarda un valor. if (x = LOW) no es una pregunta en este lenguaje: es un error de idea, y a veces ni siquiera compila, y a veces hace algo peor. Cuando la luz «siempre hace lo mismo», mira los iguales antes de cambiar el botón.

else es la rama del no. No hace falta else if para un solo botón. Dos estados, dos ramas. El sketch de la lección del pulsador ya era esto. Hoy se nombra, para que puedas moverlo: la condición puede ser un sensor, no solo un dedo, y el cuerpo del if puede ser más de una orden.

Lee la condición en castellano antes de creerla. «Si el pin 2 está en bajo, enciendo». Si tu montaje fuera pull-down, la frase sería la contraria. El if no sabe cómo cableaste. Solo obedece la comparación.

Montaje

Uno pin 2 GND pulsador
El montaje no cambia respecto al pulsador. Cambia la frase: si pasa esto, haz aquello; si no, lo otro.

Pines de esta lección

Uno R3 · 5 V · mira la serigrafía, no la memoria2condición13consecuenciaLOWsíelseno
Pin 2 para la pregunta, pin 13 para la respuesta.

Por qué

if no enciende pines. Elige qué líneas se ejecutan. La condición digitalRead(2) == LOW es una pregunta de sí o no. Si es sí, se entra en el bloque. Si es no, se entra en else, si lo hay. Sin else, el no simplemente no hace esas líneas, y el pin se queda como estaba, que a veces es justo el fallo.

En esta lección el sí enciende y el no apaga, cada vuelta. No hace falta memoria. En cuanto sueltas, la siguiente vuelta apaga. Si quisieras que se quedara encendido, este if no vale: necesitas una variable, y eso llega con dos botones y con los estados.

Las llaves del lenguaje importan, pero en el texto de la lección ya vienen puestas. Si al copiar se te queda una orden fuera del if, se ejecuta siempre. El síntoma es un LED que obedece a medias. Se vuelve a mirar el sangrado, no el voltaje.

Comparar con LOW y luego negar otra vez es una forma fácil de invertir sin querer. Una sola inversión, la del pull-up, y ya está. El dedo es LOW. El LED encendido es HIGH. No son el mismo número.

Práctica

  1. Carga el if de la lección, sin añadir variables.
  2. Suelta. LED apagado. Aprieta. LED encendido. Suelta. LED apagado.
  3. Borra el else un momento, carga, enciende con el dedo y suelta. Anota si el LED se queda encendido.
  4. Devuelve el else. Tiene que volver a apagarse al soltar.
  5. Cambia la condición a HIGH, carga, y comprueba que el sentido se invierte. Luego déjalo otra vez en LOW.
  6. Di la frase completa: si el pin 2 está en LOW, escribo HIGH en el 13; si no, escribo LOW.
  7. No añadas delay largo. Taparías el momento en que sueltas.

Anota el montaje

Escribe qué cable va a qué pin, o qué has entendido del paso. Se guarda en este aparato.

Ejemplos resueltos

Se enciende y ya no se apaga

Hay if sin else. El HIGH se escribe al pulsar. Al soltar, nadie escribe LOW. El LED se queda, y parece un enclavamiento que no has pedido.

Se añade el else con digitalWrite(13, LOW). Cada vuelta decide de nuevo. El enclavamiento, cuando lo quieras, será explícito.

Las dos ramas encienden

Dentro del else también se coló un HIGH, copiado. Pulsar y soltar hacen lo mismo. El if es decorado.

Las dos ramas tienen que escribir cosas distintas, o el if no informa. Aquí, HIGH y LOW.

En la mesa

Lee el if como una frase hablada, señalando la pantalla: si el dos está en LOW, enciendo el trece; si no, lo apago. Luego haz exactamente eso con el dedo y mira si la frase fue verdad. Si al soltar no se apaga, la frase escrita no tiene la segunda parte. No inventes una variable para tapar un else que falta: la variable es la lección siguiente, y mezclarlas ahora te deja sin saber cuál de las dos apaga el LED.

Cambia la condición a HIGH, carga, y di la frase al revés antes de pulsar. Tiene que cumplirse. Vuelve a LOW. Este viaje de ida y vuelta enseña que el if no tiene opinión: opina la comparación. Si te da pereza deshacer el cambio, estás acumulando un sketch que ya no es el de la lección, y la siguiente se construye encima de este.

Deja cargada la versión del curso, con else y con LOW. Pulsa RESET y comprueba que no se queda un HIGH fantasma de la prueba anterior. Setup no escribe el LED, loop sí, enseguida. Si al reiniciar queda encendido un segundo, hay un delay escondido. Quítalo.

Sketch

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}

void loop() {
  if (digitalRead(2) == LOW) {
    digitalWrite(13, HIGH);
  } else {
    digitalWrite(13, LOW);
  }
}

Ejercicio

Escribe en comentarios, encima del if, la frase en castellano de la condición. Luego cambia el programa para que el LED haga lo contrario: encendido al soltar. Una sola comparación tiene que cambiar.

Autoevaluación

1. ¿Qué operador compara dos valores?

2. ¿Qué hace un solo igual dentro de un if?

3. ¿El if sabe si usaste pull-up?