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.

19 comentarios

  1. Estoy aprendiendo el uso mi placa arduino y ejercicios como estos son muy buenos para ir aprendiendo gracias Alberto

  2. Hola Alberto,
    Me gustaría que me confirmaras o me corrigieras sobre la siguiente cuestión.
    Aunque estoy totalmente de acuerdo sobre que un LED es un componente electrónico analógico. Creo que en este caso lo realmente importante es saber que circuito LED es un periférico de salida y digital.
    Saludos.

    1. Alberto Valero

      ups, ¡error mío!, quería decir digital y escribí analogico, lo corrijo ahora mismo. Tienes toda la razón ¡¡¡es un componente digital de salida!!!

  3. Hola Alberto:

    No consigo realizar el ejercicio que expones, no se que me falla pero por mas que pruebo cuando no me lanza un error me lanza otro en la compilación y no lo consigo, he conseguido hacerlo por separado, pero no he conseguido hacer que 2 comandos a la vez funcionen como por ejemplo escribir H3 para encender el Led numero 3.

    Otra cosa que me pasa esque cuando escribo H se apaga y cuando escribo L se enciende, ¿porque pasa eso? el código es copiado y pegado del mismo que has publicado y funciona del revés.

    Muchas gracias por el curso, me esta sirviendo muchísimo para empezar a programar.

    1. Alberto Valero

      Lo lo de la H y la L puede ser que están al reves en el código, eso no tiene importancia. Respecto a los errores que comentas es difícil decrite sin ver tu código, si lo pegas en el comentario podemos intentar ayudarte.

  4. Hola Alberto,
    En primer lugar me gustaría felicitarte por el trabajo. Me está encantando el curso y estoy muy entusiasmado con este proceso.
    No tengo mucho conocimiento de programación aunque sí que he tratado con Pascal, Visual Basic y .Net muy por encima, con lo que los términos no me son extraños aunque de esto hace ya unos añitos.

    Hasta este punto creo haberlo entendido todo. Lo que pasa es que me resulta imposible entender la modificación hecha sobre la función waitforimput(); así como la nueva función manageChar();
    He intentado simplificar el código para tratar de hacerlo por mi mismo y aún así no hay manera, llevo toda la tarde bloqueado con este punto. Podría copiar aquí el trozo de código que he hecho yo para que me expliques qué estoy haciendo mal?

    Espero no resultar molesto de leer.
    Muchas gracias,
    Un saludo

    1. Alberto Valero

      Hola Miguel,

      Sí, claro, copia aquí el código e intentamos ayudarte.

  5. Hola. Estoy siguiendo el curso y me gustaría saber dónde está la solución al ejercicio propuesto. En la siguiente lección, no lo encuentro.

    Muchas gracias.

    1. Pablo Lozano

      Hola Jesús,

      Tienes razón, al final no se publicó la solución, muchas gracias por el aviso.

      Si quieres, te puedo enviar la solución por correo, para no destapar por aquí el reto.

      Un saludo.

      1. Perfecto. Imagino que el correo electrónico lo tenéis cada vez que dejamos un comentario, ¿verdad? O necesitas que te lo adjunte en un comentario de manera visible.

        Saludos, Jesús ….

        1. Pablo Lozano

          Hola Jesús,

          Sí, ya te he enviado la solución, espero que te sea de ayuda.

          Saludos.

          1. Hola Pablo.

            Gracias por la resolución. El error que cometía era al leer del puerto serie de la siguiente forma:

            int pinLed = Serial.read();

            Entendía que haciéndolo así, lo que se guardaba era el byte leído en formato entero; es decir el número introducido como un entero. Pero no, lo que se hace es guardar como entero el código ASCII del carácter introducido, si se teclea un ‘8’, se guarda un 56. Por eso no veía que se iluminaran los LEDS en el código que escribí.

            Ahora utilizo la función Serial.parseint(), que convierte a entero el carácter leído. Además, como del enunciado del ejemplo se dice que debe tener una estructura formateada la entrada (1H4L5H2L), aprovecho este requisito para leer dos bytes (el LED y la acción asociada, apagar-encender) a la vez del bufer.

            Saludos y gracias.

            1. Pablo Lozano

              Hola Jesús,

              Me alegra haberte sido de ayuda, no dudes en volver a consultarnos si necesitas algo.

              Un saludo

        1. Pablo Lozano

          Hola Javier,

          Ya te lo he enviado.

          Un saludo.

          1. Hola.
            Yo también necesito la solución del problema.
            Muchas gracias

  6. Hola Pablo .
    Me gustaría que me mandaras la solución del ejercicio a mi también.
    Muchas gracias.
    Un saludo

    1. sgruben

      Hola Toni,

      Hemos publicado la resolución del problema en la siguiente lección ;).

Los comentarios están cerrados.