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!