Upload
juan-carlos-roa
View
232
Download
5
Embed Size (px)
Citation preview
Captulo9:EscribiendoProgramasUnprogramaenArduinoesthechodecdigo,escritoenunlenguajedeprogramacinllamadoC.CuandoescribimosuncdigoesimportantetenerencuentaqueArduinonoactacomounserhumano,norazona.SialguienpronunciaunapalabraincorrectaprobablementeentendamoselsignificadoArduinosinembargono.SitecleasincorrectamenteuncomandomientrasescribescdigoenelIDEdeArduino,novaaentenderloquequiereshacer.
OtracosaatenerencuentaesqueArduinoeslgicoperonoracional.Nosabequequiereshacer,slohaceloqueledigashacer.
EstructuraBsicaCuandoescribimoscdigoenelIDEdeArduinousamostrespartesbsicasenlaestructuradelprograma.
declaracindevariables
setup()
loop()
Lasfuncionessetup()yloop()sonesencialesescribirlasparaelfuncionamientodelprograma.AmedidaquetengasmsconfianzaenlaescrituradecdigoparaArduinotedarscuentaquenoesobligatorioparaescribircdigousarestospasos.Sinembargovienebienestructurarelprogramaparahacerfcilsurevisinyayudaabuscarerroresenelcdigo.ElsiguientecdigoesunejemplodeunprogramasencilloquehaceparpadearelLEDdelaplacaArduino:
intledPin=13voidsetup(){digitalWrite(ledPin,OUTPUT)}voidloop(){digitalWrite(ledPin,HIGH)delay(1000)
digitalWrite(ledPin,LOW)delay(1000)}
[GetCode]
VariablesUnavariableesuncontenedorparaguardaralgndato.Digamosquequiereleerunsensordealgntipo.Estesensortedarunvalorenformatonumrico.Siquiereusarestevalorenotrapartedelprogramapuedeguadarestevalorenunavariable.Antesdealmacenarelvalornecesitadeclararlavariable,estosignificaqueledigasalprogramaquelavariableexisteyquetipodevariablees.
Tenemosqueponerunnombrealavariable.Elnombrepodrasercualquieraperoesunaideabuenadarasusvariablesnombresqueseanlgicos.CuandorevissuprogramaserfcildeterminarqutipodevalorsealmacenaenunavariablenombradatemSensor.Puedesermsdifcilrecordarcualeselcontenidoenvariablesconnombrescomobanana,peterosupercalifragilisticexpialidocious.MsexplicacionesenlaseccinTiposyDeclaracionesdeVariablesenlaspginas8082.
1. Referenciacruzadadentrodellibro."MsexplicacionesenlaseccinTiposyDeclaracionesdeVariablesenlaspginas8082."(puedenocuadrarconlamaquetacinenespaol).################################
Voidsetup
Arduinoloprimeroquehacecuandoarrancaesmirarlavoidsetup().steesunodelospasosesencialesdelfuncionamientodelprograma.Lavoidsetup()eslapartequeinicializalasconfiguracionesdelosdiferenteselementosdelprogramadeArduinoporejemplolaconfiguracindeunpinoestablecerlavelocidaddecomunicacin.Lavoidsetup()sloseejecutaunavezenelinicioynosevolveraejecutarhastaqueArduinoseapaguyvuelvaaarrancaro
seresetea.
Elsiguientecdigoesunejemplodeunavoidsetupqueponelaconfiguracindeunpincomosalida.
voidsetup(){pinMode(pin,OUTPUT)}
[GetCode]
Voidloop
Lavoidloop()eselsegundopasoesencialparaelfuncionamientodeunprograma.Aquesdondeseejecutanlasaccionesdesuprograma.Comosunombreindica,staparteseejecutaunayotravez.EnunprogramadeArduinotodoelcdigoseejecutalneaalnea.Despusdeejecutarlavoidsetup()enelarranquecontinuaconlavoidloop().
Entoncesempiezaahacertodoloqueestensucdigodesdeelcomienzohastaelfinaldelavoidloop().Cuandollegaalfinaldelavoidloop()simplementevuelveaempezarconloscambiosdelprograma.Elsiguientecdigoeslavoidloop()delejemplodelprincipiodelcaptulo:
voidloop(){digitalWrite(ledPin,HIGH)delay(1000)digitalWrite(ledPin,LOW)delay(1000)}
[GetCode]
Estavoidloop()empiezaconunalneadecdigoqueactivaelpincuyonmeroseindicaenelnombredelavariableledPin.Lasiguientelneadecdigoproduceunretardoydespusdesactivaelmismopinyacontinuacinrealizaunnuevoretardo.SiejecutamosestecdigoenArduinoconunLED
conectadoalpinconelnmeroindicadoenlavariableledPin,elLEDparpadearencendindoseyapagndoseconunsegundoderetardohastaapagarlaalimentacin.
Marcasdepuntuacin.Parntesisyllaves
Lasmarcasdepuntuacinseutilizanparadefinirelinicioyelfinaldeciertaspartesdelcdigo.HaydostiposdemarcasusadosenlaescrituradecdigoparaArduino.Losprimerossonlosparntesisizquierdoyderecho()ysonnormalmentellamadosentreparntesis.Estossoportesseutilizanparaescribirfuncionesdentrodenuestrosprogramas.Seutilizanparaintercambiodeunavariableenalgnotrolugardentrodenuestroprograma.
Tambinesposibletenerunafuncinconlosparntesisvacos,peroesnecesarioponerdespuselnombredelafuncinoArduinotendrunerrordecompilacin.Unejemplodefuncionesqueutilizanparntesisvacossonlavoidsetup()ylavoidloop().
Elsegundotiposonlasllaves{}.Estasseusanparaindicarelprincipioyfinaldeunafuncin.SinestasllavesArduinonosercapazdesaberdndeempiezayterminalafuncinyqueseconsideracomolasiguientepartedelcdigo.Unusocomndeestasllavessehaceenlafuncinvoidsetup().
voidsetup(){//Thecodeinthefunctiongoesinhere.}
[GetCode]
Puntoycoma
LospuntosycomassonunodeloselementosmsimportantesparaescribircdigoparaArduinoyunodelosquemsfcilmentenosolvidamos.Seusan
parasepararlasdiferenteslneasdecdigoensuprogramaeindicaaArduinodondeterminasucomando.Elsiguienteejemplosemuestracomosedeclaraunavariableconelusocorrectodelpuntoycoma.
intmyNumber=15
[GetCode]
ElpuntoycomaterminaelcomandoyhemosdeclaradounavariableenteraconelnombremyNumberyestavariabletendrelvalor15.SiteolvidasunpuntoycomaentucdigoelIDEdeArduinoresaltarlalneadecdigoindicandolafaltadepuntoycoma.
Comentariosdecdigo
Avecespuedesertilparaponernotasoescribircomentariosdentrodesucdigoparaunomismooparaotrapersona.SiseescribeeltextodentrodesuprogramaArduinopiensaqueesdecdigoeintentaejecutarloqueestescrito.SiloqueestescritoesalgoqueelArduinonoentiende,ledarunmensajedeerror.
HaydosmanerasdeescribirmensajesenelcdigoyocultarloaArduino.Laprimeradeellaseselusodeunadoblebarra//delantedecualquiermensaje.EstoocultaelmensajeaArduinoperodejalovisibleparalosprogramadores.Elsiguienteesunejemplodeunmensajeocultodentrodeloop():
voidloop(){digitalWrite(ledPin,HIGH)//turnstheledondelay(1000)//waitforsometimedigitalWrite(ledPin,LOW)//turnstheledoffdelay(1000)//waitabitmore}
[GetCode]
Sideseaocultarlosmensajesdemsdeunalneatienequeutilizar/*y*/.
Paramarcareliniciodeunmensajequeseoculta,seusa/*yparamarcarelfinaldelmensaje,useel/*.Estoocultartodoelmensaje.Elsiguientecdigoesunejemplodecmoocultarunbloquedetextodentrodeloop():
voidloop(){/*thiscodewillfirstturnaledonthenitwillwaitforsometimeafterthatitwillturntheledoffandthenwaitagain.*/digitalWrite(ledPin,HIGH)delay(1000)digitalWrite(ledPin,LOW)delay(1000)}
[GetCode]
Tiposdevariablesydeclaraciones
Daraunavariableunvalorestambinconocidocomodeclararunavariable.Declararunavariableesdefiniruntipo,nombreyvalorparalamisma.
intmyNumber=14
[GetCode]
Enelejemploanteriorel"int"eseltipodevariable,"miNumero"eselnombrey14eselvalor.Tenencuentaquesiempretienesquedarleunvaloralavariablecuandoladeclaras.Suponemosquequieresguardarunvalordetusensorentuprograma,peronopuedesleerelvalorcuandodeclaraslavariablefueradelvoidloop(),eneliniciodelprograma.Tledasunvalortemporal0alavariablecuandoladeclarasalinicio,comoenelsiguienteejemplo:
intmySensor=0
[GetCode]
Haydosposiblesmanerasdedeclararunavariable.Siladeclarasalprincipiodetuprograma,antesdelvoidsetup()diremosqueesunavariableglobal.
Unavariableglobalesaccesibledesdecualquierpartedetuprograma.Porotroladotenemoslasvariableslocales,queslopuedenusarsedentrodelafuncinenlaquesedeclararon.ElsiguienteejemplomuestraunavariablegloballlamadaledPin:
intledPin=13voidsetup(){digitalWrite(ledPin,OUTPUT)}voidloop(){digitalWrite(ledPin,HIGH)delay(1000)digitalWrite(ledPin,LOW)delay(1000)}
[GetCode]
LavariableledPinesvisibleentodoelprogramaycuandoesusadadentrodevoidloop()serreconocidacomounavariabledetipoentero(integer)conelvalor13.Sinembargo,siescribeselmismoprogramadelasiguientemanera:
voidsetup(){intledPin=13digitalWrite(ledPin,OUTPUT)}voidloop(){digitalWrite(ledPin,HIGH)delay(1000)digitalWrite(ledPin,LOW)delay(1000)}
[GetCode]
EntonceselprogramatedarunerrordiciendotequenopuedeencontrarlavariableledPinqueintentasusardentrodevoidloop(),yaqueestdeclaradadentro(yslodentro)delafuncinvoidsetup()
Enalgunosprogramaspuedesertilusarvariableslocales,peroenlamayoradeloscasosesmejordeclararlascomovariablesglobalesy,portanto,declararlasantesdelvoidsetup()
Unavezquetienesunavariableconunvalor,tupuedesasignarleotrovalor,perotenencuentaqueborrarselqueexistapreviamente.Supongamosque
tenemosunavariablellamadamiNumeroylahemosdeclaradocomo:
intmyNumber=14
[GetCode]
Sialolargodetuprogramaquieresdarleotrovalora"myNumero",loharsas:
myNumber=56
[GetCode]
Estoborrarelnmero14delavariable"myNumero"yloreemplazarporelnmero56.Cuandoreasignamosvaloreslasvariables,notenemosqueaadir"int"alcomienzodelalineadecdigocomohicimoscuandoladeclaramos.stoesporquenosotrosslodeclaramoseltipodevariableunavezenelprograma.Esposiblecambiarelvalordelavariable,peronosutipo.
Tipos
Hastaahorahemosestadohablandode"int",queesellaabreviaturadenmeroentero(eltipomscomndevariablesenprogramasdeArduino).Lasvariablescomunesson:
Int:Losenterosseusanparaguardardatosnumricossinpuntosdecimales.Almacenanunvalorde16bitsenelrangode32767a32767.Estoquieredecirqueunentero(int)ocupa16bitsenlamemoriadeArduinoypuedesercualquiernmeroenteroentre32767y32767.
intmyNumber=1234
[GetCode]
Long:Enmuchoscasoseltamaodeunenteronosvaldrpero,enotros,necesitaremosalmacenarvariablesmsgrandesqueeltamaoquenospermiteeltipo"int",paraellousaremoseltipo"long".Eltipo"long"extiendeelrangodevaloresenteros(sindecimales)aun
valorde32bits,estoesunrangode2147483647a2147483647.Igualmenteestoquieredecirqueunnmero"long"ocupar32bitsenlamemoriadeArduinoynospermitirusarvaloresentre2147483647y2147483647.
longmyBigNumber=90000
[GetCode]
Byte:ParaahorrarespacioenlamemoriadeArduino,estilalmacenarlasvariablescomobytes.Unbyteesunnmeroenterode8bitsconunrangode0a255.Conunbyteocuparemos8bitsdelamemoriadeArduinoypodremosrepresentarcualquiernmeroenteroentre0y255.
bytemySmallNumber=150
[GetCode]
Float:Elnicotipodedatosquepuedeguardarnmeroscondecimaleses"float".Floattienemayorresolucinquelosenteros(int,long,byte)yseguardancomounvalorde32bitsenelrangodesde3.4028235E+38a3.4028235E+38.Estoquieredecirquepuedesguardarunnmerodecimalperosloeneserango.Losnmerosdecimales(float)ocupanmuchamemoriadeArduino.Usardecimalesesmuchomslentoqueusarenteros,puesArduinonecesitamstiempopararealizarclculosconstos.
floatmydecimalNumber=2.33
[GetCode]
Arrays(Matrices):Avecespuedesertilguardarunacoleccindevalores,entoncestendremosqueutilizarunamatriz.Todoslosvaloresalmacenadosenunamatrizseguardarnconunnmerondice,paraaccederacualquiervalorloharsreferenciandosunmerondice.Lasmatricessedeclarandeigualmodoquelasvariables(coneltipo,elnombreylosvalores).Elsiguienteejemplomuestracomodeclararunamatrizdeenterosconseisvaloresdistintos:
intmyArray[]={1,2,3,4,5,6}
[GetCode]
Tenencuentaquelasmatricesempiezanacontardesde0.Estosignificaquelaprimeraposicindelamatrizes0.Enelejemploanterior,elnmero1estguardadoenlaprimeraposicindelamatriz,portanto,siqueremosutilizarlo
loharemosdelsiguientemodo:
myNumber=myArray[0]
[GetCode]
Estoalmacenarelvalordelaprimeraposicindelamatriz(elvalor1),ennuestravariablemiNumero.Porotrolado,podemosalmacenarvaloresenlamatrizhaciendoreferenciaalaposicindelnmeroquenosinteresa:
myArray[0]=23
[GetCode]
Estoguardarelnmero23enlaposicin0delamatriz(dondeantesestabaelvalor1).
Sisabesquevasausarunacantidaddenmerosylosquieresalmacenarenunamatriz,peronosabesquvaloresvanaser,puedesdeclararlavariablereservandoelnmerodeposicionesquequieras,delsiguientemodo:
intmyArray[5]
[GetCode]
Estocrearunamatrizde5posiciones,donde4serlaltima(Recordemosqueempiezaacontarde0).Nointentesalmacenardatosenlaquintaposicin,estaposicinserincorrecta,peroArduinonoteavisaralahoradecomprobarelcdigo.
Haciendoclculos
ComoArduinoesunpequeoordenador,puedehaceroperacionesmatemticas.Puederealizarlasoperacionesmatemticasmshabituales
comoson,lasuma,laresta,lamultiplicacinyladivisin.
myValue=1+1/*estoguardaraelnmero2enmyValue*/myValue=42/*estoguardaraelnmero2enmyValue*/myValue=3*4/*estoguardaraelnmero12enmyValue*/myValue=6/2/*estoguardaraelnmero3enmyValue*/
[GetCode]
Siestsusandoenterospararealizarlasoperacionesmatemticasnopodrsobtenerdecimales,"float"eselnicotipodevariablequepuedeobtenerlos.Enotraspalabras,siquieresdividir10entre6,dar1comoresultado.HacerclculosdemasiadolargospuedeproducirundesbordamientoenlamemoriadeArduino,yaquetodotipodevariabletieneuntamaomximo.RealizarclculosconnmerosgrandesralentizarelArduino.
Puedesrealizarclculosentrevariables,acontinuacintieneslosdiferentesclculosquesepuedenaplicaralasvariables:
x++/*incrementaraen1elvalordex.Eslomismoqueescribirx=x+1*/x/*decrementaraen1elvalordex.Eslomismoqueescribirx=x1*/x+=y/*incrementaraelvalordeyalvalordex.Eslomismoqueescribirx=x+y*/x=y/*decrementaraelvalordeyalvalordex.Eslomismoqueescribirx=xy*/x*=y/*multiplicaraxpory.Eslomismoqueescribirx=x*y*/x/=y/*dividiraxentrey.Eslomismoqueescribirx=x/y*/
[GetCode]
Mapeo
Supongamosquetienesunsensorquesoloproporcionavaloresentre50y200,yquetnecesitasunrangodesde0a500.Lafuncin"map"puedesertil.stafuncinremapeaunrangodevaloresaotrorangodevalores.Digamos,haceunareglade3:
myVariable=map(mySensor,50,200,0,500)/*valorSensor,valorMinSensor,valorMaxSensor,minimoDeseado,maximoDeseado*/
[GetCode]
Enelejemploanteriorestamosusandolafuncin"map"paraguardarunvalorenmiVariable.ElvalorprovienedemiValoryel50yel200marcanlosvaloresmnimoymximodenuestrosensor.El0yel500eselrangodeseado.Lafuncin"map"asignarelvalorobtenido(dentrodelrangodelsensor,50200)alrangodeseado(0500).Observequesiquieresusarlafuncin"map"debesconocerelrangoquequieres"mapear".Paraencontrarmsinformacinsobrecmoleervaloresvayaalaspginas98101.
1. Referenciacruzadadentrodellibro."vayaalaspginas98101",puedenocuadrarconlamaquetacinenespaol.################################
Random(max)(Aleatorio(mximo))
Elcomando"random"devolverunvaloraleatorioenelrangocomprendidoentre0yelvalorquepongasentreparntesis.Parapoderusaresevalortienesqueguardarloenunavariable.
myVariable=random(5)
[GetCode]
stoguardarunnmeroaleatorioenmiVariable,dentrodelrangode0a4.Tambinpuedesusarelcomando"random"directamentemientrashacescomparaciones:
if(3==random(5)){
doSomething
}
[GetCode]
Elcomando"random"slodevolverunvalorentre0yelmximoestablecido,nuncadevolveresemximo.
Random(min,max)
Siquieresunnmeroaleatoriocomprendidoenunrangoquecomienceenunvalordistintode0,debesespecificardichomnimo:
myVariable=random(200,300)
[GetCode]
Comparacioneslgicas
Siquieresrealizarcomparacionesentusprogramasdebesusaralgunodeestoscomparadores.Estascomparacionessepuedenrealizarentrevariablesoconconstantes,obteniendosiemprevaloresVerdaderooFalso.
Iguala==
==esusadoparacompararsiunelementoesigualaotro.Unacomparacinusando==sloserverdaderosiambosmiembrosdelaigualdadsonidnticos:
x==y/*xesigualay*/
[GetCode]
Distintode!=
'!=seusaparacomprobarsiunelementoesdistintodeotro.Unacomparacinusando!=sloserVerdaderosiunmiembroesdistintodelotro:
x!=y/*xesdistintodey*/
[GetCode]
Menorquey/*xesmayorquey*/
[GetCode]
Menoroigual=y/*xesmayoroigualquey*/
[GetCode]
OperadoresLgicos
Losoperadoreslgicosseusancuandonecesitasdosomselementosenlamismasentencia,ystospuedenserverdaderosofalsos.Sepuedenutilizartroscomparadoreslgicos.
Y(&&)
Seusaparadeterminarsidosomselementossonverdaderos.SIalgunodeloselementosnoesverdadero,lasentenciaserfalsa.Paraquealgoseaverdadero,todosloselementosdebenserlo,paraqueseafalso,conqueunoseafalso,lasentencialoser:
x5/*xesmenorquey,eyesmayorque5*/
[GetCode]
O(||)
Seusaparadeterminarsialgunodelosdoselementosesverdadero.Conquealgunodeloselementosseaverdadero,lasentenciaserverdadera:
x5
/*xesmenorquey,oyesmayorque5.Nota:Losdoselementospuedenser verdaderos*/
(:sourcend:)
Negacion(!)
Seusaparadeterminarsialgonoesverdad.Sinosecumple,lasentenciaserverdadera:
x!=5/*xnoesiguala5*/
[GetCode]
Constantes
LasconstantessonpalabrasqueArduinoutilizayquetienenvalorespredefinidos.Seusanparasimplificarlalecturadelcodigodetuprograma.
TrueandFalse(verdaderoyfalso)
TrueyFalsesonloquellamamosconstantesBooleanasydefinensialgoloes,ono,anivellgico:
booleanmyBoolean=true
[GetCode]
CualquiernmeropuedeusarsecomooperadorBooleano.Porejemplo,200sepuedeusarcomooperador,ysiunavariabletienesevalorylocomparamoscon200,stonosdevolverVerdadero:
intmyNbrBoolean=200/*Asignamoselvaloralavariable*/myNbrBoolean==200/*ComparamosmyNbrBooleancon200,devolveraVerdadero*/
[GetCode]
Tambinsepuedeescribirconunnmero
intmyNbrBoolean=1
[GetCode]
EnelprimerejemplonecesitamoscompararmiBooleanoconotroBooleano,yenelsegundocasocomparamosmiOtroBooleanoconotroentero.
HighyLow(AltoyBajo)
HIGHyLOWseusanparadeterminarelestadodeunpindigital,queslo
tieneesosdosestados.HIGHquieredecirlomismoqueON(oquehay5voltiosentupindigital).Eslomismoqueun1lgico.LOWquieredecirlomismoqueOFF(oquehay0voltiosentupin).Eslomismoqueun0lgico:
digitalWrite(ledPin,HIGH)
[GetCode]
Estosepuedeescribirtambinconnmeros:
digitalWrite(ledPin,1)
[GetCode]
InputyOutput(EntradaySalida)
INPUTyOUTPUTseusancuandodeclaramoselmododefuncionamientodenuestropindigital,sloexistenesosdosmodos:
pinMode(12,OUTPUT)
[GetCode]
Siocurrealgoyquhacer
Supongamosqueeststrabajandoenunprototipoyestsmidiendounadistancia.Cuandoalgoseacerqueaunadistanciadelobjeto,quieresqueocurraalgo.AquescuandolasentenciaIfestil.
If(Si)
UnasentenciaIfescomountestqueArduinopuedehacerparadeterminarsialgoesverdaderoofalso.UnasentenciaIfsigueestaestructura:
if(myVariable>myOtherVariable){doSomething}
[GetCode]
EnesteejemplopreguntamossimiVariableesmayorquemiOtraVariable.SIesas,elprogramasaltardentrodelafuncinIfyejecutarelcdigo(hazAlgo).Silacomparacinresultaserfalsa,elprogramasaltarestapartedecdigo.Enesteejemplohemoscomparadovariables,perotambinpodramoscompararconstantes:
if(buttonPin==HIGH){doSomething}
[GetCode]
EnesteejemplopreguntamossibotonPinestHIGH,encuyocasoleeremoselcdigohacerAlgo,delocontrarioomitirelcdigodelafuncin.
Noolvidesusar==cuandorealicescomparaciones.Siusassloun=nocompararsunelementoconotro,sinoqueasignarselvalordelsegundoelementoalprimero.
if(buttonPin=HIGH){doSomething}
[GetCode]
ElejemploanteriormuestralamaneraincorrectadeescribirunasentenciaIf.EnesteejemploestamosdefiniendobotonPincomoHIGHenlugardecomprobarsibotonPinestenHIGH.ElcompiladordeArduinonoteavisardeesteerror.
Ifelse(Si..sino..)
Ahorasupongamosquequiereshacerunacomprobacin,yquesabesquhacertantosisedalacondicin,comosino.LoquepuedeshaceresconectarunasentenciaElse(sino...)atusentenciaIf:
if(myVariable>myOtherVariabel){
doSomething}else{doAnotherThing}
[GetCode]
Elejemploanteriortrabajadelsiguientemodo:SimiVariableesmayorquemiOtraVariable,entoncesrealizahazAlgo.SimiVariablenoesmayorquemiOtraVariable,entoncesrealizahazOtraCosa.
Noolvidesusarotropardellaves({})paradelimitarelcomienzoyfinaldelasentenciaElse.
PuedesaadirtantascondicionesElsecomoquierasdentrodeunasentenciaIf,perosiquieresaadirmsdeuna,tienesqueescribirtodasellas,menoslaltima,conunElseifseguidodeunanuevacondicin:
if(myVariable>myOtherVariable){doSomething}elseif(myVariable
doSomething}
[GetCode]
Enesteejemplo"inti=0"eslainicializacindelcontadorparaelbulceFor.Aqudecimosquequeremosuncontadorconelnombre"i"ydetipo"int",yquequeremosempezaracontardesde0.Cuandohayamosterminadodedefinirlo,terminamosconunpuntoycoma,ypasamosalasegundaparte.Definimoslacondicin,sii
pinMode(pin,OUTPUT)
Enesteejemplo"pin"esunavariableconelvalorcorrespondientealnmerodelpinautilizar.OUTPUTeselmododetrabajoquequeremosdefinir.Unpindigitaltieneslodosmodos,OUTPUT(salida)eINPUT(entrada).SideclarasunpincomoOUTPUT,slopodrsusarloparaactivarlo,aplicando5Venelpin,oparadesactivarlo,aplicando0Venelpin.SiconfiguraselpincomoINPUT,slopodrsusarloparaleersihay5Vo0Venelpin:
digitalWrite(pin,valor)
ParaencenderoapagartupindigitaldebesusarelcomandodigitalWrite().Entreparntesisdebesindicarqupinmodificar,yquvalordarle:
digitalWrite(pin,HIGH)
stopondrelpinensuestadoHIGH,proporcionando5Venl.SiescribesLOWenlugardeHIGHapagarselpin,volviendoloadejaren0V.TenencuentaquehastaquedefinaselestadodelpincomoHIGHsuvalorpordefectoserLOW.SimirastuplacaArduino,versquelospinesdigitales0y1estnmarcadoscomoRXyTX.Estospinesestnreservadosparalacomunicacinserieynodebenserusados,yaquepondrnaArduinoenmododeesperahastaqueserecibaunaseal.
DigitalRead(pin)(Lecturadepindigital)
ElcomandodigitalRead()leeelestadodeunpinydevuelveHIGHsiesta5VoLOWsihay0Venl:
digitalRead(pin)
Parapoderusarelvalordelestadoparaalgnfindebesguardarloenunavariable:
myVariable=digitalRead(pin)
Siquieresrealizarunacomparacinpuedesescribirelcomandodirectamenteenlasentencia:
if(digitalRead(pin)==LOW){doSomething}
[GetCode]
AunqueLOWequivalesiemprea0Venunasalidadigital,enunaentradadigitalcualquiervalorentre0Vy1.5VseconsiderarLOWenelcomandodigitalRead().Delmismomodotodoslosvaloresentre3.3Vy5vseconsiderarncomounvalorHIGH.
Lospinesanalgicos
Lospinesanalgicosydigitalesfuncionandediferentemanera.Hemosmencionadoquelospinesdigitalesslomanejaninformacinen1y0,loqueeslomismocomoALTO(HIGH)yBAJO(LOW)o0Vy5V.Sinembargo,enelmundorealnomedimosslocerosyunosasArduinotieneseispinesespecialesanalgicosquehacenunclculodelvoltajeenunrangocodificadode0a1023.Lospinesanalgicosnodebenserdeclarados,suconfiguracindeI/O,yaqueslosonutilizadoscomoentradas.
Analogread(pin)
ParaleerelvalordeunpinanalgicotienesqueusarelcomandoanalogRead()yponerlareferenciadelpinquedeseasleer:
analogRead(pin)
Aligualqueconelpindigital,tienesqueguardarestevalorenunavariableparapoderusarlo
myVariable=analogRead(pin)
Puedesusarelcomandodirectamenteparahacercomparaciones
if(analogRead(pin)>500){doSomething}
[GetCode]
Analogwrite(pin,value)
LospinesdigitalesslopuedeserHIGHyLOW,queeslomismoquetener5Vo0Venlospinesdigitales.Sinembargo,paralospinesdigitales3,5,6,9,10y11tenemosunafuncinespecialllamadaanalogWrite().Conestafuncinesposibleenviarunvalorpseudoanalgicoaestospinesdigitalesespeciales.Estosedenominamodulacinporanchuradepulso(PWM,pulsewithmodulation):
analogWrite(pin,value)
Elvalordeesteejemplopuedeserdesde0a255.Siescribesun0,estoseralomismoqueelponerenelpinLOW,y255eslomismoqueHIGH.PeroconanalogWrite()obtienes255pasosentreHIGHyLOW,asporejemplo:
analogWrite(pin,127)
Estoserasimilaraenviar2.5Valpindigital.EncomparacinconeldigitalWrite(),quepasade0Va5Venuninstante,conlaanalogWrite()puedehacerunatransicinmslentade0Va5V.TengaencuentaquelaanalogWrite()slofuncionaenlospinesdigitalesmarcadasconPWM(3,5,6,9,10y11)ynoenlospinesdeentradaanalgicadea0aa5.
Usingtime
Usandoeltiempo
TheArduinoisasmallbutpowerfulcomputerandcancarryout1,000,000calculationspersecond.Whenyouaremakingprototypesyoumaynotwanttoexecuteatthislightningspeed.ThenyouregoingtohavetotelltheArduinotoslowdowneverynowandthen.
Arduinoesunapequeacomputadora,peropoderosoypuederealizar1.000.000operacionesporsegundo.Cuandovayaahacerprototiposquenoquieraejecutaraunavelocidadtanrpida.VasatenerquedecirleaArduinoqueparedevezencuando.
Delay(retardo)
Thedelaycommandisusedtosetapauseinyourprogram.Thiscommandcountsinmillisecondsandyouenteryourdesiredpausetimewithintheparenthesesasinthefollowingexample:
delay(1000)
Thisdelaywillsetapauseinyourprogramofonesecond.
Estedelaypondrunapausaensuprogramadeunsegundo,
Countmilliseconds
Contarmilisegundos
ThiscommandwillreturnhowmanymillisecondshavepassedsincetheArduinostartedthecurrentlyrunningprogram.Tobeabletousethisvalueyouhavetosaveitinavariable:
Estecomandomillis()devolvercuantosmilisegundoshanpasadodesdequeArduinoinicilaejecucindelprograma.Parapoderutilizarestevalorhayqueguardarloenunavariable:
myVariable=millis()
Youcanuseitdirectlytomaketimecomparisons:
Puedeusarlodirectamenteparahacercomparacionesdetiempo:
if(myAlarmTime==millis()){ringAlarm}
[GetCode]
Comunicacinconotrosdispositivos
ParasercapazdecomunicarseconotrosdispositivoselectrnicosdebehabilitarlospuertosdecomunicacindeArduino.Arduinopuedecomunicarseconelordenadoryconotrosdispositivoselectrnicosqueutilizanelprotocolodecomunicacinserie.
Lospinesdigitales0y1deArduinosereservanparacomunicacionesenserieconotrosdispositivosydeberaevitarusarestosdospinesparaotrastareas,yaquepuedeinterferirconelfuncionamientodesuprograma.
Serialbegin
ParapermitirlacomunicacindeArduinoseutilizaelcomandoSerial.begin().Estecomandoseutilizasloenelvoidsetup().Dentrodelosparntesisseintroducelavelocidaddecomunicacindeseadaenbitsporsegundo,loquetambinseconocecomobaudios,ylasvelocidadesdisponiblesson300,1200,2400,4800,9600,14400,19200,28800,38400,57600o115200:
voidsetup(){Serial.begin(9600)}
[GetCode]
Estecdigoabrirelpuertoserieyponelavelocidaddecomunicacina9600
baudios.
Serialprintln
Estecomandovaaimprimirloqueponesdentrodelosparntesisyaadirunfinaldelnea.Paraimprimirnmerosenterostienequeponereltipodentrodelosparntesis:
Serial.println(12345)
Sinembargo,loscaracteresdeimpresinycadenadecaracteresdebesercitado.Sideseaimprimirunsolocarcterusalascomillassimples:
Serial.println(C)
LalneadecdigoanteriorenviarelcarcterCatravsdelpuertoserie.Sideseaimprimirunacadenadecaracteres,comomensajetienequeutilizarlasdoblescomillas
Serial.println(HellofromArduino)
Serialprint
ElSerial.print()trabajacomoelSerial.println()conlaexcepcinqueSerial.println()insertaunretornodecarroysaltaalasiguientelnea.SialgoseenviaporelpuertoserieconSerial.println(1)elmensajesemuestraenelmonitordelasiguientemanera:
1111
ElavancedelneaaadidoporelSerial.println()eslomismoqueponeralmismotiempounfinaldelineayempezarenunanueva.SiqueremosenviarSerial.print(1)travsdelpuertoserieserecibiracomo:
1111111111111111111111111111111111111
Tengaencuentaquesiestcomunicandoseconotrosdispositivoselectrnicosasegresedeimprimirlosdatosenelformatocorrecto.Aveces,elretornodecarroysaltodelneaaadidoporSerial.println()puedeinterferirconlacomunicacin.Lainformacinsobreelprotocolodecomunicacinadecuadoparalosdistintosdispositivoselectrnicossepuedenencontrarenlahojadedatosdeldispositivoacomunicar.
Casosespecialesdeimpresin
Avecessernecesarioenviarlainformacinendiferentesformatosyentoncestienequeaadiresteformatoparasuimpresin:
Serial.println(message,format):
Losformatosdisponiblessondecimales,hexadecimal,octal,binarioybytes,yseutilizancomoenlosejemplossiguientes:
Serial.print(b,DEC)/*Escribe79comocdigoASCIIendecimalquees79*/Serial.print(b,HEX)/*Escribe79comocdigoASCIIenhexadecimalquees4F*/Serial.print(b,OCT)/*Escribe79comocdigoASCIIenoctalquees117*/Serial.print(b,BIN)/*Escribe79comocdigoASCIIenbinarioquees1001111*/Serial.print(b,BYTE)/*Escribe79comocdigoASCIIenbytesqueesO*/
[GetCode]
ElASCII(AmericanStandardCodeforInformationInterchange)decodificacinesunaformaestndardecodificacindetextonumrico.Cuandoseescribeelnmeroensucdigo,noestenrealidadescribiendoelnmero,perosielcarcterrepresentadolosnmeros,como"uno"eslapalabraquerepresenta1.