¡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
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.
1 2 3 4 |
void setup() { pinMode(8,OUTPUT); // sets digital pin 8 as output } |
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.
1 2 3 4 5 6 7 |
void loop() { digitalWrite(8, HIGH); //turn LED on delay(1000); //stop execution 1000 milliseconds digitalWrite(8, LOW); // turn LED off delay(1000); //stop execution 1000 milliseconds } |
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
1 2 3 4 5 6 7 8 9 |
if(condition) { //instruction 1 //instruction 2 }else() { //instruction 3 //instruction 4 } |
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.
![]() |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void waitForInput(){ //While there is no data on Serial input while(Serial.available()==0){ delay(500); // wait 500 ms and check again } // hey!! something arrived // while there is data pending while(Serial.available()>0){ Serial.read(); //read and empty Serial } // when arrived here, Serial is empty and we have received something // that is what we wanted! } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
int ledPin = 8; //global variable for the pin number /** * This funcions receives a char as parameter * and switchs on/off the LED depending on its value */ void manageChar(char c){ //if the char equals H if(c=='H') { digitalWrite(ledPin, HIGH); //switch LED on } //if the char equals L if(c=='L') { digitalWrite(ledPin,LOW); //switch LED off } } /** * This function stops execution of program until * something is received through serial port * The received chars are sent to manageChar function */ void waitForInput(){ //While there is no data on Serial input while(Serial.available()==0){ delay(500); // wait 500 ms and check again } // hey!! something arrived // while there is data pending while(Serial.available()>0){ char incomingChar = Serial.read(); //read and empty Serial manageChar(incomingChar); } // when arrived here, Serial is empty and we have received something // that is what we wanted! } void setup() { Serial.begin(9600); //start serial communiation at bautrate 9600 pinMode(ledPin, OUTPUT); //sets the LED pin as output } void loop() { waitForInput(); //waits for serial port input } |
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-)
1 2 |
char incomingChar = Serial.read(); //read and empty Serial manageChar(incomingChar); |
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.