Académique Documents
Professionnel Documents
Culture Documents
UnprogramaenArduinoesthechodecdigo,escritoenunlenguajede
programacinllamadoC.Cuandoescribimosuncdigoesimportanteteneren
cuentaqueArduinonoactacomounserhumano,norazona.Sialguien
pronunciaunapalabraincorrectaprobablementeentendamoselsignificado
Arduinosinembargono.Sitecleasincorrectamenteuncomandomientras
escribescdigoenelIDEdeArduino,novaaentenderloquequiereshacer.
OtracosaatenerencuentaesqueArduinoeslgicoperonoracional.No
sabequequiereshacer,slohaceloqueledigashacer.
EstructuraBsica
CuandoescribimoscdigoenelIDEdeArduinousamostrespartesbsicasen
laestructuradelprograma.
declaracindevariables
setup()
loop()
Lasfuncionessetup()yloop()sonesencialesescribirlasparael
funcionamientodelprograma.Amedidaquetengasmsconfianzaenla
escrituradecdigoparaArduinotedarscuentaquenoesobligatoriopara
escribircdigousarestospasos.Sinembargovienebienestructurarel
programaparahacerfcilsurevisinyayudaabuscarerroresenelcdigo.El
siguientecdigoesunejemplodeunprogramasencilloquehaceparpadearel
LEDdelaplacaArduino:
intledPin=13
voidsetup(){
digitalWrite(ledPin,OUTPUT)
}
voidloop(){
digitalWrite(ledPin,HIGH)
delay(1000)
digitalWrite(ledPin,LOW)
delay(1000)
}
[GetCode]
Variables
Unavariableesuncontenedorparaguardaralgndato.Digamosquequiere
leerunsensordealgntipo.Estesensortedarunvalorenformato
numrico.Siquiereusarestevalorenotrapartedelprogramapuedeguadar
estevalorenunavariable.Antesdealmacenarelvalornecesitadeclararla
variable,estosignificaqueledigasalprogramaquelavariableexisteyque
tipodevariablees.
Tenemosqueponerunnombrealavariable.Elnombrepodrasercualquiera
peroesunaideabuenadarasusvariablesnombresqueseanlgicos.Cuando
revissuprogramaserfcildeterminarqutipodevalorsealmacenaen
unavariablenombradatemSensor.Puedesermsdifcilrecordarcualesel
contenidoenvariablesconnombrescomobanana,petero
supercalifragilisticexpialidocious.MsexplicacionesenlaseccinTiposy
DeclaracionesdeVariablesenlaspginas8082.
1. Referenciacruzadadentrodellibro."MsexplicacionesenlaseccinTiposy
DeclaracionesdeVariablesenlaspginas8082."(puedenocuadrarconla
maquetacinenespaol).################################
Voidsetup
Arduinoloprimeroquehacecuandoarrancaesmirarlavoidsetup().stees
unodelospasosesencialesdelfuncionamientodelprograma.Lavoidsetup()
eslapartequeinicializalasconfiguracionesdelosdiferenteselementosdel
programadeArduinoporejemplolaconfiguracindeunpinoestablecerla
velocidaddecomunicacin.Lavoidsetup()sloseejecutaunavezenelinicio
ynosevolveraejecutarhastaqueArduinoseapaguyvuelvaaarrancaro
seresetea.
Elsiguientecdigoesunejemplodeunavoidsetupqueponelaconfiguracin
deunpincomosalida.
voidsetup(){
pinMode(pin,OUTPUT)
}
[GetCode]
Voidloop
Lavoidloop()eselsegundopasoesencialparaelfuncionamientodeun
programa.Aquesdondeseejecutanlasaccionesdesuprograma.Comosu
nombreindica,staparteseejecutaunayotravez.Enunprogramade
Arduinotodoelcdigoseejecutalneaalnea.Despusdeejecutarlavoid
setup()enelarranquecontinuaconlavoidloop().
Entoncesempiezaahacertodoloqueestensucdigodesdeelcomienzo
hastaelfinaldelavoidloop().Cuandollegaalfinaldelavoidloop()
simplementevuelveaempezarconloscambiosdelprograma.Elsiguiente
cdigoeslavoidloop()delejemplodelprincipiodelcaptulo:
voidloop(){
digitalWrite(ledPin,HIGH)
delay(1000)
digitalWrite(ledPin,LOW)
delay(1000)
[GetCode]
Estavoidloop()empiezaconunalneadecdigoqueactivaelpincuyo
nmeroseindicaenelnombredelavariableledPin.Lasiguientelneade
cdigoproduceunretardoydespusdesactivaelmismopinyacontinuacin
realizaunnuevoretardo.SiejecutamosestecdigoenArduinoconunLED
conectadoalpinconelnmeroindicadoenlavariableledPin,elLED
parpadearencendindoseyapagndoseconunsegundoderetardohasta
apagarlaalimentacin.
Marcasdepuntuacin.Parntesisyllaves
Lasmarcasdepuntuacinseutilizanparadefinirelinicioyelfinaldeciertas
partesdelcdigo.Haydostiposdemarcasusadosenlaescrituradecdigo
paraArduino.Losprimerossonlosparntesisizquierdoyderecho()yson
normalmentellamadosentreparntesis.Estossoportesseutilizanpara
escribirfuncionesdentrodenuestrosprogramas.Seutilizanparaintercambio
deunavariableenalgnotrolugardentrodenuestroprograma.
Tambinesposibletenerunafuncinconlosparntesisvacos,peroes
necesarioponerdespuselnombredelafuncinoArduinotendrunerrorde
compilacin.Unejemplodefuncionesqueutilizanparntesisvacossonla
voidsetup()ylavoidloop().
Elsegundotiposonlasllaves{}.Estasseusanparaindicarelprincipioyfinal
deunafuncin.SinestasllavesArduinonosercapazdesaberdnde
empiezayterminalafuncinyqueseconsideracomolasiguientepartedel
cdigo.Unusocomndeestasllavessehaceenlafuncinvoidsetup().
voidsetup(){
//Thecodeinthefunctiongoesinhere.
[GetCode]
Puntoycoma
Lospuntosycomassonunodeloselementosmsimportantesparaescribir
cdigoparaArduinoyunodelosquemsfcilmentenosolvidamos.Seusan
parasepararlasdiferenteslneasdecdigoensuprogramaeindicaaArduino
dondeterminasucomando.Elsiguienteejemplosemuestracomosedeclara
unavariableconelusocorrectodelpuntoycoma.
intmyNumber=15
[GetCode]
Elpuntoycomaterminaelcomandoyhemosdeclaradounavariableentera
conelnombremyNumberyestavariabletendrelvalor15.Siteolvidasun
puntoycomaentucdigoelIDEdeArduinoresaltarlalneadecdigo
indicandolafaltadepuntoycoma.
Comentariosdecdigo
Avecespuedesertilparaponernotasoescribircomentariosdentrodesu
cdigoparaunomismooparaotrapersona.Siseescribeeltextodentrode
suprogramaArduinopiensaqueesdecdigoeintentaejecutarloqueest
escrito.SiloqueestescritoesalgoqueelArduinonoentiende,ledarun
mensajedeerror.
HaydosmanerasdeescribirmensajesenelcdigoyocultarloaArduino.La
primeradeellaseselusodeunadoblebarra//delantedecualquier
mensaje.EstoocultaelmensajeaArduinoperodejalovisibleparalos
programadores.Elsiguienteesunejemplodeunmensajeocultodentrode
loop():
voidloop(){
digitalWrite(ledPin,HIGH)//turnstheledon
delay(1000)//waitforsometime
digitalWrite(ledPin,LOW)//turnstheledoff
delay(1000)//waitabitmore
}
[GetCode]
Sideseaocultarlosmensajesdemsdeunalneatienequeutilizar/*y*/.
Paramarcareliniciodeunmensajequeseoculta,seusa/*yparamarcarel
finaldelmensaje,useel/*.Estoocultartodoelmensaje.Elsiguiente
cdigoesunejemplodecmoocultarunbloquedetextodentrodeloop():
voidloop(){
/*thiscodewillfirstturnaledonthenitwillwait
forsometimeafterthatitwillturntheledoffand
thenwaitagain.*/
digitalWrite(ledPin,HIGH)
delay(1000)
digitalWrite(ledPin,LOW)
delay(1000)
}
[GetCode]
Tiposdevariablesydeclaraciones
Daraunavariableunvalorestambinconocidocomodeclararunavariable.
Declararunavariableesdefiniruntipo,nombreyvalorparalamisma.
intmyNumber=14
[GetCode]
Enelejemploanteriorel"int"eseltipodevariable,"miNumero"eselnombre
y14eselvalor.Tenencuentaquesiempretienesquedarleunvalorala
variablecuandoladeclaras.Suponemosquequieresguardarunvalordetu
sensorentuprograma,peronopuedesleerelvalorcuandodeclarasla
variablefueradelvoidloop(),eneliniciodelprograma.Tledasunvalor
temporal0alavariablecuandoladeclarasalinicio,comoenelsiguiente
ejemplo:
intmySensor=0
[GetCode]
Haydosposiblesmanerasdedeclararunavariable.Siladeclarasalprincipio
detuprograma,antesdelvoidsetup()diremosqueesunavariableglobal.
Unavariableglobalesaccesibledesdecualquierpartedetuprograma.Por
otroladotenemoslasvariableslocales,queslopuedenusarsedentrodela
funcinenlaquesedeclararon.Elsiguienteejemplomuestraunavariable
globalllamadaledPin:
intledPin=13
voidsetup(){
digitalWrite(ledPin,OUTPUT)
}
voidloop(){
digitalWrite(ledPin,HIGH)
delay(1000)
digitalWrite(ledPin,LOW)
delay(1000)
}
[GetCode]
LavariableledPinesvisibleentodoelprogramaycuandoesusadadentrode
voidloop()serreconocidacomounavariabledetipoentero(integer)conel
valor13.Sinembargo,siescribeselmismoprogramadelasiguientemanera:
voidsetup(){
intledPin=13
digitalWrite(ledPin,OUTPUT)
}
voidloop(){
digitalWrite(ledPin,HIGH)
delay(1000)
digitalWrite(ledPin,LOW)
delay(1000)
[GetCode]
Entonceselprogramatedarunerrordiciendotequenopuedeencontrarla
variableledPinqueintentasusardentrodevoidloop(),yaqueest
declaradadentro(yslodentro)delafuncinvoidsetup()
Enalgunosprogramaspuedesertilusarvariableslocales,peroenla
mayoradeloscasosesmejordeclararlascomovariablesglobalesy,por
tanto,declararlasantesdelvoidsetup()
Unavezquetienesunavariableconunvalor,tupuedesasignarleotrovalor,
perotenencuentaqueborrarselqueexistapreviamente.Supongamosque
tenemosunavariablellamadamiNumeroylahemosdeclaradocomo:
intmyNumber=14
[GetCode]
Sialolargodetuprogramaquieresdarleotrovalora"myNumero",lohars
as:
myNumber=56
[GetCode]
Estoborrarelnmero14delavariable"myNumero"yloreemplazarporel
nmero56.Cuandoreasignamosvaloreslasvariables,notenemosqueaadir
"int"alcomienzodelalineadecdigocomohicimoscuandoladeclaramos.
stoesporquenosotrosslodeclaramoseltipodevariableunavezenel
programa.Esposiblecambiarelvalordelavariable,peronosutipo.
Tipos
Hastaahorahemosestadohablandode"int",queesellaabreviaturade
nmeroentero(eltipomscomndevariablesenprogramasdeArduino).
Lasvariablescomunesson:
Int:Losenterosseusanparaguardardatosnumricossinpuntosdecimales.Almacenanunvalor
de16bitsenelrangode32767a32767.Estoquieredecirqueunentero(int)ocupa16bits
enlamemoriadeArduinoypuedesercualquiernmeroenteroentre32767y32767.
intmyNumber=1234
[GetCode]
Long:Enmuchoscasoseltamaodeunenteronosvaldrpero,enotros,necesitaremos
almacenarvariablesmsgrandesqueeltamaoquenospermiteeltipo"int",paraello
usaremoseltipo"long".Eltipo"long"extiendeelrangodevaloresenteros(sindecimales)aun
valorde32bits,estoesunrangode2147483647a2147483647.Igualmenteestoquiere
decirqueunnmero"long"ocupar32bitsenlamemoriadeArduinoynospermitirusar
valoresentre2147483647y2147483647.
longmyBigNumber=90000
[GetCode]
Byte:ParaahorrarespacioenlamemoriadeArduino,estilalmacenarlasvariablescomobytes.
Unbyteesunnmeroenterode8bitsconunrangode0a255.Conunbyteocuparemos8
bitsdelamemoriadeArduinoypodremosrepresentarcualquiernmeroenteroentre0y255.
bytemySmallNumber=150
[GetCode]
Float:Elnicotipodedatosquepuedeguardarnmeroscondecimaleses"float".Floattiene
mayorresolucinquelosenteros(int,long,byte)yseguardancomounvalorde32bitsenel
rangodesde3.4028235E+38a3.4028235E+38.Estoquieredecirquepuedesguardarun
nmerodecimalperosloeneserango.Losnmerosdecimales(float)ocupanmuchamemoria
deArduino.Usardecimalesesmuchomslentoqueusarenteros,puesArduinonecesitams
tiempopararealizarclculosconstos.
floatmydecimalNumber=2.33
[GetCode]
Arrays(Matrices):Avecespuedesertilguardarunacoleccindevalores,entoncestendremos
queutilizarunamatriz.Todoslosvaloresalmacenadosenunamatrizseguardarnconun
nmerondice,paraaccederacualquiervalorloharsreferenciandosunmerondice.Las
matricessedeclarandeigualmodoquelasvariables(coneltipo,elnombreylosvalores).El
siguienteejemplomuestracomodeclararunamatrizdeenterosconseisvaloresdistintos:
intmyArray[]={1,2,3,4,5,6}
[GetCode]
Tenencuentaquelasmatricesempiezanacontardesde0.Estosignificaque
laprimeraposicindelamatrizes0.Enelejemploanterior,elnmero1est
guardadoenlaprimeraposicindelamatriz,portanto,siqueremosutilizarlo
loharemosdelsiguientemodo:
myNumber=myArray[0]
[GetCode]
Estoalmacenarelvalordelaprimeraposicindelamatriz(elvalor1),en
nuestravariablemiNumero.Porotrolado,podemosalmacenarvaloresenla
matrizhaciendoreferenciaalaposicindelnmeroquenosinteresa:
myArray[0]=23
[GetCode]
Estoguardarelnmero23enlaposicin0delamatriz(dondeantesestaba
elvalor1).
Sisabesquevasausarunacantidaddenmerosylosquieresalmacenaren
unamatriz,peronosabesquvaloresvanaser,puedesdeclararlavariable
reservandoelnmerodeposicionesquequieras,delsiguientemodo:
intmyArray[5]
[GetCode]
Estocrearunamatrizde5posiciones,donde4serlaltima(Recordemos
queempiezaacontarde0).Nointentesalmacenardatosenlaquinta
posicin,estaposicinserincorrecta,peroArduinonoteavisaralahorade
comprobarelcdigo.
Haciendoclculos
ComoArduinoesunpequeoordenador,puedehaceroperaciones
matemticas.Puederealizarlasoperacionesmatemticasmshabituales
comoson,lasuma,laresta,lamultiplicacinyladivisin.
myValue=1+1
/*estoguardaraelnmero2enmyValue*/
myValue=42
/*estoguardaraelnmero2enmyValue*/
myValue=3*4
/*estoguardaraelnmero12enmyValue*/
myValue=6/2
/*estoguardaraelnmero3enmyValue*/
[GetCode]
Siestsusandoenterospararealizarlasoperacionesmatemticasnopodrs
obtenerdecimales,"float"eselnicotipodevariablequepuedeobtenerlos.
Enotraspalabras,siquieresdividir10entre6,dar1comoresultado.Hacer
clculosdemasiadolargospuedeproducirundesbordamientoenlamemoria
deArduino,yaquetodotipodevariabletieneuntamaomximo.Realizar
clculosconnmerosgrandesralentizarelArduino.
Puedesrealizarclculosentrevariables,acontinuacintieneslosdiferentes
clculosquesepuedenaplicaralasvariables:
x++/*incrementaraen1elvalordex.Eslomismoque
escribirx=x+1*/
x/*decrementaraen1elvalordex.Eslomismoque
escribirx=x1*/
x+=y/*incrementaraelvalordeyalvalordex.Es
lomismoqueescribirx=x+y*/
x=y/*decrementaraelvalordeyalvalordex.Eslo
mismoqueescribirx=xy*/
x*=y/*multiplicaraxpory.Eslomismoqueescribirx=x*y*/
x/=y/*dividiraxentrey.Eslomismoqueescribirx=x/y*/
[GetCode]
Mapeo
Supongamosquetienesunsensorquesoloproporcionavaloresentre50y
200,yquetnecesitasunrangodesde0a500.Lafuncin"map"puedeser
til.stafuncinremapeaunrangodevaloresaotrorangodevalores.
Digamos,haceunareglade3:
myVariable=map(mySensor,50,200,0,500)
/*valorSensor,valorMinSensor,valorMaxSensor,
minimoDeseado,maximoDeseado*/
[GetCode]
Enelejemploanteriorestamosusandolafuncin"map"paraguardarun
valorenmiVariable.ElvalorprovienedemiValoryel50yel200marcanlos
valoresmnimoymximodenuestrosensor.El0yel500eselrango
deseado.Lafuncin"map"asignarelvalorobtenido(dentrodelrangodel
sensor,50200)alrangodeseado(0500).Observequesiquieresusarla
funcin"map"debesconocerelrangoquequieres"mapear".Paraencontrar
msinformacinsobrecmoleervaloresvayaalaspginas98101.
1. Referenciacruzadadentrodellibro."vayaalaspginas98101",puedeno
cuadrarconlamaquetacinenespaol.
################################
Random(max)(Aleatorio(mximo))
Elcomando"random"devolverunvaloraleatorioenelrangocomprendido
entre0yelvalorquepongasentreparntesis.Parapoderusaresevalor
tienesqueguardarloenunavariable.
myVariable=random(5)
[GetCode]
stoguardarunnmeroaleatorioenmiVariable,dentrodelrangode0a4.
Tambinpuedesusarelcomando"random"directamentemientrashaces
comparaciones:
if(3==random(5)){
doSomething
}
[GetCode]
Elcomando"random"slodevolverunvalorentre0yelmximo
establecido,nuncadevolveresemximo.
Random(min,max)
Siquieresunnmeroaleatoriocomprendidoenunrangoquecomienceenun
valordistintode0,debesespecificardichomnimo:
myVariable=random(200,300)
[GetCode]
Comparacioneslgicas
Siquieresrealizarcomparacionesentusprogramasdebesusaralgunode
estoscomparadores.Estascomparacionessepuedenrealizarentrevariables
oconconstantes,obteniendosiemprevaloresVerdaderooFalso.
Iguala==
==esusadoparacompararsiunelementoesigualaotro.Unacomparacin
usando==sloserverdaderosiambosmiembrosdelaigualdadson
idnticos:
x==y
/*xesigualay*/
[GetCode]
Distintode!=
'!=seusaparacomprobarsiunelementoesdistintodeotro.Una
comparacinusando!=sloserVerdaderosiunmiembroesdistintodel
otro:
x!=y
/*xesdistintodey*/
[GetCode]
Menorque<
<seusaparacompararsiunelementoesmenorqueotro.Unacomparacin
usando<sloserVerdaderosielmiembroizquierdoesmenorqueel
derecho:
x<y
/*xesmenorquey*/
[GetCode]
Mayorque>
>seusaparacompararsiunelementoesmayorqueotro.Unacomparacin
usando>sloserverdaderosielmiembroizquierdoesmayorqueel
derecho:
x>y
/*xesmayorquey*/
[GetCode]
Menoroigual<=
<=seusaparacompararsiunelementoesmenoroigualqueotro.Una
comparacinusando<=sloserverdaderasielmiembroizquierdoesigual
omenorqueelderecho:
x<=y
/*xmenoroigualquey*/
[GetCode]
Mayoroigual>=
>=seusaparacompararsiunelementoesmayoroigualqueotro.Una
comparacinusando>=sloserverdaderasielelementoizquierdoes
mayoroigualqueelderecho:
x>=y
/*xesmayoroigualquey*/
[GetCode]
OperadoresLgicos
Losoperadoreslgicosseusancuandonecesitasdosomselementosenla
mismasentencia,ystospuedenserverdaderosofalsos.Sepuedenutilizar
troscomparadoreslgicos.
Y(&&)
Seusaparadeterminarsidosomselementossonverdaderos.SIalgunode
loselementosnoesverdadero,lasentenciaserfalsa.Paraquealgosea
verdadero,todosloselementosdebenserlo,paraqueseafalso,conqueuno
seafalso,lasentencialoser:
x<y&&y>5
/*xesmenorquey,eyesmayorque5*/
[GetCode]
O(||)
Seusaparadeterminarsialgunodelosdoselementosesverdadero.Conque
algunodeloselementosseaverdadero,lasentenciaserverdadera:
x<y||y>5
/*xesmenorquey,oyesmayorque5.Nota:Losdoselementospuedenser
verdaderos*/
(:sourcend:)
Negacion(!)
Seusaparadeterminarsialgonoesverdad.Sinosecumple,lasentencia
serverdadera:
x!=5
/*xnoesiguala5*/
[GetCode]
Constantes
LasconstantessonpalabrasqueArduinoutilizayquetienenvalores
predefinidos.Seusanparasimplificarlalecturadelcodigodetuprograma.
TrueandFalse(verdaderoyfalso)
TrueyFalsesonloquellamamosconstantesBooleanasydefinensialgolo
es,ono,anivellgico:
booleanmyBoolean=true
[GetCode]
CualquiernmeropuedeusarsecomooperadorBooleano.Porejemplo,200
sepuedeusarcomooperador,ysiunavariabletienesevalorylo
comparamoscon200,stonosdevolverVerdadero:
intmyNbrBoolean=200/*Asignamoselvaloralavariable*/
myNbrBoolean==200/*ComparamosmyNbrBooleancon200,devolveraVerdadero*/
[GetCode]
Tambinsepuedeescribirconunnmero
intmyNbrBoolean=1
[GetCode]
EnelprimerejemplonecesitamoscompararmiBooleanoconotroBooleano,y
enelsegundocasocomparamosmiOtroBooleanoconotroentero.
HighyLow(AltoyBajo)
HIGHyLOWseusanparadeterminarelestadodeunpindigital,queslo
tieneesosdosestados.HIGHquieredecirlomismoqueON(oquehay5
voltiosentupindigital).Eslomismoqueun1lgico.LOWquieredecirlo
mismoqueOFF(oquehay0voltiosentupin).Eslomismoqueun0lgico:
digitalWrite(ledPin,HIGH)
[GetCode]
Estosepuedeescribirtambinconnmeros:
digitalWrite(ledPin,1)
[GetCode]
InputyOutput(EntradaySalida)
INPUTyOUTPUTseusancuandodeclaramoselmododefuncionamientode
nuestropindigital,sloexistenesosdosmodos:
pinMode(12,OUTPUT)
[GetCode]
Siocurrealgoyquhacer
Supongamosqueeststrabajandoenunprototipoyestsmidiendouna
distancia.Cuandoalgoseacerqueaunadistanciadelobjeto,quieresque
ocurraalgo.AquescuandolasentenciaIfestil.
If(Si)
UnasentenciaIfescomountestqueArduinopuedehacerparadeterminarsi
algoesverdaderoofalso.UnasentenciaIfsigueestaestructura:
if(myVariable>myOtherVariable){
doSomething
}
[GetCode]
EnesteejemplopreguntamossimiVariableesmayorquemiOtraVariable.SI
esas,elprogramasaltardentrodelafuncinIfyejecutarelcdigo
(hazAlgo).Silacomparacinresultaserfalsa,elprogramasaltarestaparte
decdigo.Enesteejemplohemoscomparadovariables,perotambin
podramoscompararconstantes:
if(buttonPin==HIGH){
doSomething
}
[GetCode]
EnesteejemplopreguntamossibotonPinestHIGH,encuyocasoleeremos
elcdigohacerAlgo,delocontrarioomitirelcdigodelafuncin.
Noolvidesusar==cuandorealicescomparaciones.Siusassloun=no
compararsunelementoconotro,sinoqueasignarselvalordelsegundo
elementoalprimero.
if(buttonPin=HIGH){
doSomething
}
[GetCode]
ElejemploanteriormuestralamaneraincorrectadeescribirunasentenciaIf.
EnesteejemploestamosdefiniendobotonPincomoHIGHenlugarde
comprobarsibotonPinestenHIGH.ElcompiladordeArduinonoteavisar
deesteerror.
Ifelse(Si..sino..)
Ahorasupongamosquequiereshacerunacomprobacin,yquesabesqu
hacertantosisedalacondicin,comosino.Loquepuedeshaceresconectar
unasentenciaElse(sino...)atusentenciaIf:
if(myVariable>myOtherVariabel){
doSomething
}else{
doAnotherThing
}
[GetCode]
Elejemploanteriortrabajadelsiguientemodo:SimiVariableesmayorque
miOtraVariable,entoncesrealizahazAlgo.SimiVariablenoesmayorque
miOtraVariable,entoncesrealizahazOtraCosa.
Noolvidesusarotropardellaves({})paradelimitarelcomienzoyfinalde
lasentenciaElse.
PuedesaadirtantascondicionesElsecomoquierasdentrodeunasentencia
If,perosiquieresaadirmsdeuna,tienesqueescribirtodasellas,menosla
ltima,conunElseifseguidodeunanuevacondicin:
if(myVariable>myOtherVariable){
doSomething
}elseif(myVariable<100){
doAnotherThing
}else{
doTheLastThing
}
[GetCode]
Enelejemploanterior,simiVariablenoesmayorquemiOtraVariable,
entoncespreguntasimiVariableesmenorque100y,sinoescierto,entonces
realizahazUnaUltimaCosa.
For(Durante)
LosbuclesFotseusancuandoquieresrepetirunapartedelcdigounnmero
concretodeveces.ElbucleForsiempretienetresparametrosentre
parntesis,stosson:lainicializacindelcontador,lacondicinparaterminar
elbucleyelincrementodetucontador.:
for(inti=0i<200i++){
doSomething
}
[GetCode]
Enesteejemplo"inti=0"eslainicializacindelcontadorparaelbulceFor.
Aqudecimosquequeremosuncontadorconelnombre"i"ydetipo"int",y
quequeremosempezaracontardesde0.Cuandohayamosterminadode
definirlo,terminamosconunpuntoycoma,ypasamosalasegundaparte.
Definimoslacondicin,sii<200terminaremoselbucle.Laltimapartedefine
nuestroincrementoporcadapasadaenelbucle.i++incrementarel
contadorenunaunidadporcadapasada.Laprimeravez,elcontadorestara
0,lasiguienteestara1yassucesivamente.Cuandoialcanceelvalor200,
lacondicini<200yanosecumplir,porloquesaldremosdelbucley
continuaremosconelcdigoescritodespusdelallavedecierredelbucle
(}).
While(Mientras...)
UnbucleWhiledurarhastaquelacondicinentreparntesisseafalsa.Si
usasunbucleWhile,debesasegurartequelacondicindebepodervariarde
algnmodo(incrementandose,mediantecomparaciones..)denoserasel
buclenoterminaranunca:
while(myVariable<100){
doSomething
}
[GetCode]
EsteejemplocompruebasimiVariableesmenorque100.Siesas,entonces
comienzaelbucle,perosidentrodemibuclenohaynadaquehagacambiar
elvalordemiVariable,elbuclenoterminarnunca.
Enelsiguienteejemplohemosaadidolalecturadeunsensor:
while(myVariable<100){
doSomething
myVariable=readSensor
}
[GetCode]
Ahoracadavezqueseserepitaelbucle,primerorealizarhazAlgo,y
despusguardarenmiVariable,elvalorobtenidoenlalecturadelsensor.Si
elvaloralmacenadoenmiVariableessuperiora100,elbucleWhilese
detendrycontinuarleyendoelcdigoescritodespuesdelallavedecierre.
Aseguratede,siestsusandounsensorparasalirdelbucle,stepueda
proporcionarteunvalorquecumplatucondicindelbucle.
Lospinesdigitales
Thesepinsarethe0to13pinsonyourArduinoandtheyarecalleddigital
becausetheycanonlyhandleinformationas0or1.Ifyouwanttousea
digitalpin,thefirstthingyouhavetodoistosetthemodeofthepin.Thisis
alwaysdoneinthevoidsetup().
Estospinessonlospinesdel0al13detuArduinoysellamandigitales
porqueslopuedenmanejarvalores0o1.Siquieresusarunpindigital,lo
primeroquetienesquehaceresconfigurarelmododetrabajodelpin.stose
hacesiempreenelvoidsetup().
ThecommandforsettingthemodeofapinispinMode()andisusedas
follows:
pinMode(pin,OUTPUT)
ElcomandoparaconfigurarelmododetrabajoespinMode()yseusadel
siguientemodo:
pinMode(pin,OUTPUT)
Enesteejemplo"pin"esunavariableconelvalorcorrespondientealnmero
delpinautilizar.OUTPUTeselmododetrabajoquequeremosdefinir.Unpin
digitaltieneslodosmodos,OUTPUT(salida)eINPUT(entrada).Sideclaras
unpincomoOUTPUT,slopodrsusarloparaactivarlo,aplicando5Venel
pin,oparadesactivarlo,aplicando0Venelpin.Siconfiguraselpincomo
INPUT,slopodrsusarloparaleersihay5Vo0Venelpin:
digitalWrite(pin,valor)
ParaencenderoapagartupindigitaldebesusarelcomandodigitalWrite().
Entreparntesisdebesindicarqupinmodificar,yquvalordarle:
digitalWrite(pin,HIGH)
stopondrelpinensuestadoHIGH,proporcionando5Venl.Siescribes
LOWenlugardeHIGHapagarselpin,volviendoloadejaren0V.Tenen
cuentaquehastaquedefinaselestadodelpincomoHIGHsuvalorpor
defectoserLOW.SimirastuplacaArduino,versquelospinesdigitales0y
1estnmarcadoscomoRXyTX.Estospinesestnreservadosparala
comunicacinserieynodebenserusados,yaquepondrnaArduinoen
mododeesperahastaqueserecibaunaseal.
DigitalRead(pin)(Lecturadepindigital)
ElcomandodigitalRead()leeelestadodeunpinydevuelveHIGHsiesta5V
oLOWsihay0Venl:
digitalRead(pin)
Parapoderusarelvalordelestadoparaalgnfindebesguardarloenuna
variable:
myVariable=digitalRead(pin)
Siquieresrealizarunacomparacinpuedesescribirelcomandodirectamente
enlasentencia:
if(digitalRead(pin)==LOW){
doSomething
[GetCode]
AunqueLOWequivalesiemprea0Venunasalidadigital,enunaentrada
digitalcualquiervalorentre0Vy1.5VseconsiderarLOWenelcomando
digitalRead().Delmismomodotodoslosvaloresentre3.3Vy5vse
considerarncomounvalorHIGH.
Lospinesanalgicos
Lospinesanalgicosydigitalesfuncionandediferentemanera.Hemos
mencionadoquelospinesdigitalesslomanejaninformacinen1y0,loque
eslomismocomoALTO(HIGH)yBAJO(LOW)o0Vy5V.Sinembargo,enel
mundorealnomedimosslocerosyunosasArduinotieneseispines
especialesanalgicosquehacenunclculodelvoltajeenunrangocodificado
de0a1023.Lospinesanalgicosnodebenserdeclarados,suconfiguracin
deI/O,yaqueslosonutilizadoscomoentradas.
Analogread(pin)
Paraleerelvalordeunpinanalgicotienesqueusarelcomando
analogRead()yponerlareferenciadelpinquedeseasleer:
analogRead(pin)
Aligualqueconelpindigital,tienesqueguardarestevalorenunavariable
parapoderusarlo
myVariable=analogRead(pin)
Puedesusarelcomandodirectamenteparahacercomparaciones
if(analogRead(pin)>500){
doSomething
[GetCode]
Analogwrite(pin,value)
LospinesdigitalesslopuedeserHIGHyLOW,queeslomismoquetener5V
o0Venlospinesdigitales.Sinembargo,paralospinesdigitales3,5,6,9,10
y11tenemosunafuncinespecialllamadaanalogWrite().Conestafuncin
esposibleenviarunvalorpseudoanalgicoaestospinesdigitalesespeciales.
Estosedenominamodulacinporanchuradepulso(PWM,pulsewith
modulation):
analogWrite(pin,value)
Elvalordeesteejemplopuedeserdesde0a255.Siescribesun0,estosera
lomismoqueelponerenelpinLOW,y255eslomismoqueHIGH.Perocon
analogWrite()obtienes255pasosentreHIGHyLOW,asporejemplo:
analogWrite(pin,127)
Estoserasimilaraenviar2.5Valpindigital.Encomparacinconel
digitalWrite(),quepasade0Va5Venuninstante,conlaanalogWrite()
puedehacerunatransicinmslentade0Va5V.Tengaencuentaquela
analogWrite()slofuncionaenlospinesdigitalesmarcadasconPWM(3,5,6,
9,10y11)ynoenlospinesdeentradaanalgicadea0aa5.
Usingtime
Usandoeltiempo
TheArduinoisasmallbutpowerfulcomputerandcancarryout1,000,000
calculationspersecond.Whenyouaremakingprototypesyoumaynotwant
toexecuteatthislightningspeed.Thenyouregoingtohavetotellthe
Arduinotoslowdowneverynowandthen.
Arduinoesunapequeacomputadora,peropoderosoypuederealizar
1.000.000operacionesporsegundo.Cuandovayaahacerprototiposqueno
quieraejecutaraunavelocidadtanrpida.VasatenerquedecirleaArduino
queparedevezencuando.
Delay(retardo)
Thedelaycommandisusedtosetapauseinyourprogram.Thiscommand
countsinmillisecondsandyouenteryourdesiredpausetimewithinthe
parenthesesasinthefollowingexample:
delay(1000)
Thisdelaywillsetapauseinyourprogramofonesecond.
Estedelaypondrunapausaensuprogramadeunsegundo,
Countmilliseconds
Contarmilisegundos
Thiscommandwillreturnhowmanymillisecondshavepassedsincethe
Arduinostartedthecurrentlyrunningprogram.Tobeabletousethisvalue
youhavetosaveitinavariable:
Estecomandomillis()devolvercuantosmilisegundoshanpasadodesdeque
Arduinoinicilaejecucindelprograma.Parapoderutilizarestevalorhay
queguardarloenunavariable:
myVariable=millis()
Youcanuseitdirectlytomaketimecomparisons:
Puedeusarlodirectamenteparahacercomparacionesdetiempo:
if(myAlarmTime==millis()){
ringAlarm
}
[GetCode]
Comunicacinconotrosdispositivos
Parasercapazdecomunicarseconotrosdispositivoselectrnicosdebe
habilitarlospuertosdecomunicacindeArduino.Arduinopuedecomunicarse
conelordenadoryconotrosdispositivoselectrnicosqueutilizanelprotocolo
decomunicacinserie.
Lospinesdigitales0y1deArduinosereservanparacomunicacionesenserie
conotrosdispositivosydeberaevitarusarestosdospinesparaotrastareas,
yaquepuedeinterferirconelfuncionamientodesuprograma.
Serialbegin
ParapermitirlacomunicacindeArduinoseutilizaelcomandoSerial.begin().
Estecomandoseutilizasloenelvoidsetup().Dentrodelosparntesisse
introducelavelocidaddecomunicacindeseadaenbitsporsegundo,loque
tambinseconocecomobaudios,ylasvelocidadesdisponiblesson300,
1200,2400,4800,9600,14400,19200,28800,38400,57600o115200:
voidsetup(){
Serial.begin(9600)
}
[GetCode]
Estecdigoabrirelpuertoserieyponelavelocidaddecomunicacina9600
baudios.
Serialprintln
Estecomandovaaimprimirloqueponesdentrodelosparntesisyaadirun
finaldelnea.Paraimprimirnmerosenterostienequeponereltipodentro
delosparntesis:
Serial.println(12345)
Sinembargo,loscaracteresdeimpresinycadenadecaracteresdebeser
citado.Sideseaimprimirunsolocarcterusalascomillassimples:
Serial.println(C)
LalneadecdigoanteriorenviarelcarcterCatravsdelpuertoserie.Si
deseaimprimirunacadenadecaracteres,comomensajetienequeutilizarlas
doblescomillas
Serial.println(HellofromArduino)
Serialprint
ElSerial.print()trabajacomoelSerial.println()conlaexcepcin
queSerial.println()insertaunretornodecarroysaltaalasiguientelnea.Si
algoseenviaporelpuertoserieconSerial.println(1)elmensajesemuestra
enelmonitordelasiguientemanera:
1
1
1
1
ElavancedelneaaadidoporelSerial.println()eslomismoqueponeral
mismotiempounfinaldelineayempezarenunanueva.Siqueremos
enviarSerial.print(1)travsdelpuertoserieserecibiracomo:
1111111111111111111111111111111111111
Tengaencuentaquesiestcomunicandoseconotrosdispositivos
electrnicosasegresedeimprimirlosdatosenelformatocorrecto.Aveces,
elretornodecarroysaltodelneaaadidoporSerial.println()puedeinterferir
conlacomunicacin.Lainformacinsobreelprotocolodecomunicacin
adecuadoparalosdistintosdispositivoselectrnicossepuedenencontraren
lahojadedatosdeldispositivoacomunicar.
Casosespecialesdeimpresin
Avecessernecesarioenviarlainformacinendiferentesformatosy
entoncestienequeaadiresteformatoparasuimpresin:
Serial.println(message,format):
Losformatosdisponiblessondecimales,hexadecimal,octal,binarioybytes,y
seutilizancomoenlosejemplossiguientes:
Serial.print(b,DEC)
/*Escribe79comocdigoASCIIendecimalquees79*/
Serial.print(b,HEX)
/*Escribe79comocdigoASCIIenhexadecimalquees4F*/
Serial.print(b,OCT)
/*Escribe79comocdigoASCIIenoctalquees117*/
Serial.print(b,BIN)
/*Escribe79comocdigoASCIIenbinarioquees1001111*/
Serial.print(b,BYTE)
/*Escribe79comocdigoASCIIenbytesquees
O*/
[GetCode]
ElASCII(AmericanStandardCodeforInformationInterchange)de
codificacinesunaformaestndardecodificacindetextonumrico.Cuando
seescribeelnmeroensucdigo,noestenrealidadescribiendoelnmero,
perosielcarcterrepresentadolosnmeros,como"uno"eslapalabraque
representa1.