Hasta ahora, nuestros programas han sido una lista de la compra: “Haz esto, luego espera, luego haz esto otro”. El Arduino obedecía en orden, línea tras línea.
Pero la verdadera inteligencia surge cuando somos capaces de adaptarnos a las circunstancias.
No siempre queremos que el LED parpadee. Quizás queremos que se encienda SOLO SI pulsamos un botón, o que se apague SI hay mucha luz.
Hoy vamos a aprender la estructura más fundamental de la programación: la sentencia condicional if / else (es el momento en que vuestro Arduino aprende a tomar decisiones).
El concepto: Un cruce de caminos
Imaginad que vais conduciendo y llegáis a una bifurcación. Tenéis que tomar una decisión basada en una condición:
- SI tengo gasolina, sigo conduciendo por la autopista.
- SI NO, me desvío a la gasolinera.
En programación, esto funciona exactamente igual. Le damos al Arduino una condición (una pregunta de Sí o No). Si la respuesta es Sí, ejecuta un bloque de código. Si es No, lo ignora (o hace otra cosa).
La sintaxis
La estructura en C++ (el lenguaje de Arduino) es bastante intuitiva:
if (condicion) {
// Código que se ejecuta si la condición es VERDADERA
}
else {
// Código que se ejecuta si la condición es FALSA
}
- if: Significa “Si…”.
- (): Dentro de los paréntesis va la pregunta.
- {}: Las llaves delimitan qué acciones ocurren.
- else: (Opcional) Significa “Si no…”. Es lo que pasa si la condición no se cumple.
Operadores de Comparación
Para que el if funcione, necesitamos hacer preguntas cuya respuesta sea Verdadero (True) o Falso (False). Para ello usamos los operadores de comparación.
| Operador | Significado | Ejemplo |
|---|---|---|
== | ¿Es igual a? | if (x == 5) |
!= | ¿Es distinto de? | if (x != 0) |
< | Menor que | if (x < 10) |
> | Mayor que | if (x > 10) |
En C++, el signo igual simple = sirve para asignar (meter un valor en una caja). Para comparar (preguntar si dos cosas son iguales), debéis usar el doble igual ==.
a = 5“Guarda el 5 en la variable a”.if (a == 5)“¿Vale ‘a’ lo mismo que 5?”.
Ejemplo práctico: El botón inteligente
Vamos a retomar el montaje del artículo anterior: un botón conectado al Pin 2 y el LED integrado en el Pin 13.
Queremos que:
- Si pulso el botón, el LED se enciende.
- Si no, se apaga.
El código sería algo así:
void setup() {
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP); // lo veremos en su momento
}
void loop() {
// 1. Leemos el botón
int estado = digitalRead(2);
// 2. Tomamos la decisión
if (estado == LOW) {
// Si la condición es cierta (está pulsado)
digitalWrite(13, HIGH); // Encendemos LED
}
else {
// Si la condición es falsa (no está pulsado)
digitalWrite(13, LOW); // Apagamos LED
}
}
Al subir este código, veréis que el comportamiento es idéntico al del tutorial anterior, pero el código es mucho más legible. Estamos expresando nuestra intención claramente: “Si pasa A, haz B”.
Para entender “bien bien” este programa, tendríamos que hablar de cómo leer un interruptor y qué esun PULL_UP. Lo veremos en su momento, de momento no te preocupes demasiado
¿Y si quiero que funcione al revés?
Imaginad que queréis una “Luz de hombre muerto” (se apaga si pulsas, se enciende si sueltas). Solo tenéis que cambiar la lógica dentro de las llaves, o cambiar la pregunta:
if (estado == HIGH) { // Si el botón está SUELTO
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
}
Anidando decisiones
¿Qué pasa si queremos condiciones más complejas? Podemos meter un if dentro de otro if.
Si pulso el botón… y además el LED estaba apagado… entonces enciéndelo.
Esto nos permitiría hacer un interruptor tipo toggle (un pulsador que enciende y apaga alternativamente), aunque eso requiere gestionar variables de estado que veremos más adelante.
const int pinBoton = 2;
const int pinLed = 13;
void setup() {
pinMode(pinLed, OUTPUT);
pinMode(pinBoton, INPUT);
}
void loop() {
// Primera pregunta: ¿El botón está pulsado?
if (digitalRead(pinBoton) == HIGH) {
// Si entramos aquí, es que el botón SÍ está pulsado.
// Ahora hacemos la segunda pregunta (anidada):
if (digitalRead(pinLed) == LOW) {
// Si llegamos aquí, se cumplen las DOS condiciones:
// 1. Botón pulsado
// 2. El LED estaba apagado
digitalWrite(pinLed, HIGH); // ¡Encendemos el LED!
}
}
delay(100); // Una pequeña pausa para estabilidad
}
Si de momento es muy complicado, no te preocupes. Por ahora, quedaos con la idea de que dentro de las llaves { ... } podéis escribir cualquier código válido: encender LEDs, esperar con delay, o hacer otra pregunta if.
