Siempre necesitamos un temporizador en cualquier aplicación electrónica que se nos ocurra desarrollar. Para hacerlo en Android, App Inventor trae, como cualquier programa orientado a objetos, un Timer que puede adoptar muchas funciones y aplicaciones. En el desarrollo que te mostramos hoy verás el modo en que podrás construir un temporizador para utilizarlo como medidor de tiempos, como contador de eventos o como cualquier otro segmento de código útil, que sea fácil de aplicar en programas más complejos. Desde una aplicación útil para contabilizar tiempo hasta un cronómetro, un temporizador es una sencilla aplicación Android que puedes construir con App Inventor en pocas horas.
Desde que la programación existe, los contadores han sido tan necesarios como las terminales de entrada o salida de datos. Un contador de tiempo y/o eventos es una herramienta indispensable para elaborar un proyecto que, en ocasiones, suele ser un dolor de cabeza antes que una solución. Dentro de los ejemplos que encontramos a diario, y que nos inspiran a realizar nuestros desarrollos, hemos encontrado muchos ejemplos de temporizadores en la tienda de Android. Sin embargo, la mayoría posee toneladas de “accesorios” que no hacen más que dificultar el manejo y la implementación de lo que necesitamos: una aplicación que se inicie, que tenga una única pantalla, un botón de “Comenzar” y que el tiempo empiece a correr. No necesitamos (ni deseamos) ajustar decenas de propiedades, sólo necesitamos un contador de tiempo. Por supuesto, si no tuvieran todas esas funciones “extras” no justificaría su precio y en el caso de las aplicaciones gratuitas, no sería una buena ventana al mundo de los programadores exitosos de Android. Como quieras que sea, nosotros necesitamos un contador sencillo, no una base de tiempos con precisión atómica.
Desde controlar nuestro rendimiento al salir a caminar, hasta saber cuántos minutos dejamos un PCB en el agua para disolver el papel (usando el método de la plancha), la medición de tiempos es necesaria y un reloj debe estar siempre presente. Llevado a un entorno de programación, un temporizador nos determina el ritmo de funcionamiento del programa. Nos dicta la unidad temporal en que ocurrirán los eventos. Por ejemplo, cada 10 segundos podemos interrogar por el estado de un sensor remoto o cada 1 segundo podemos incrementar una unidad de tiempo en un reloj clásico. En electrónica es muy común utilizar los RTC (DS1307, DS1337, etc) que se pueden acoplar a un sistema con microcontrolador, o bien utilizar los que ya traen como parte de su arquitectura los modelos más modernos. Sin embargo, en la programación orientada a objetos, disponemos de lo que se conoce como Timer. Bastará con ajustarle la unidad de tiempo, a la que deseamos que trabaje, y ya podremos comenzar a organizar nuestra aplicación. El Timer se encuentra dentro de la paleta de los elementos básicos ubicada a la izquierda de la pantalla en App Inventor y lo encontrarás con el nombre “Clock”. Recuerda que algunos elementos quedan en la pantalla mientras organizamos la aplicación (pisamos y arrastramos elementos) y otras no (se colocan debajo), pero todas te permiten cambiar su nombre para que ninguna te genere la típica pregunta ¿Esto para qué estaba aquí?
A la mayoría de las rutinas necesarias y elementales, para armar una aplicación en App Inventor, ya las hemos visto en entregas anteriores pero un pequeño repaso, nunca viene mal. Lo que haremos es ver además, el modo en que decidimos armar el contador, explicarte porqué lo hicimos con esa estructura y porqué no utilizamos el reloj de Android para ejecutarlo. Entonces, luego de colocar el elemento Clock dentro de la aplicación dejaremos marcadas las casillas de habilitación y de siempre activo (TimerAlwaysFires) reiniciándose una y otra vez como un ciclo perpetuo y ejecutando todas las instrucciones que decidamos meter dentro de su ciclo de trabajo o bien, demorando y aplicando un retardo entre una instrucción y otra sucesiva. En nuestro caso, debemos colocar, dentro del valor de intervalo, una cifra que será muy próxima a 1000. Recuerda: el ciclo de programa consume tiempo y a ese tiempo hay que descontarlo de los 1000 milisegundos, por lo tanto, el valor final, será levemente inferior para compensar el tiempo que requiere el programa al funcionar dentro del dispositivo Android. Los valores que coloquemos aquí serán contabilizados en milisegundos, por lo tanto, nuestro temporizador actuará cada 1 segundo. Podemos hacerlo cada 10 o 100 milisegundos y tendremos una herramienta para medir eventos muy rápidos y que requieren máxima precisión. Utilizando la técnica Bluetooth, vista en artículos anteriores, podemos hacer, con un microcontrolador, un control de llegada para automodelismo y visualizarla en nuestro dispositivo con Android, por ejemplo. Variar a nuestro gusto y necesidad el intervalo de acción del Timer, Clock o Temporizador nos permitirá contar desde tiempo hasta latas de cerveza que pasan por la línea de producción, en una embotelladora, antes de que las enfriemos y bebamos.
Luego del Timer vienen los botones, las etiquetas y las herramientas para ordenar los elementos en la pantalla ya sea en forma vertical como horizontal. Las etiquetas se utilizan como separadores de bloques, de botones y una sola se utiliza para mostrar el dato que pretendemos, en este caso, el tiempo mostrado en minutos y segundos. Expandiendo la arquitectura que usamos para armar el contador, tú puedes anexar horas, por ejemplo. Los botones serán cuatro, Comenzar/Continuar, Pausa, Detener, y RESET o “Puesta a Cero”. Sus funciones son muy simples e intuitivas y en el video están bien explicadas y demostradas. Por supuesto, tú puedes mejorar este programa agregando una base de datos con registros de actividad que indique cuántas veces se puso en funcionamiento el temporizador en el día, cuánto fue el valor máximo, mínimo, promedio y muchos otros datos que puedan resultarte útiles. Como te mencionamos al principio, por ahora, no necesitamos nada de eso, sólo deseamos un contador y allí está. Las rutinas que utiliza cada botón y que se arman en el editor de bloques, pueden parecer muy extensas y difíciles de comprender, sin embargo, bastara que analicemos una o dos juntos y verás que las demás poseen la misma estructura, pero adaptada a su función dentro del programa.
No te asustes y analiza de manera tranquila cada bloque de color verde, por ejemplo, el de Screen1. Lo primero que vemos en la parte más alta de bloques celestes es la habilitación o no de cada objeto que menciona la pieza (que parece de un rompecabezas) y que devuelve una condición verdadera o falsa para ese instante, que sería el de inicio de la aplicación. En las columnas de al lado (Pausa.Click o Detener.Click) sucede lo mismo, pero para otros objetos, si pulsamos el objeto que está encuadrado en el marco de color verde. Por ejemplo, si pulsamos el botón Pausa, vemos que el Timer se detendrá (Reloj.TimerEnabled = False), que el botón Comenzar estará habilitado, al igual que el de Detener y el mismo botón Pausa quedará deshabilitado. La cuenta se reinicia con Continuar, no pulsando nuevamente el botón Pausa. Todos los comandos entonces, son mediante la simple instrucción básica (booleana) False / True.
Dentro de “Mis Bloques” aparecen los objetos que fuimos incorporando al lienzo en App Inventor y sólo debemos armar la actividad deseada pisando y arrastrando bloques de manera ordenada y correcta. Como vimos antes, luego de habilitar (o no) los botones según la actividad del temporizador, damos color a los botones (si están habilitados) o no y si es necesario cambiamos el texto de una etiqueta (Label14.Text) o de un botón (Comenzar.Text). Es decir, dentro del marco que soportará las acciones de la actividad del objeto, insertamos las actividades que deseamos provocar en otros objetos o en el programa. Por ejemplo, el sencillo botón Salir, que sólo provocará el cierre de la aplicación y le ahorrará trabajo a Android de mantenerla abierta consumiendo recursos. Resumiendo: los bloques celestes son las acciones de los objetos y los bloques que tienen acoplados a su derecha son las instrucciones que deseamos que ese objeto realice (actúe). Ejemplo: al pulsar el botón Detener, entre varias cosas desearemos que el botón RESET se vuelva de color azul. Es muy sencillo ¿verdad? ¿No sientes ganas de iniciar ya mismo una aplicación? No olvides de leer bien los artículos anteriores de introducción a App Inventor para no tropezar con complicaciones que están explicadas y resueltas allí. Utiliza el buscador de este sitio, claro.
Aquí comienza la mejor parte del programa. Observa que el botón Comenzar (Comenzar.Click) mantiene la misma estructura que los anteriores, habilitando o no algunos objetos y jugando con los colores de algunos objetos hasta la instrucción “IFELSE” ya conocida por la mayoría. Esta instrucción consulta sobre una condición (test) y de acuerdo al resultado (verdadero o falso), realiza una acción (then-do) u otra (else-do). La acción es muy clara. Si se encuentra con que el texto que hay dentro del botón (Comenzar.Text) es igual a la palabra Continuar, la cuenta proseguirá su curso (then-do) y la etiqueta donde se visualiza el conteo (los minutos y los segundos) (Label14.Text), continuará con los mismos valores que se arrastraban de las variables Minutos y Segundos. Si no (else) coincide el texto y allí estaba la palabra Comenzar; Minutos y Segundos iniciarán (else-do) desde un valor igual a 0 (cero). ¿De donde salieron las variables Minutos y Segundos? Las creamos nosotros como definiciones nuevas y le asignamos ese nombre a cada una. En este caso, volvemos a utilizar la instrucción de texto “Join” para formar la expresión de tiempo que se ofrece en pantalla.
El bloque de la derecha de la imagen ocurre cada un segundo (TimerInterval) (o cada el intervalo de tiempo que quieras) (¡o cada vez que llega una instrucción exterior!) y la secuencia de acciones de los objetos ordenarán los números, mostrados en pantalla, para que existan los ceros en adelanto y para que a los 59 segundos, el programa avance un minuto. Una vez que todo esto se organiza, se muestra en la etiqueta 14. Y aquí es donde hacemos hincapié en haber realizado un contador. Si en lugar de un Timer, tuviéramos la llegada de una acción externa, podríamos hacer (reorganizando el contador) un sistema que no sea un reloj o temporizador y se transforme de manera muy sencilla en un contador de eventos. Por ejemplo, podríamos calcular la velocidad de giro de una rueda de bicicleta contando los impulsos que llegan en un segundo, suministrados vía Bluetooth. Eso nos daría la velocidad, los metros recorridos y muchos datos más. Es decir, si hubiéramos utilizado una función de reloj, en lugar de un contador, no podríamos expandir el proyecto. De este modo, ¿quién se atreve a predecir el futuro proyecto Android que NeoTeo nos está preparando? No olvides, estamos en el Foro de Electrónica de NeoTeo para trabajar con Android, App Inventor y toda la electrónica que tanto nos gusta. ¡Te esperamos!
Maravilloso trabajo, soy asiduo visitante de la pagina aunque nunca hago comentarios, felicitaciones Mario de verdad sos un grande, Aprovechando quisiera saber dos cosas; en este preciso instante estoy tratando desarrollar un cronometro para Windows Mobile 6.5(que problemita con esto pues en la empresa se cuenta solo con unos dispositivos medio viejunos) que me almacene los tiempos tomados en un archivo de texto o una hoja de calculo, sin embargo me ha dado duro lo de la programada en c#, entonces mi pregunta es si en App inventor se podría efectuar este tipo de aplicaciones,de antemano mil gracias…
#1 Hola, soy el creador de la web http://www.tuappinvetorandroid.com y estoy contento de que empiece a salir gente interesada en App Inventor por que aunque parece que no se pueden hacer verdaderas aplicaciones.
Sin necesidad de saber programar, solo gustándote y dedicándole tiempo, bueno respecto a lo de guardar los tiempos si se puede con app inventor con la herramienta tinyDb es una base de datos que se crea en la aplicación y guarda los datos en el teléfono, pero también puedes crear una base de datos web con app engine, en mi web dispongo de un videotutorial de como crearla, para app inventor, ademas otra posibilidad es utilizar fusion tables que es otra herramienta de app inventor en la cual guardarías los tiempos en una hoja .csv.
Espero os sirva la respuesta, y un saludo a neoteo espero que siga animando a la gente con app inventor.
Hola Marox
No estoy seguro que App Inventor permita hacer lo que deseas (no soy experto en él, estoy descubriéndolo poco a poco).
Fíjate si aquí está algo de lo que deseas:
http://www.appinventorbeta.com/learn/reference/components/notready.html#FusiontablesControl
Te almacena datos en tablas (formato CSV). No aparenta ser taaaan sencilo, pero puede ser una salida. De todos modos, en el momento que lo descubra es muy probable que arme una aplicación con base de datos o generación de archivos TXT.
Saludos!
Mario
Que buen articulo siempre escribiendo como se debe, con seriedad y objetividad 🙂 gracias.
Todavía no he experimentado con android pero creo que viendo esto me dieron ganas.
Hola Mario. Muy buen artículo al igual que los anteriores referidos a la programación en Android y su infinidad de aplicaciones.
¡Saludos!.
…gran Android..grande Mario..Mira ve… que todo se puede hacer……….que envidia y yo sin poder conseguir el modulo Bluetooth……..saludos…
Sensacional amigo. Con esta herramienta podemos hacer cosas muy buenas; lo del proximo articulo no lo se, nos sorprendes cada dia que ya no sabemos que esperar.
Mil y mil gracias.
Amigo, realmente cuales son los alcances de appInventor, realmente se puede desarrollar una aplicación a la medidia?
HOla, buscando respuestas a como hacer un temporizador con App Inventor encontré tu trabajo…realmente una delicia. Me gustaría plantearte un problema que tengo con mi temporizador… necesito un sonido "bip" que me avise cada minuto en un total de 60 minutos. Realiza correctamente la función mientras esta conectado al pc y simulo la app en el teléfono. pero cuando la empaqueto en el teléfono y la ejecuto funciona bien mientras el teléfono está activo… luego en cuanto el teléfono se pone en modo inactivo (pantalla apagada) el objeto clock deja de funcionar hasta que activo de nuevo la pantalla, tienes alguna solución… necesito que aunque el teléfono pase a modo inactivo la aplicación emita el bip cada minuto… gracias.
Añado un comentario más a mi anterior duda, el problema solo me pasa cuando el tfno está funcionando con solo con la batería, si esta enchufado para cargarse la plaicion funciona perfectamente aun en modo inactivo… tendré que activar algo en el movil (samsung galaxy mini) para decirle que esa aplicacion no la pare cuando está solo con batería…??? gracias nuevamente…
Primero que nada que buena pagina, me a ayudado con un par de aplicaciones que he hecho, queria hacerte una pregunta mario, estoy haciendo una app para mover un hexapod, ya logre que se mueva con botones, lo que hago es mandar datos por medio del bluetooth, pero ahora quiero moverlo con el acelerometro pero tengo un problema, el problema es que al cumplirse el valor del acelerometro me manda 7 u 8 caracteres lo cual hace que el hexapod realice el primer movimiento y despues se cuelga, pienso que tal vez con un retardo se soluciona esto, pero no se como poner un retardo no se si puedas auxiliarme…
Buen día amigos.
primero quiero felicitarlo por su trabajo es excelente.
amigo tengo un problema y quisiera saber si me puede ayudar
tengo que hacer un proyecto y necesito que se pueda programar una alarma pero que envié un mensaje 5 minutos antes de que suene y 30 segundos antes de que suene,
he tratado con temporizador, pensé que se podía restar la hora actual menos la hora digitada para comenzar el cronometro en el valor que da la resta. Pero no he podido de ninguna forma
agradezco que me pueda ayudar
Hola. Al minuto 3.40 cuando le das a comenzar de nuevo, no continúa con la cuenta. Es mas, el teléfono se buscó de tildar. Hay algún error dando vueltas. En realidad el botón detener y pausar tendría que ser uno solo. Saludos.