28
Capítulo 9: Escribiendo Programas Un programa en Arduino está hecho de código, escrito en un lenguaje de programación llamado C. Cuando escribimos un código es importante tener cuenta que Arduino no actúa como un ser humano, no razona. Si alguien pronuncia una palabra incorrecta probablemente entendamos el significado Arduino sin embargo no. Si tecleas incorrectamente un comando mientras escribes código en el IDE de Arduino, no va a entender lo que quieres hacer Otra cosa a tener en cuenta es que Arduino es lógico pero no racional. No sabe que quieres hacer, sólo hace lo que le digas hacer. Estructura Básica Cuando escribimos código en el IDE de Arduino usamos tres partes básicas la estructura del programa. declaración de variables setup() loop() Las funciones setup() y loop() son esenciales escribirlas para el funcionamiento del programa. A medida que tengas más confianza en la escritura de código para Arduino te darás cuenta que no es obligatorio para escribir código usar estos pasos. Sin embargo viene bien estructurar el programa para hacer fácil su revisión y ayuda a buscar errores en el código. siguiente código es un ejemplo de un programa sencillo que hace parpadear LED de la placa Arduino: int ledPin = 13; void setup(){ digitalWrite(ledPin,OUTPUT} void loop(){

Arduino Playground - OSW06.pdf

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

  • 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.