El Condicional if...else


Como ya hemos dicho, arduino ejecuta las intrucciones de forma secuencial una detrás de otra, savo que se modifique el flujo de intrucciones, como por ejemplo hicimos con el bucle for. 

Con el bucle for, lo que hacíamos, era que el flujo entraba en un bucle y hasta que no dejase de  cumplirse una condición, no se salía el bucle, es decir, se repetía el mismo camino, cambiado algo de la condición en cada repetición y una vez que deja de cumplirse la condición, continua con el programa.

Hay otra forma de modificar el flujo del programa y es con el condicional if.  En este caso cuando arduino llega a un if, que se puede traducir con un si de condición, si se cumple la condición del if, ejecutará el bloque de código que hay dentro del if y si no se cumple la condición de if, seguirá su camino sin ejecutar el bloque de código que hay dentro de if.

En este ejemplo hemos visto que si a es igual a b (Para comparar igual en informática se usa el signo == ) se enciende el LED, pero si no es igual entonces seguirá el programa sin encender el LED.

También puede ocurrir que si no se cumple la condición de if, haya una segunda condición, para eso tenemos la palabra else, que viene a significa "sino..." y se usaría del siguiente modo:


Si se cumple la condición if, se ejecuta  la primera condición y se enciende el LED conectado al pin 6, pero si no se cumple la condición, se ejecuta la condición del else, y se enciende el LED conectado al pin 7

Si hay más de dos condiciones se puede seguir usando else o el else if y poniendo al final else para la últma opción.
















Vamos a recordar el circuito del pulsador, y el código que teníamos para ese circuito:


Vamos a cambiar el código de la función loop()  aprovechando el if y el else.

Vamos a mantener la variable valor, pero la pondremos tipo bool, el resto de esta línea se quedará igual.

A continuación pondremos el siguiente código.

if (valor)
    {
        digitalWrite (LED, HIGH);
    }
else
    {
        digitalWrite (LED, LOW);
    }

básicamente este código hace lo mismo, pero de distinta forma, ahora en la variable valor, si el nivel de entrada en el pin 10 es HIGH, o 5 voltios, se guardará un true y si es nivel es LOW o 0V, se guardará un false.  De forma que después de leer la variable valor, se irá al if, y si en valor hay un true, encenderá el LED, y si hay un false entonces apagará el LED.

Por supuesto, si queremos invertir el funcionamiento y que el LED permanezca apagado, solo tenemos que poner el operador negación delante de valor, dentro de la condición de if.

Usar el pulsador como interruptor
Lo que queremos es que al pulsar el pulsador, el LED se encienda, y al soltarlo, se quede encendido, luego cuando queramos, presionamos el pulsador y el LED se apagara y cuando soltemos, permanecerá apagado y todo ello sin modificar el circuito del pulsador.


Empezaremos declarando las mismas variables que ya teníamos
LED y boton.

y vamos a declarar una tercera variable tipo bool, a la que vamos a llamar "estado" y es donde guardaremos el estado del LED, true encendido y false apagado, y lo inicializaremos con false, para que el diodo esté apagado cuando conectemos el arduino

En la función void setup() vamos a establecer el pin LED como salida y el pin boton como entrada pullup,  y estableceremos que el LED esté apagado cuando se conecte arduino.

En la función void loop() vamos a crear una variable local llamada valor de tipo bool, que guardará el valor que hay en el pin 10 del pulsador, cuando este sea leido por el digitalRead ( boton), como ya hemos dicho un LOW es false y HIGH es true. 

Luego pondremos un condicional igual que en el ejemplo anterior si se cumple la condición de que valor sea false, es decir, que se haya pulsado el pulsador, guardará en la variable estado, el estado opuesto, es decir, si hay un false, guardará un true, y si hay un true, guardará un false.

Después de guardarlo escribirá dicho valor en el pin del LED, si es true el LED se encenderá y si es false el LED se apagará.


La diferencia entre INPUT e INPUT_PULLUP es que la primera establece el pin como un entrada digital, y hay que ponerle una resistencia externa como pull up o pull down, y cuando ponemos INPUT_PULLUP, estamos estableciendo el pin como una entrada digital cuya resistencia pull up, es una resistencia interna de la placa de arduino de unos 20K con lo cual no hay que ponerle ninguna resistencia. En el caso del circuito del pulsador retiraremos la R2, y el pulsador quedará conectado solo al pin 10 por un lado y a GND por el otro lado.

Este código hará que cuando pulsemos el pulsador, se encenderá el LED y cuando lo soltemos, el LED seguirá encendido.  Luego para apagar el LED solo tenemos que volver a pulsar el pulsador y el LEd se apagará y cuando soltemos el LED seguirá apagado.

En la teoría este circuíto con este código funciona muy bien, pero en el mundo real, no lo hará, sino que se encenderá y apagará de forma aleatoria.  Ya que en el tiempo que nosotro tardamos en pulsar el pulsador y soltarlo, Arduino habrá encendido y apagado el LED una pocas de miles de veces.  También tenemos el problema del bouncing, el rebote, cualquier dispositivo mecánico, como lo es el botón de un pulsador, al presionarlos, los contactos entra en contado y se separa infinidad de veces, esto unido al problema anterior no lleva a que el diodo se va a encender de forma aleatoria. Para evitar este problema vamos a añadir una línea de delay de 250 ms.

 
Con este arreglo en el código, 250 ms es más que suficiente para pulsar el pulsador y encender o apagar el LED como si fuese un interruptor, pero ¿Qué ocurre si mantenemos el pulsador presionado un largo tiempo?   Pues que el LED se enciende y apaga cada 250 ms, tendríamos así una variante manual del blinking Led.

Si queremos mantener pulsado el pulsador y que no se produzca este efecto, deberemos cambiar un poco el código que tenemos.

Este código ha cambiado un poco, hemos creado una cuarta variable, que va a guardar el estado anterior que es el estado anterior del diodo.

En el setup hemos quitado el digitalWrite, porque ya no es necesario, ya que el diodo va a comenzar apagado, al ser las dos variables "estado" y "estado_anterior" iguales

En el loop es donde hay más cambios. La variable estado guarda el valor que hay en el pin del pulsador en todo momento.

Lo primero que hace es leer el valor en el pin 10 del pulsador y espera 100 milisegundo, por si se pulsa el pulsador evitar los rebotes. Luego guarda el valor leido en la variable "estado". Como el pulsador no esta pulsado este valor es HIGH o true, con lo que el valor de la variable "estado" es igual que el valor de la variable "estado_anterior" y por tanto, no se cumple la condición del primer if, y se lo salta y guarda el valor de "estado" en "estado anterior", con lo cual ambos valores siguen siendo iguales.

Cuando se presiona el pulsador, Lée en el pin 10 del pulsador, un valor LOW o false, espera los 100 ms para evitar los rebotes y lo guarda en la variable "estado", como ahora la variable "estado" tiene un valor distinto al de la variable "estado_anterior" si se cumple la condición de primer if y pasa a ejecutar el código de su interior, que es otro if cuya condición es comprobar que el valor de la variable "estado" está en false, que eso ocurre cuando el pulsador está presionado, en ese momento escribe en el pin 6 del LED, lo contrario a lo que esté leyendo en el pin LED, si lée un LOW escribirá un HIGH y si lee un HIGH escribirá un LOW.  Es decir si el diodo está apagado lo enciende y si está encendido lo apaga.

NOTA.- El pin LED está configurado como salida, y con digitalRead, se puede leer el valor de la salida, no significa que el LED esté configurado como entrada.

Luego guarda en la variable "estado_anterior" el valor de la variable "estado" que es false, cuando se suelte el botón, la variable "estado" será true, y la variable "estado_anterior" será false, con lo que se cumple la condición del primer if, así que se ejecuta el código de su interior, pero como el pulsado esta sin pulsar, no se cumple la condición de segundo if y no ocurre nada, se guarda el nuevo true de la variable "estado" en la variable "estado_anterior" y vuelve todo a empezar, solo que la próxima vez en lugar de encenderse el LED se apagará.

Aunque pueda parecer que los botónes son sencillos de utilizar, en la práctica puede complicarnos mucho la vida, la combinación de los rebotes y la necesidad de corregir esos rebotes, junto al uso de  pullups que garanticen la correcta lectura, puede hacer que la cosa se complique mucho más sino se estudia el problema con calma.

Como hemos visto para comparar que dos valores o variables son iguales hemos usado el operador igual == y para comprobar que son distintos hemos usado el operador distinto != pero hay más operadores de comparación que son los siguientes:

Igual que                 ==
distinto que             !=
Mayor  que              >
mayor o igual que   >=
Menor que              <
Menor o igual que  <=

Finalmente, podemos construir una condición lógica mediante el uso de los operadores AND, OR y NOT cuyos símbolos en programación son &&, || y !

Si usáramos un circuito de dos pulsadores con pullups siendo true si no se pulsa y false si se pulsa, y un solo LED, podemo realizar condiciones para que se encienda el LED, por ejemplo con AND (&&) sería necesario que se pulsaran los dos pulsadores a la vez para que se pueda encender el LED,  con OR(||) bastaría con pulsar uno de los dos pulsadores para que se encienda el LED, y con el operador negación (NOT (!)) solo se utiliza un pulsador si está encedido se apaga y si está apagado se enciende.