Arduino Playground - OSW06.pdf

Post on 30-Sep-2015

235 views 5 download

Transcript of Arduino Playground - OSW06.pdf

  • 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

  • while(myVariable
  • 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.