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 !