Upload
revange2112
View
216
Download
0
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.rar7/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-rtc7/25/2019 La Nueva Librera Time en Arduino
12/12