0% found this document useful (0 votes)
4 views26 pages

Arduino 8

El documento describe las operaciones aritméticas, de comparación y booleanas en programación, así como el manejo de tipos de datos y el concepto de desbordamiento. También se abordan los bloques de control como 'if', 'switch', y bucles, además de la importancia de las funciones para mantener el código organizado. Finalmente, se introducen ejemplos prácticos de programación en Arduino, incluyendo el uso del monitor serie y la creación de sketches.

Uploaded by

jdiaz
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF or read online on Scribd
0% found this document useful (0 votes)
4 views26 pages

Arduino 8

El documento describe las operaciones aritméticas, de comparación y booleanas en programación, así como el manejo de tipos de datos y el concepto de desbordamiento. También se abordan los bloques de control como 'if', 'switch', y bucles, además de la importancia de las funciones para mantener el código organizado. Finalmente, se introducen ejemplos prácticos de programación en Arduino, incluyendo el uso del monitor serie y la creación de sketches.

Uploaded by

jdiaz
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF or read online on Scribd
Permite sumar dos operandos Permite restar dos operandos Permite multiplicar dos operandos Permite dividir dos operandos Es el operador llamado médulo. Obtiene el resto de una division entera, Ej:i = 9 % 4; // i tendria el valor de 1. nora: A la hora de ejecutar las operaciones Arduino utiliza los tipos de los operandos para obtener el resultado, asi al realizar 5 / 2 se obtendria como resultado 2 como entero, por lo que se debe tener cuidado con los tipos seleccionados en cada operacién. También se debe vigilar lo que se denomina “desbordamiento” por tipo de dato; el tipo int puede almacenar valores de -32,768 a 32,767, eso quiere decir que si tenemos una variable entera que tenga de valor 32,767 y le sumamos 1... automédticamente pasa a tener de valor -32,768 por desbordamiento. Las operaciones de comparacién son: Igualdad; compara si los operandos a cada lado de la operacién son iguales 0 no y devuelve true en caso de ser iguales y false en caso de no serlo. Desigualdad; compara si los operandos a cada lado de la ién son diferentes 0 no y devuelve true en caso de ser operz distintos y false en caso de ser iguales. + >: Mayor que; compara si el operando situado a la izquierda operacion es mayor que el de la derecha y devuelve true en caso de ser mayor y false en caso de no serlo. + ><: Mayor o igual que; compara si el operando situado a la izquierda operacién es mayor o igual que el de la derecha y devuelve true en caso de ser mayor o igual y false en caso de no serlo. + <: Menor que; compara si el operando situado a la izquierda operacién es menor que el de la derecha y devuelve frue en caso de ser menor y false en caso de no serlo. Menor o igual que; compara si el operando situado a la izquierda operacién es menor o igual que el de la derecha y devuelve true en caso de ser menor o igual y false en caso de no serlo. Las operaciones booleanas son aquellas que trabajan con variables de tipo booleano, solo aceptan true y false como valores. Las operaciones booleanas disponibles so: + «x: Es el “y” booleano. Se obtiene true si los dos operandos son true. * ||: Es el “o” booleano. Se obtiene true si alguno de los dos operandos es true. + 1: Se trata del operador “no” booleano. Solo trabaja con un operando que se sitiia a su derecha. Se obtiene rue si el operando es false. Las operaciones a nivel de bit: : Es el “y” Iégico. Devuelve 1 cuando los dos bits que entran en juego son 1. : Se trata del “o” légico, Devuelve 1 cuando uno de los bits que entran en juego es 1. Es el “no” logico. Devuelve | cuando el bit que entra en juego es Es el “o exclusivo” Iégico. Devuelve 1 cuando uno y solo uno de los bits que entran en juego es 1. <<: Realiza un desplazamiento de bits a la izquierda, introduciendo 0 por la derecha. + >>: Realiza un desplazamiento de bits a la derecha. El valor que se introduce por la izquierda depende de si el tipo de dato es con signo o sin signo. Antes de seguir, vamos a ver unos pequefios ejemplos sobre las operaciones a nivel de bit para que queden mas claras: int y= int v = a <¢ 3 // v = 0000000001201900 © 104 que son 13 ¥ 2°3, 3 que hemos desplazado int us assay fv oeaev0e00q0001 o 2 que =: 13/203, 3 hemos desplazade Tanto en el caso de desplazamiento a la izquierda como a la derecha, los bits que “salen” se pierden. Las operaciones compuestas son aquellas que con una operacién podemos hacer dos, por ejemplo sumar y asignar el valor de la suma. Los operadores disponibles son: : Incrementa en 1 la variable, ++myvar; seria semejante a myvar - myVar + 1;,El operador puede ir antes o después de la variable, dependiendo de donde vaya actiia de modo diferente. Si precede a la variable, primero incrementa la variable y luego devuelve su valor, si va detrés primero devuelve el valor y luego incrementa la variable. Ant myvar = 10; Ant mytne = Hmyvary // myIne tiene valor 11 y myvar tiene valor 11 nt mylne2 ~ myartts // nylne2 tiene valor 10 y myvar tiene valor 1 Semejante a ++ pero reduciendo en 1 el valor de la variable. + 45: Asignacién con suma. Permite sumar y asignar a la vez. myVar 0; es lo mismo que myvar = myVar + 10; Asignacién con resta. Permite restar y asignar a la vez. myvar - = 10; es idéntico amyvar = myvar-10; Asignacién con multiplicacién. Permite multiplicar y asignar a la ver. myvar *= 10; eslomismo que myvar = myVar * 10; + /=: Asignacién con division. Permite dividir y asignar a la ver. 10; es igual que myVar - myVar / 10; + =: Asignacién con “y” a nivel légico. Realiza un “y” légico y se lo asignaa la variable. a «= »; es lo mismo que a : Asignacién con “o” a nivel légico. Real myVar + aah; a un “0” légico y se lo asigna a la variable. a |= b; es igual quea = a | b; Bloques de control Ya sabemos cémo se guardan los datos en memoria para trabajar con ellos ¢ incluso conocemos la manera de realizar algunas operaciones pero nos falta saber cémo controlar qué acciones realizar en cada momento, Estos bloques de control del programa que nos servirén para indicar al procesador que realice una accién un ntimero determinado de veces, controlar cuando ejecutar unas acciones u otras dependiendo de algo, etc. En este apartado se nombrarin alguno de estos bloques pero para no aburrirnos, dejaremos la explicacién de su funcionamiento para los ejemplos que veamos mas adelante. if El bloque is permite ejecutar una seccién de cédigo cuando se cumpla una condicién dada, por ejemplo si el contador llega a 3, encender una luz. Su estructura es: Lf (condicién) ( Jebdigo a ele: /Jobdigo a ejecutar sino se cumple 1a condicién switch Los bloques switch permiten ejecutar diferentes cédigos dependiendo de los distintos valores que pueda tomar una variable 0 expresién, Seria una especie de if anidado o muchos i seguidos. Supongamos que tenemos una variable con el mes del afio y queremos sacar por pantalla el nombre del mes dependiendo del valor que tiene esa variable. Se podria usar un if... else con once comprobaciones mas un else “por defecto”, pero seria muy largo de escribir; en lugar de esto podemos usar la orden switch, donde se genera un bloque de cédigo por cada valor que pueda tener la variable y se ejecutar el bloque correspondiente al valor que tenga la variable en ese momento. Seria: switch (varlable_a_comprobar! //ebéige valor case valor2: //ebdigo valor 2 default: J/ebélgo valor por def goto Esta instruccién permite saltar a una parte de cédigo previamente marcada con una etiqueta. Su uso es: etiquetal Hebdige variado.. goto etiquetal; Con esto se haria que al llegar a la instruccién goto «t ejecucién volviera a la linea eciquetal. noma: El uso de esta instruccién e: de mantener y crear situaciones de error a medida que se introducen mas sentencias de este tipo en el cédigo. Bucles Los bucles nos permitiran ejecutar una serie de instrueciones un nimero de veces, El mimero de veces que se ejecutan estos bucles depende de la naturaleza del bucle y de los datos; podemos hacer que un bucle se repita un niimero determinado de veces o que se repita mientras haya una condicién que sea verdad. Los bloques de tipo bucle de los que disponemos son: + sor: Sirve normalmente para efectuar un mimero de ciclos conocido, que puede venir dado por un numero fijo o uno variable, por ejemplo el niimero de letras de una palabra. + white: Ejecutaré un bucle mientras la condicién que se le dé sea valida, pero antes de ejecutar el bucle, mira a ver si la condicién es valida y si lo es, lo ejecuta. Parecido al anterior, ejecutaré un bucle mientras la condicién que se le dé sea valida, pero primero ejecuta el bucle y luego mira a ver si la condicién es valida y si lo es, vuelve a ejecutar el bucle. * [Link] Mas adelante cuando veamos los ejemplos nos quedaran claros los funcionamientos de cada uno de los bloques. Funciones Una funcién es un blogue de cédigo que realiza una tarea particular. Trabajar con funciones es una buena manera de mantener el c6digo limpio y ordenado, creando bloques con funcionalidad propia aislados del resto de cédigo. Podemos decir que una funcién sirve para cumplir dos propésitos: hacer que el programador pueda decir “este bloque de cédigo hace esto, solo esto y especificamente esto y no debe mezclarse con el resto de cédigo” y hacer que el bloque pueda usarse en diferentes partes del cédigo. No vamos a entrar mas en detalle que ya hemos visto mucha teoria. Es hora de ensuciarse las manos. Instrucciones especificas Existen una serie de instrucciones que usaremos dentro de los bloques que hemos visto anteriormente. Estas instrucciones nos serviran por ejemplo para leer el valor que exista en alguna de las entradas de la tarjeta, realizar una escritura en las salidas, detener el programa unos instants... Las iremos viendo a lo largo del libro con cada uno de los ejemplos. Y ya ha Hegado el momento de ponerse manos a la obra. 5 Primeros programas En este capitulo aprendera a: + Utilizar el monitor serie + Crear un sketch desde cero + Manejar las sentencias de control + Crear un conversor de nuimeros + Diferenciar los distintos tipos de bucles Es hora de comenzar a realizar nuestros primeros sketches, En este capitulo pondremos a prueba lo visto en el capitulo anterior realizando unos cuantos programas que nos obligaré a introducir nuevos comandos e instrucciones, Ademés, haremos uso del monitor serie disponible en el entorno Arduino emulando entradas y salidas de la tarjeta. Primer programa Para estos primeros programas, vamos a dejar de lado los componentes electrénicos y vamos a jugar directamente con la tarjeta Arduino. Hemos hablado de un monitor serie que incorpora el entorno de desarrollo, vamos a usarlo para comunicarnos con la tarjeta. Para poder trabajar con el monitor serie, lo primero que debemos hacer es configurar la conexién dentro del bloque correspondiente a la funcién setup(), para ello, usaremos la instruccién [Link] (velocidad); donde velocidad es el ntimero de bits por segundo que enviaremos. En cuanto al nimero a utilizar, para comunicarse con el PC podemos usar 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, o 115200 bps, aunque realmente podemos usar cualquier valor ya que esta conexién la podemos usar para comunicarnos con otros componentes. Del mismo modo, para desconectar la comunicacién serie tenemos que usar la instruccién [Link](). void setup() onfigura el pus para trabajar a 9600 bps [Link] (9600) : , Como ya tenemos configurada la conexién, podemos usarla para enviar datos, por ejemplo para escribir en el monitor, podemos usar [Link] () 0 Serial-printin(), la diferencia entre ellas es que la segunda termina la linea y lo siguiente que escribiéramos apareceria en la linea de abajo. A estas funciones se les debe indicar lo que se quiere imprimir y opcionalmente el formato en el que quiere mostrarse. Vamos a crear un nuevo proyecto. Para ello vamos al ment Archivo > Nuevo y escribimos el codigo: void setup() // se configura el puerto Seria? begin (3600) ; , vold Loept) { int year ~ 20105 feria print ("2010 en hexadecimal se eserine:"); [Link], REX); delay(500);//se detiene el programa med do antes da un nuevo ¢ ' Hemos usado también la funcién deiay() que permite detener la ejecucién del programa durante los milisegundos que le indiquemos, en este caso 500 milisegundos, medio segundo. Antes de poder cargar el sketch en la tarjeta, debemos guardar nuestro trabajo; si no lo hemos hecho antes, al intentar cargar el programa nos saldrd una ventana indicdndonos que tenemos que salvar primero el sketch. Conectamos la tarjeta al PC y teniendo el modelo y puerto configurados, pulsamos el botén para cargar el sketch en la tarjeta tal y como hemos hecho anteriormente. Una vez cargado el programa en la tarjeta, si pulsamos sobre el botén del monitor serie [Bl o sobre el ment Herramientas>Monitor serial, se abriré la ventana de monitorizacién donde veremos aparecer la frase “2010 en hexadecimal se escribe: 7DA”; Un poco mas de programacion Ahora que sabemos utilizar el monitor serie, vamos a aprovecharlo para conocer un poco mas de alguno de los bloques que vimos en el capitulo anterior y comprender mejor su uso mediante ejemplos Control mediante if Ya vimos que la estructura basica de ir era: LE (condieién) { //obdigo a ejecutar felse( (ebdigo @ ejecutaz sino se da la condicién , La condicién dada entre los paréntesis puede ser en si una variable o una comprobacién del tipo a > b, b!= 0 0 similar, Si la condicién es distinto de 0 0 se tienen valores HIGH 0 true en caso de booleanos, entonces se ejecutard el cédigo entre que se encuentre entre las Ilaves que delimitan el bloque if. Si el cédigo a ejecutar es dentro del bloque :£ es solamente una linea, entonces podemos no escribir las Ilaves pero es muy aconsejable usarlas siempre para evitar errores: ya que si el dia de mafiana se afiaden nuevas lineas al bloque, si nos olvidamos de poner las Ilaves, solo se ejecutaria la primera linea y no tendria el comportamiento esperado. Si se decide trabajar sin Ilaves, lo que podemos hacer es escribir la orden en una sola linea para que quede claro que el bloque se compone solo de esa instrucci6n: if (condicién) sentencia_a_ejecutar; en lugar de Lf (condieién) nova: Hay que tener cuidado de no caer en la trampa de hacer la comparacién de igualdad usando el operador “=” que es el de asignacién en lugar de “=="que es el de comparacién. Dado que el bloque ifse ejecuta siempre que la comprobacién sea distinto de 0, la asignacién dard siembre como verdadero a no ser que se esté asignando el valor 0; la sentencia s¢ (i-5) » siempre se ejecutard, Una variacién del bloque i¢ es la Hamada if... else que se compone de dos bloques, el primer bloque ir ya se ha visto y el bloque e1se que se ejecutaria siempre que no se ejecute el bloque if; la ejecucién del cédigo solo entra en uno de los dos bloques y siempre entra en uno de ellos. El bloque cise funciona del mismo modo que el iz, ejecutando lo que encuentra entre Ilaves solo la primera instruccién en caso de que no haya Haves. Por ejemplo it (a>) , I /cbdigo a ele: ' = cuando b >= a Si fuera necesario, el bloque cise puede tener nuevas comprobaciones permitiendo asi tener una bateria de comprobaciones eSdigo a ejecutar , if (a> bIL //osdige a ejecutar boa //ebélge a ejecutar cuando b= a , O escrito de modo més compacto: if (a> B) M08 0 if (a> J ebaigo a ear cuando b , Hebdige a ejecu! , cuando b= a Para probar lo visto vamos a realizar un nuevo programa con una serie de it para ver la salida que tendrfamos. tup() { [Link] (3600); void loop} ( nt i = 10s [Link] , [Link]("Es igual © mayor de 5”) } if (i == 10)8e delay (2000); ' [Link] (“Es igual 2 10"); En la salida veremos que se escribe cada medio segundo: 8 igual © mayor de 5 8 igual a 10 Control mediante switch El switch actia como si fuera una serie de if consecutivos; su aspecto es: switch (variable a_comprobar)( //28digo valor I/ebélgo valor 2 [/esdigo valor por defecte , Cuando se llega a un switch, el programa evaltia el valor de la variable variable_a_comprobar y lo compara con los valores indicados por las etiquetas case. En caso de que el valor de la variable a comprobar y el valor de la etiqueta coincida, entonces comienza a ejecutar el codigo hasta encontrar una sentencia break; 0 el fin del bloque switch. La palabra reservada break; la encontraremos en varios bloques y su funcién es salir en ese preciso instante del bloque en el que se encuentre, dejando las variables tal y como estan en ese momento, Es muy importante tener en cuenta que el hecho de que hasta que no encuentre una orden break 0 se acabe el bloque switch, se seguird ejecutando cédigo. Hagamos el sketch: yold setupl) ([Link] (9600) ;) loop t) { as case Li [Link] ("codigo"): 102") ;//ebdigo? si a igual a 203 ligod si a digos") ://e8aigos para el resto de valores de a delay (1000); //esperanos un segundo antes de otro cicto , En la salida del monitor serie veremos que se escribe cada segundo: codigo? codigos En este caso, si la variable a toma el valor 10, se ejecutaria el cédigo codigo4, correspondiente a la etiqueta defauit; como a tiene el valor 2, ejecutara el cédigo2 y cédigo3 ya que al no haber un break; seguiria ejecutando el cédigo marcado por la etiqueta del caso 5 hasta Hegar al break es decir en el terminal serie veremos las salidas “codigo2” y “cédigo3”. En este caso, la ejecucién seria idéntica si el valor de a fuera 2 03. Control mediante for La estructura del bucle for es: for (inicializacién; condicién: instr /Ieédigo & ejecutar ' La parte de inici utilicen dentro del bucle, esta parte se ejecuta una sola vez al comenzar el alizacion sirve para inicializar variables que se bucle. La condicién sirve para saber cuando se debe abandonar el bucle y darlo por terminado; el bucle se seguird ejecutando hasta que la condicién sea 0 0 false; la condicién se comprueba cada vez que se va a ejecutar un nuevo ciclo del bucle. La parte de inst ruccién se ejecuta cada vez que se termina un ciclo y se suele utilizar para incrementar o disminuir variables, pero se puede poner en ella lo que se quiera. Resumiendo, su ejecucién seria: se ejecuta la inicializacién, cuando empiece el bucle por primera vez, se comprueba la condicisn, si es verdadera entonces se ejecuta el cédigo del bloque cor, cuando se termina la ejecucién del bloque se pasa a ejecutar el cédigo correspondiente a instruccién y se comienza un nuevo ciclo de bucle con la comprobacién de la condicién y asi sucesivamente hasta que la cona sea falsa. for [int j= OF 4 < 10s S41 /ebdigo a ejecutar 10 veces y Para abandonar el ciclo actual y comenzar un nuevo ciclo podemos utilizar que lo que hace es finalizar el ciclo actual en el momento en el que se ejecuta esta instruccién y continuar con un nuevo ciclo. No hay que confundirlo con break que saldria del bucle por completo, sin acabar el resto de ciclos que le quedaran por realizar. Por ejemplo para ejecutar un cédigo solo los ciclos impares podemos hacer que se ejecute la instruccién continue en los ciclos pares: la instruccién continu setup() (si 29600) 5 Loop) selay (1000) + , Aqui en el bucle hemos realizado una comprobacién con un iz para saber si la variable i en el ciclo en el que se esta ejecutando es par o impar. Se obtiene si es par mediante el operador s que nos devuelve el resto de una divisi6n; si el resto de la division entre 2 es igual a 0 quiere decir que es par, y no mostraremos el mensaje, asi que ejecuta la instruccién continue para comenzar el siguiente ciclo del bucle y que se incremente i en uno. En la salida del monitor serie veremos que se escribe cada segundo: soy impar inpar: 9 Control mediante while Su formato es: hie (expeesién) ( I eédiga a elec ' Al igual que pasa con el bloque for se puede cancelar un ciclo y continuar con el siguiente mediante la instruccién continue o acabar con el bucle mediante break. Hay que vigilar que dentro del bloque correspondiente al eédigo del bucle haya algo que varie la expresién a tener en cuenta para finalizar el bucle, ya que si no estariamos ante un bucle infinito. Por ejemplo, este bucle se repetiria 10 veces: void setup() ([Link] (9600) ;) opt) while (1 >0)1 If cba} al print (*ciclos restan [Link](i) En la salida del monitor serie veremos que se escribe cada segundo: 0 Ciclos restantes: Ciclos restantes: Ciclos restante: Ciclos restantes: Ciclos restante: Ciclos restantes:5 Ciclos restantes:4 Ciclos restantes:3 Ciclos restante: Ciclos restantes:1 Control mediante do...while Es otro tipo de bucle muy semejante al bucle while pero en este caso, la condicién se comprueba al final del bucle en lugar de al principio, es decir, se ejecuta al menos una vez. Cada vez que se acaba el bucle mira si tiene que empezar uno nuevo. Su format dot J while (condictén) ; Hay que recordar que el hecho de que se compruebe Ia condicién al final de cada bucle hace que los bloque do. siempre una vez. Si tenemos el c6digo: nile al menos se ejecutan setup() ([Link](9600) 7) al-printin(*Zstoy en el bucle"}; Pwhile (1 < 5) , Veremos que imprimiré el mensaje en el monitor serie, ya que se ejecuta el ciclo una vez antes de hacer la comprobacion. Conversor de base Vamos a utilizar lo aprendido para mejorar un poco nuestro conversor a hexadecimal, de manera que podamos decirle el mimero que queremos convertir y la base en la que queremos convertirlo. Para mantener el nimero a convertir y la base, usaremos dos variables, que las declararemos fuera de los bloques; una de ellos sera de tipo entero y la otra de tipo byte. nsigned int nunbertoconvert nimere a convertir byte base = ‘\O'; //base a convertir void setup() 1) se configura el para trabajar a 9600 Seria? begin (3600): ' Para el cédigo del bucle principal usaremos algo que hemos nombrado anteriormente pero que no hemos visto: las funciones. El bucle quedaria: votd Loop t) | Jobtener el ninero a transformar getNumber () fener la base y convertir W/ se inicializan a nuevo las variabl onvert = 0; Nore , Como vemos, usaremos una funcién para obtener el numero y otra para obtener la base y convertir. Podriamos haber usado mas funciones o menos, esto es cuestion de qué se elija la hora del disefio del programa; en cada caso serdn mejores unas opciones y en otros, otras opciones distintas. Para escribir las funciones, podemos hacerlo tras el bloque Loop (). La funcién getNumber() leerd la entrada serie y la guardaré en una memoria interna. Para saber la cantidad de datos que tiene esta memoria podemos utilizar la instruccién [Link](), de modo que si es mas que 0, podemos saber que tiene datos. Lo que se guarda en la memoria, no es directamente el numero pulsado, sino la representacién ASCII del caracter que se selecciona (por ejemplo el caracter “1” en memoria viene representado por el cédigo ASCII 49), por lo que hay que hacer una conversién de esta representacién al numero representado; para ello usaremos la funcién [Link] in esta funcién se espera que el usuario introduzca el nimero a transformar, por lo que haremos un bucle que se repetira hasta que existan datos para leer en la memoria. La funcién quedaria: + obtiene #1 ntmero a convertir eNunber () [ Serial In("Intreduce el nimero a Hs hay datos ea el buffer de e: zada pasarlos a ente £ ([Link]() > 0 nunberToconvert = [Link] apverreNcra: Para mostrar textos por pantalla en Arduino, es mejor no utilizar tildes en las palabras (usamos numero en lugar de nimero), ya que de lo contrario pueden no mostrarse correctamente En la funcién getBaseAndconve (0, debemos mostrar un mensaje de seleccién de opciones de conversién, leer la entrada que haya seleccionado el usuario, transformar el mimero a la base indicada y mostrarlo por pantalla, Para leer los datos introducidos, [Link](), que nos devolver el primer byte de la memoria y saremos esta vez deberemos comparar con las opciones de conversién disponibles. Esta manera de leer de la memoria (también llamado buffer), ademas de leer el byte, lo elimina del buffer, de modo que si hacemos otra lectura, leerfamos el siguiente byte. Si el byte lefdo no es uno de los esperados, se tiene que informar al usuario que el valor introducido no es valido. * obtiene 1a base (b, 0 h} y muestra + el valor del niimero en esa base void getBaseAndConvert () { [Link] (“Introduce 1a base en la que convertir el miners “}; [Link] (nunberToConvert) ; [Link](%p) Binario"); [Link](%e) Octal"); [Link]("h) Hexadecimal”); boolean base0k = false d/el bacle se repetiré mientras no se introdu: dot //si hay datos en un valor apropiado entrada leemos el byte Af ([Link]() > 0)( base = [Link](); (/conpzobanos el valor del byte switeh (base) { case ‘bY Serial print ("En binario es:"); [Link](numberToConvert, SIN): baseOk = true; break; [Link] ("En octal es:"); [Link], OCT) : baseok = true: break: case ‘nt [Link] (“En hexadecimal 25:17 [Link](numberToConvert, HEX); basedk = truer break; defauit: [Link](*ia base intreducida no es correcta! Seleccione otra ver"): , while (baseok =: false); i io ox Send ] fincroauce ei auzero = conve: lincnedice 1a oss 2a la que convertir e2 numero 260 by sinaein le) ocean lb) texadecinat [rocroduce cl aumce> frurevduce 12 vase le) Binario le) occen ln) Hexaremrat len hexadecimal 29:072 lincroauce e1 auzero 2 conve: Ls que convertor ef aumero 3252 7 eutosal Neineending | fosootass =) Figura 5.1. Monitor serial con la salida del sketch. Para usar el programa, necesitamos cargar el sketch en la tarjeta y se lanza el monitor serie de modo semejante a como lo hicimos antes. En el monitor aparecera un mensaje pidiendo que se introduzea un némero; en la parte superior de la pantalla se introduce el ntimero a convertir y para enviarlo al puerto serie se debe pulsar sobre el botén Enviar. Mas adelante se pide que seleccionemos la base a la que transformar el niimero; del mismo modo se introduce en la caja superior la letra de la base a la que transformar y se obtendré en la pantalla el ntimero convertido a la base seleccionada. $i en lugar de una letra se introducen varias, el sistema leera de una en una hasta que una de ellas sea una base valida, mostrando errores para el resto. El cédigo completo quedaria: unsigned Int aunbe yee base = ‘\O'7 //oase a convertir 07 // nimezo a conver void setup() // 96 configura el puerto serie para trabajar a 9600 bps [Link] (9600) + void leopt) 1 J/optener el nimero @ transformer getNumber (1; //obtener la base y convertir getBaseAndConvert (1; // 9 inickalizan de nuevo lag variables para un auevo ciclo humberToconvert = 02 base = ‘\0"r * ope: aeeeeuessuasteentecteuerensesecetee/ Je el nlimere a convertir void getNunber(} [Link] ("Introduce el nimero a convertir:”); dot //9i hay davos en el buffer de entrada pasarlos a entero if ([Link]() > 024 numberToConvert = [Link] (}? , , while (nunberToCenvert [attnseesnenenteteneneensnsnennetens * obtiene la base (by 0, h) y mostra + el valor del nimero en esa base void getBaseAndConvert () { [Link] (“Introduce la base en la que convertir el nimero “}; Seria!.printin (nunberToconvert [Link]("b) Binario"!; [Link](%e) Octal"); peintin(%h) Hexadecimal”) ; boolean base0k ~ false: seri /fol bacle se repetiré mientras no se introduzca un valor apropiado dot (/si ay datos en la entrada leemos el byte Af ([Link]() > 0)( base = [Link](); /{comprobanos el valor del byte switch (base) { case ‘bt: [Link] ("sn binario ¢: [Link], SIN); baseOk = true: break; [Link] (En octal es:"): [Link](numberToConver=, OCT); baseOk = truer break: case th [Link] (*En hexadecimal es:")2 Se HEX) 5 Serial printIn (nunbertoconve: baseOk = true: break: gegauit: [Link] ("ia base introducida no es correcta! Seleccione otra ver"); > while (baseok false): 6 Entradas y salidas En este capitulo aprendera a: + Diferenciar datos analdgicos y digitales * Configurar los pines de la placa para su uso + Manejar datos analégicos + Crear un contador de tiempo + Utilizar pulsadores + Realizar un comprobador de pilas + Disefiar un dado electrénico + Hacer uso de leds Ya hemos visto que la tarjeta Arduino tiene unos zécalos donde conectar cables para obtener y enviar datos al mundo exterior, son las entradas y salidas de datos. En este capitulo veremos los tipos de configuracién que pueden tomar cada uno de estos pines y su utilizacién en proyectos reales Entradas Las entradas pueden ser tanto analégicas como digitales. Dependiendo de la naturaleza de lo que se quiera captar se deberdn utilizar un tipo u otro, por ejemplo, si queremos saber si alguien ha pulsado un botén, nos sirve una entrada digital, ya que el botdn esta pulsado o no lo esta, pero si quisiéramos medir una temperatura, queda claro que un valor de 0 0 1 no nos es suficiente para saber los grados que hace. Entradas digitales Las entradas digitales son aquellas que pueden detectar los valores 0y 1, 0 dicho de otro modo Low y tGH. Como podemos imaginar, realmente no recibimos un 1 del mundo exterior, sino que lo que recibimos es un voltaje, que nosotros interpretaremos como un 1. De manera estandar se toma que OV representa al 0 y SV representa al 1, aunque estos voltajes no tienen por qué ser exactos, sino que lo que se hace es que si es cercano al OV se toma como 0 y si es cercano a SV se toma como 1, con esto evitamos problemas de pequefias variaciones en el voltaje debido por ejemplo a interferencias. El valor que marca la diferencia entre 0 y 1 son 3V, es decir voltajes mayores seran tomados como 1 y los menores como 0. Esto no quiere decir que en nuestros circuitos trabajemos cerca de 3V, nada de eso, hay que trabajar lo mas alejado posible de ese valor y lo mas cercano a OV y 5V para que interferencias y caidas de voltaje no esperadas no cambien los valores esperados. Para trabajar con las entradas digitales, basicamente usaremos dos funciones: + pinMode(pin, INeUT): que sirve para configurar el pin en modo lectura y donde pin es el ntimero de pin digital sobre el que leer, + digitalRead(pin): para leer el valor de la entrada y donde pin es el nimero de pin digital sobre el que leer. Retornara los valores HIGH 0 LOW en funcién del voltaje recibido. Para poder realizar las lecturas de las entradas digitales, lo primero que se debe hacer es realizar la configuracién del pin o pines de entrada que se quieren leer en la funcién setup (); (realmente no es necesario para la lectura pero es mejor acostumbrarse) y mas adelante realizar llamadas a la funcién digitelRead(pin}; con el mismo nimero de pin que se ha preparado para la lectura. Resistencias de pull-up y pull-down En los montajes con entradas digitales se suelen utilizar unas resistencias externas para obtener los voltajes deseados en las lecturas en caso de que no exista voltaje en la entrada; es decir que si no hay sefial, se puede forzar a que tenga un valor determinado ii1ci 0 Low mediante unas resistencias convenientemente colocadas, estas resistencias se Ilaman de pull-up o de pull-down dependiendo de la situacién dentro del montaje. Si cuando estamos en circuito abierto la resistencia esta en la rama de SV se denomina pull-up y si se encuentra en la rama de OV de pull-down.

You might also like