Vous êtes sur la page 1sur 28

Captulo9:EscribiendoProgramas

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.

Vous aimerez peut-être aussi