La Nueva Librería Time en Arduino

Embed Size (px)

Citation preview

  • 7/25/2019 La Nueva Librera Time en Arduino

    1/12

    LA NUEVA LIBRERA TIME ENARDUINOMidiendo y sincronizando el tiempo

    HomeLa Nueva Librera Time En Arduino

    OBJETIVO

    .

    o Mostrar la necesidad de gestionar un calendario con fecha y hora.

    o Presentar la nueva librera Arduino Time.

    o Funciones bsicas y ti!os !ro!ios.

    o La necesidad de la sincroni"aci#n.

    MATERIAL RE!UERIDO"

    Arduino UNO o equivalente.

    LA MEDI#I$N DEL TIEM%O

    La medida del tiem!o e$acto es una de esas maravillas de la tecnologa moderna a la %ue no

    !restamos atenci#n& y %ue si le dedicis una b's%ueda en (nternet os sor!render !or el nivel

    de !recisi#n y !recio %ue se ha alcan"ado.

    Pero dis!oner de un relo) ra"onablemente !reciso es un lu)o& %ue solamente hace alrededor de

    *+, a-os %ue dis!onemos / solo !ara ricos0. La democrati"aci#n de la medida del tiem!o es

    bastante ms reciente.

    http://www.prometec.net/http://www.prometec.net/http://www.prometec.net/categoria-producto/arduinos/http://www.prometec.net/categoria-producto/arduinos/http://www.prometec.net/
  • 7/25/2019 La Nueva Librera Time en Arduino

    2/12

    1esde la antig2edad se han utili"ado cle!sidras de agua y arena !ara medir el tiem!o& !ero la

    verdad es %ue eran un asco Haca falta un esclavo para rellenar el reloj de agua o arena

    peridicamente0. /a en la edad media a!arecen los !rimeros relo)es mecnicos en Euro!a !ara

    cam!anarios& nada de llevar uno en el bolsillo& !ues daban las horas en cam!anas de 3

    toneladas.

    El !rimer sistema fiable& !ara medir el tiem!o naci# con el relo) de esca!e en el siglo 45(((& !or

    un concurso de la marina inglesa& %ue necesitaba un sistema de conocer la longitud a la %ue se

    encontraban sus barcos al e$!andir el im!erio britnico !or el Pacifico. 6u soluci#n fue un factor

    decisivo en la e$!ansi#n de su im!erio en los dos siglos !osteriores

    La latitud era mucho menos problemtica y se resolva con un sextante, pero la

    longitud era un tema peliagudo para los marinos de todos los tiempos previos.

    untos sabras determinar la longitud aproximada a la !ue os encontris usando

    vuestro reloj de pulsera "# el i$hone, pero sin internet, claro%&

    El siglo 4(4 tra)o relo)es ra"onablemente !recisos y de bolsillo& mecnicos claro y !robablemente

    aun %uede alguno !or vuestras casas& del abuelo !or e)em!lo& entre las )oyas y reli%uias

    familiares.

    Pero cuando de verdad em!e"aron los relo)es a ser !recisos y al alcance de todos& fue con el

    relo) digital de cuar"o y eso fueron los a-os 7,& y eran como lo defini# un relo)ero de los de

    antes& relo)es en los %ue lo 'nico %ue se movan eran los n'meros.

    El cuar"o fue la base de osciladores con una !recisi#n desconocida hasta entonces y aun hoy

    cual%uier relo) de !ulsera normal llevara uno de estos !e%ue-os cristales de cuar"o como

    cora"#n.

    8omo ya di)imos en la sesi#n sobre los "umbadores& Arduino incor!ora un cristal !ie"oel9ctrico

    como base de tiem!os& %ue bate a *:Mh"& es decir *: millones de !ulsos !or segundo. / la

    !recisi#n %u9 !odemos es!erar es !oco ms o menos una deriva menor de ,&+ segundos !or

    da y con una estabilidad e$celente frente a los cambios de tem!eratura El coco de los relo)esmecnicos0

    Todo este !ega)oso !roleg#meno ;no se va haciendo mayor0& viene a cuenta de %ue ms antes

    %ue des!u9s& necesitaras controlar el tiem!o en tu Arduino.

    Hasta ahora hemos visto algunas instrucciones muy bsicas como delay 0& millis 0 y micros 0

    etc. Estas instrucciones son muy 'tiles !ara controlar tiem!os muy cortos& !ero !ronto sentirs la

    necesidad de medir el tiem!o en minutos& horas& das y !robablemente meses y a-os.

    http://www.prometec.net/buzzers/http://www.prometec.net/buzzers/
  • 7/25/2019 La Nueva Librera Time en Arduino

    3/12

    ?ueno de!ende mucho del ti!o de !royectos %ue hagas. Pero imagnate !or e)em!lo

    un data logger @ registro de eventos0 en el %ue tengas un Arduino conectado a una ma%uina

    cual%uiera su!ervisando sus variables& %ue !uede ser las revoluciones !or minuto& sus !icos de

    tensi#n o intensidad o sim!lemente si est encendida o !arada.

    No hablamos Aun0 de c#mo medir estas cosas& sino sencillamente guardar registro de los

    valores& !ara su estudio !osterior. (magnate %ue %uieres tu factura energ9tica y saber

    e$actamente cundo consumes y cuanto.

    Hay infinidad de casos en los %ue %uieres monitori"ar un sistema cual%uiera y %uerrs guardar

    registro de los valores y acom!a-arlos con un sello de tiem!o& !ara des!u9s hacer graficas o

    !asarlo !or un !rograma tuyo.

    8olocar el sello tem!oral a tus datos es un im!erativo.

    / !or eso& !or%ue no somos los !rimeros en tener este !roblema& ya e$isten soluciones Bracias

    a 1ios0. En esta sesi#n vamos a !resentar la nueva librera de Arduino Time& ver c#mo se

    mane)a y como em!learla cuando la necesitemos y %ue o!ciones tenemos.

    LA LIBRERA TIME DE ARDUINO

    Time es una librera estndar en Arduino !ero re%uiere %ue la instales antes de usarla. Esto es

    !or%ue consumo recursos valiosos es!ecialmente en un ;N@.

    La !uedes descargar de a%uC Librera Arduino Time& y la instalas siguiendo el !rocedimiento

    habitual.

    Ahora somos ya unos e$!ertos !rogramadores o casi0 . Podemos hacerlo.

    6anta inocencia. Princi!almente !or%ue o!erar con el tiem!o es bastante molesto como vimos

    cuando hacamos el relo) en la sesi#nDisplay con interface.

    El !rinci!al inconveniente es %ue las horas y minutos se cuentan en un sistema se$agesimal y

    no centesimal normal, y !or si esto no fuera suficiente& los das tiene 3D horas o dos ciclos de *3&

    unos meses , das y otros * y uno 3 , 3G& de!ende. ;n a-o re%uiere *3 meses y no *, como

    debera si fuera decimal / luego nos creemos tran%uilamente %ue solo usamos el sistema

    decimal0.

    http://www.prometec.net/wp-content/uploads/2014/11/Time.ziphttp://www.prometec.net/display-con-interface/http://www.prometec.net/display-con-interface/http://www.prometec.net/display-con-interface/http://www.prometec.net/wp-content/uploads/2014/11/Time.ziphttp://www.prometec.net/display-con-interface/
  • 7/25/2019 La Nueva Librera Time en Arduino

    4/12

    / es!era& %ue a'n no hemos hablado de las correcciones del calendario gregoriano& del a-o

    bisiesto y de las e$ce!ciones a las reglas. Es como un infierno informtico.

    Haced caso al abuelo. ;sad la librera. Banareis mucho en salud

    La librera Timedefine en !rimer lugar un ti!o es!ecial de variable %ue llamamos timet de 3

    bits& %ue es la base de todo.

    La idea es %ue timet almacena valores de tiem!o en un formato es!ecial calculado como el

    n'mero de segundos transcurridos desde una fecha dad hasta el * de enero de *G7,.

    < =ue guarda %u9> Tran%uilos& !ara los %ue vengis del mundo de la com!utaci#n os dir9 %ue

    es el m9todo estndar de ;ni$ILinu$. / !ara los %ue seis nuevos& deciros %ue las conversiones

    son automticas y la librera te hace el traba)o as %ue sin miedo.

    La venta)a de una cosa tan anti intuitiva es %ue al convertir una fecha y hora en un numero de

    segundos desde una fecha de referencia& !odemos restar fechas y horas tran%uilamente

    fcilmente y el resultado sigue siendo una fecha u hora %ue mide la diferencia entre ambas en

    forma de a-os& meses& das& minutos y segundos.

    Lim!io y efica". Adems la librera hace todo el traba)o de convertirnos fechas y horas en timeT

    !ara %ue !odamos o!erar tran%uilamente.

    'l inconveniente est en la letra pe!ue(a, la librera no funciona con fechas previas a

    )*+, lo !ue no suele ser grave siempre !ue lo tengis claro

    La forma !rctica de mane)ar el tiem!o es em!e"ar definiendo una variable timet

    time_t T = now();

    Los lectores astutos se habrn dado cuenta de %ue noJ0 es una funci#n& %ue dis!one del valor

    actual de tiem!o interno en Arduino. Pues de momento un asco& !or%ue cada

    ve" %ue a!agas tu Arduino o lo reseteas& el tiem!o se reinicia desde ,.

    . Nada ms fcilC

    setTime(19,58,00,6,11,2014); // Las 19:58:00 del dia 6 de No de 2014

    Para hacer un relo) con calendario !odramos usar un !rograma como esteC

    !in"l#de $Time%&'

  • 7/25/2019 La Nueva Librera Time en Arduino

    5/12

    oid set#()

    *e+ial%e-in(115200);

    setTime(19,58,00,6,11,2014);

    .

    oid loo()

    time_t t = now();

    *e+ial%+int(da(t));

    *e+ial%+int( /) ;

    *e+ial%+int(mont&(t));

    *e+ial%+int( /) ;

    *e+ial%+int(ea+(t));

    *e+ial%+int( ) ;

    *e+ial%+int(&o#+(t));

    *e+ial%+int( :) ;

    *e+ial%+int(min#te(t));

    *e+ial%+int(:) ;

    *e+ial%+intln(se"ond(t));

    dela(1000);

    .

    8omo veis& este !rograma usa las funciones !rimarias de mane)o de fechas. 8omo !oner en

    hora el relo) !rimero y como sacar los valores discretos de da& mes a-o& hora minuto y segundo.

  • 7/25/2019 La Nueva Librera Time en Arduino

    6/12

    (magnate ahora& %ue tenemos dos fechas como K: nov 3,*D 3,C*7 y K* nov 3,*D *:CD+ y

    %ueremos restarlas !ara saber cosas vulgares& como cuantos das u horas ha traba)ado

    alguien La gente es muy %uis%uillosa con lo %ue cobrar seg'n el n'mero de horas y das %ue ha

    traba)ado0.

    #s propongo !ue lo calcul-is a mano y luego lo comprobis con vuestro rduino. ver

    cuantos acertis. /o, no es una broma aun!ue yo me estoy riendo.

    Para calcular esta diferencia& tenemos %ue dar un rodeo y hablar de una estructura im!ortante

    en la nueva librera Time& %ue ha !uesto !atas arriba la antigua.

    8uando %ueramos generar fechas timet a !artir de n'meros de das meses u horas y minutos0

    la nueva librera define una estructura de ti!o tmElementst No os asust9is0& %ue tiene lossiguientes miembrosC

    tmlements_t tm ;

    tm%*e"ond *e-#ndos 0 to 59

    tm%3in#te 3in#tos 0 to 59

    tm%o#+ o+as 0 to 2

    tm%da 7ia semana 0 to 6 (No se #sa en mtime)

    tm%7a 7ia 1 to 1

    tm%3ont& 3es 1 to 12

    tm%ea+ o 0 to 99 (7ie"&a%*e"ond = 0;

    >e"&a%3in#te = 1;

    >e"&a%o#+ = 20;

    >e"&a%7a =6 ;

    >e"&a%3ont& = 11 ;

  • 7/25/2019 La Nueva Librera Time en Arduino

    7/12

    >e"&a%ea+ = 2014 ?190 ;

    T0 = maeTime(>e"&a);

    1onde asignamos valores a los miembros de Fecha del ti!o tmElements& con las !ro!iedades

    %ue veis. 1e ese modo T, es K: nov 3,*D 3,C*7C,, en segundos. / maeTime es una

    funci#n %ue nos devuelve la hora en formato timet& de una estructura tmElementst.

    Para mostrar su uso& vamos a modificar un !oco el !rograma anteriorC PRO!"#!$

    !in"l#de $Time%&'

    time_t T0, T1 ; // @ontenedo+es de e"&a(T0) ;

    T1 = *et>e"&a(2014, 11, 1, 16, 45, 0); // 1 no 2014 16:45

    +int>e"&a(T1) ;

    +int>e"&a(T1 ? T0);

    *e+ial%+intln(??????????????????????????????????????????????????);

    time_t = T1 ? T0 ;

    *e+ial%+int(*t+in-(ea+( )? 190) aos, *t+in-(mont&()?1 ) meses,);

    http://www.prometec.net/wp-content/uploads/2014/11/Prog_53_3.rarhttp://www.prometec.net/wp-content/uploads/2014/11/Prog_53_3.rar
  • 7/25/2019 La Nueva Librera Time en Arduino

    8/12

    *e+ial%+intln(*t+in-(da()) dias, *t+in-(&o#+()) &o+as);

    *e+ial%+intln(???????????????????????????????????????????????????);

    .

    oid +int>e"&a(time_t t)

    *e+ial%+int(da(t)) ; *e+ial%+int( /) ; *e+ial%+int(mont&(t));

    *e+ial%+int( /) ;

    *e+ial%+int(ea+(t)); *e+ial%+int( ) ;

    *e+ial%+int(&o#+(t)); *e+ial%+int( :) ; *e+ial%+int(min#te(t));

    *e+ial%+int(:) ;

    *e+ial%+intln(se"ond(t));

    dela(1000);

    .

    time_t *et>e"&a(int , int m, int d, int &, int mi, int s )

    tmlements_t >e"&a ;

    >e"&a%*e"ond = s;

    >e"&a%3in#te = mi;

    >e"&a%o#+ = &;

    >e"&a%7a = d ;

    >e"&a%3ont& = m ;

    >e"&a%ea+ = ?190 ;

  • 7/25/2019 La Nueva Librera Time en Arduino

    9/12

    +et#+n maeTime(>e"&a);

    .

    La funci#n !rintFecha0 formatea la salida de una variable timet en sesundos& y ms interesante

    es la funci#n 6etFecha0 %ue utili"a una estructura tmElementst !ara asignar los valores %ue le

    !asamos como !aramentros de la fecha& !ara devolver una fecha estndar convertida.

    /a !odemos calcular la diferencia entre ambas !ero el resultado sera en segundos& lo %ue iba a

    ser muy !oco descri!tivo. Por eso calculamos H como su diferencia y lo im!rimimos con un !oco

    de formateo.

    La salida del !rograma es la siguienteC

    La tercera lnea contiene la res!uesta correcta a la diferencia entre fechas& !ero hay %ue

    inter!retarlo. K7I*I*G7, significa 7 das& , meses , a-os& !or%ue enero es el mes * No e$iste el

    mes ,0. 1el mismo modo *G7, es el !rimer a-o del calendario interno y !or tanto significa ,

    a-os.

    La res!uesta es vlida !ero !or alguna ra"#n& no hay mucha gente dis!uesta a ace!tarla as.

    Por eso formateamos la res!uesta en la siguiente lnea.

    LA IN#RONI&A#I$N DE LO RELOJE EN ARDUINO

  • 7/25/2019 La Nueva Librera Time en Arduino

    10/12

    A'n tenemos otra bomba de relo)era en ciernes. La hora interna de Arduino se guarda en una

    variable %ue cuenta los milisegundos transcurridos a !artir del momento en %ue lo encendimos o

    %ue lo reseteamos. 6i lo de)amos funcionando suficiente tiem!o otro !roblema a tener en cuenta

    es el overfloJ 1esbordamiento0 del relo) interno de Arduino.

    1ado %ue almacena el n'mero de milisegundos transcurridos desde el encendido. 6i usa una

    variable unsigned long de 3 bits !ara guardarlo& el m$imo valor %ue !uede contener esC

    22= 4%294%96%296

    / como el n'mero de milisegundos !or da es de

    1000 ms A 60 se-s A 60 mins A 24 &o+as = 86%400%000

    El relo) desbordar inevitablemente en

    4%294%96%296 / 86400000 = 49, 102696 dBas

    @ sea& algo menos de +, das& al cabo de los cuales el relo) se !ondr a cero y em!e"ar de

    nuevo.

    La cuesti#n de la sincroni%aci&n de los relo'es& no es un tema balad& y buena !arte de la

    ra"#n de ser de la nueva librera Time tiene %ue ver con esta idea $or increble !ue ahora os

    pueda parecer0.

    ual!uiera !ue tenga varios relojes en su casa sabe lo desesperante !ue resulta

    ponerlos en hora tras un apagn y adems a medida !ue los meses pasan conseguir !ue todosmar!uen la misma hora es un curro a horario completo.

    0e os ha ocurrido pensar alguna ve1, !ue lo lgico es !ue se pusieran solos en hora

    por alg2n procedimiento digamos 3454 !ue consultara en 4nternet la hora&

    's otras de las muchas maneras en !ue la 4nternet de las cosas 4#6 puede ayudar a al

    humanidad..

    Hay varios m9todos %ue se !ueden usar !ara !oner en hora el relo) interno de Arduino cada ve"

    %ue lo reseteamosC

    A mano& como hemos hecho en los e)em!los de este ca!tulo. Para los e)em!los !uede

    valer !ero !oco ms. Necesitamos otra soluci#n

    8on un !rograma serie desde nuestro P8. Funciona !ero e$ige %ue nuestro P8 este

    encendido y corra un cierto !rograma !ara el servicio sincroni"aci#n.

    8on un chi! de relo) y una !ila %ue mant9ngala fecha y hora& aun%ue a!aguemos. Este

    ser el tema de nuestra !r#$ima sesi#n.

    6incroni"ndose a trav9s de internet con un servicio horario 6i se-or& eso e$iste0.6ellaman servidores NTP NetJor Time Protocol o !rotocolo de fecha en red0.

  • 7/25/2019 La Nueva Librera Time en Arduino

    11/12

    ;sando el relo) de un BP6& %ue !or si no lo sab9is son los relo)es ms

    descabelladamente !recisos %ue !od9is com!rar a un !recio ase%uible Hablaremos del asuntocuando lleguemos a los BP6s0.

    Ten9is e)em!los de todos estos m9todos en los e)em!los de la librera Time y no creo %ue valga

    la !ena entrar en cada uno ahora. 8uando instalasteis la librera tambi9n se instalaron los

    e)em!los. Echadles un vista"o.

    Para ayudarte sincroni"ar tu Arduino& la nueva librera Time& dis!one de funciones l#gicas %ue

    nos indican si la hora ha sido sincroni"adda y cunato hace de eso

    F;N8(@N @?OET(5@

    time6tatus0

    Puede devolver& una de situacionesC

    timeNot6et No se ha a)usatdoIsincroni"ado el relo).

    time6et El relo) ha sido a)ustado.

    timeNeeds6ync El relo) se a)ust# !ero fallo la sincroni"aci#n con un servcio time

    e$terno.

    set6yncProvider1efine una funci#n ala %ue se llama !eri#dicamente !ara sincroni"ar con un servicioe$terior

    set6ync(nterval0 1efine cada cuanto tiem!o se llama a la funci#n anterior.

    REUMEN DE LA EI$N

    .

    o Hemos visto como instalar la nueva librera Time.

    o Hemos hecho un !ar de !rogramas !ara mostrar el uso de los nuevos ti!os

    timet.

    o Presentamos los conce!tos bsicos de la sincrona con servicios e$ternos.

    ANT(R)OR

    *)U)(NT(

    http://www.prometec.net/infrarrojos/http://www.prometec.net/relojes-rtchttp://www.prometec.net/infrarrojos/http://www.prometec.net/relojes-rtc
  • 7/25/2019 La Nueva Librera Time en Arduino

    12/12