0 ratings 0% found this document useful (0 votes) 4 views 26 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.
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
Go to previous items Go to next items
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 ordenswitch, 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, realizaruna 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 buclesEs 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 lalinea 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 ejemplosControl 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 seejecutaria 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 sebucle. 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 elbyte, 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 ledsYa 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.