Usando-LEDs-con-sentencias-condicionales-if-else

¡Es hora de empezar a conectarle algo a nuestra placa! En esta lección vamos a encender y apagar varios LEDs y además vamos a aprender a usar las sentencias condicionales if-else. Necesitarás todo lo que se ha explicado hasta ahora, ya que lo utilizaremos.

  • Comunicación por puerto serie
  • Funciones y variables

Para esta lección necesitarás 1 LED y una placa controladora tipo ZUM BT 328 (o compatible Arduino).

Encendiendo y apagando un LED

Encender y apagar un LED es uno de los primeros programas con periféricos que se hacen con Arduino, por ser el primero no extenderemos un poco más, en las siguientes lecciones iremos más rápidamente.

Primero, un LED, ¿es analógico o digital?. Un LED es un componente digital, que sólo puede tomar dos valores, encendido o apagado.
Segundo, un LED, ¿es un componente de salida o de entrada? . Un LED es un componente de salida, ya que debemos comandarle, es decir, debemos decirle si se debe encender o apagar, contrariamente a un sensor, que nos da la lectura de un valor.

Empezamos por lo tanto conectando un LED en el pin digital 8 de la placa, como en la figura

zum-8led

Como hemos explicado en lecciones anteriores hay dos funciones fundamentales al programar en Arduino, setup() y loop(). La función setup() suele realizar todas las tareas de configuracón e incialización, mientras que la función loop() contiene las instrucciones que ejecutará el programa.

void setup()

La única acción de configuración que debemos hacer es indicar que el pin digital 8 es de salida.

La función pinMode() toma como primer parámetro el número de pin digital, y como segundo el modo de trabajo, que puede ser INPUT o OUTPUT.

void loop()

A continuación vamos a hacer parpadear el LED, para ello lo encendemos, esperamos un segundo, lo apagamos, y esperamos otro segundo. Dado que la función loop() se ejecuta continuamente esto hará que el LED parpadee. Veamos el código.

La función digitalWrite() toma dos parámetros, el primero es el número del pin digital, y el segundo el estado al que se pondrá: HIGH o LOW. Cuando el estado es HIGH pondrá el pin a 5 Voltios, mientras que si es LOW lo pone a tierra (0 Voltios). Esto produce el efecto sobre el LED de que se encienda o se apague. Para poder realizar una acción de escritura sobre un pin digital es necesario que previamente se haya puesto el pinMode a OUTPUT.

La función delay() pausa la ejecución el tiempo indicado en milisegundos.

Sentencias condicionales if-else

Una sentencia condicional es aquella que modifica el flujo de ejecución del programa en función de una condición. Por ejemplo, podría hacer un programa que si recibe por puerto serie el carácter H encienda el LED, mientras que si recibe el caracter L lo apague. Veamos cómo se hace.

Estructura if-else

La instrucción if-else tiene la siguiente estructura

ifelse

Si se cumple la condición entonces se ejecutarán las instrucciones 1 y 2, en caso contrario las instrucciones 3 y 4. Hay que notar que no es necesario que haya un else. Para más información se puede consultar la documentación oficial de la instrucción if y de la instrucción else.

OJO

OBSERVA: No te extrañes si en algún caso ves condicionales sin llaves, se pueden omitir las llaves cuando el condicional sólo afecta a una instrucción. Ten cuidado, si se te olvida poner las llaves, el condicional sólo englobará la siguiente instrucción que aparezca, quedando el resto fuera del mismo.

Actuando en función de un valor

Veamos cómo encender el LED si recibo el carácter H y apagarlo si recibo el carácter L. Recordamos la función de la lección anterior que pausaba la ejecución del el programa hasta que se recibía algo por puerto serie

Modificamos la función para que guarde el carácter que ha recibido por puerto serie. Ese valor se lo debe mandar a otra función (la crearemos después) que gestiona qué hacer con el carácter leído, la llamaremos manageChar(). Veamos cómo quedaría el programa y luego lo explicamos.

int ledPin = 8;

Guardamos el número de pin donde está conectado el LED en una variable global. De este modo evitamos confundirnos al escribirlo en las distintas partes del programa.

void manageChar(char c)

Esta función toma un carácter como parámetro. Si el valor de diho parámetro es H (la comparación de igualdad en Arduino se escribe ==) enciende el LED conectado al pin ledPin (en nuestro caso el 8), si el parámetro es L apaga el LED. Si el parámetro no fuera ni H ni L esta función no realizaría ninguna acción.

void waitForInput()

Como vimos en la lección anterior esta función espera a que lleguen datos por el puerto serie. La hemos modifiado para que almacene el valor leído en una variable tipo char (recordamos que la función Serial.read() devuelve un char -byte-)

Posteriormente el valor leído se le envía a la función manageChar para que encienda o apague el LED según corresponda.

setup()

Establece el pin 8 como pin de salida e inicializa las comunicaciones serie a 9600 baudios.

loop()

Es la función que se ejecutará continuamente, en este caso estará esperando a que lleguen datos por puerto serie, una vez que los recibe los gestiona con la función manageChar() y así una y otra vez.

Ejercicio

Con todo lo que has aprendido intenta hacer el siguiente programa, publicaré la solución la próxima semana en la siguiente lección.

Realiza un programa que lea el puerto serie y gestion los valores leídos del siguiente modo:

  • Primer carácter: Indica número de pin digital, entre 0 y 9
  • Segundo carácter: Indica si encender o apagar el LED conectado al pin correspondiente, puede valer H o L

Es decir, si llega por puerto serie la siguiente secuencia 1H4L5H2L se debería ejecutar lo siguiente

  • LEDs conectados a los pines 1 y 5 encendidos
  • LEDs conectados a los pines 4 y 2 apagados
  • Resto de LEDs permanecen en el estado en que estuvieran anteriormente

Venga, intenta resolverlo, comparte el código, y si te atreves mánda un vídeo del funcionamiento. La solución, en la próxima lección.