temporizador sin delay + bluetooth

I)

Programacioón sin delay(). DISCLAIMER: (El ejemplo se desarrollará principalmente con “pseudo código”. Como eventualmente el pseudo código puede ser casi una instrucción en C, se piden disculpas por anticipado si la sintaxis no es completamente correcta. Puede, además, que algunas variables debiesen ser constantes y/o se pudiese usar una variable de menor tamaño –i.e.: “int” en lugar de “long”; si hay algún purista a mano no vendría mal que lo mencione/corrija).

Este artículo trata sobre la técnica elemental de programación de un arduino para conseguir que ejecute varias tareas “al tiempo”. Se desarrolla un “pseudo código” para un ejemplo con las siguientes especificaciones: El sistema A) responde a una demanda (i.e.: la "A" desde el PC/móvil) que ponga en marcha algo durante un tiempo "T"; B) Queda a la espera, "mientras tanto", de otras ordenes desde el serial monitor/móvil; C) Si le llega la orden de arrancar otro proceso -digamos "B"- lo pone en marcha: este dura "X"; ambos procesos siguen en marcha "simultáneamente"; D) También acepta la orden "X" que para el proceso puesto en marcha en "A" y la orden "Y" que hace lo propio con el de "B"; todo ello mientras que uno o ambos procesos siguen en marcha. Finalmente, todo se compatibiliza con la intermitencia del LED incorporado en el arduino para monitorizar su funcionamiento (que no esté colgado). Evidentemente se trata de que las temporizaciones de salidas y LED no detengan el arduino.
(El lector tiene que tener un conocimiento medio del entorno arduino y -del “subset”- del lenguaje de programación “C++” que se usa habitualmente para programarlo).

Lo primero, la filosofía:
El microcontrolador del arduino –cualquier modelo- es tan rápido que salvo que se le pare con ordenes tipo “delay()”, es capaz de responder instantáneamente (con la percepción humana como baremo) a las ordenes y/o sucesos externos (e internos –temporizaciones-, como es el caso de este ejemplo). Si se sigue el esquema que propone el IDE de arduino, el programa (o “sketch”) se divide en tres partes: 1) La de inicialización, 2) el “setup” y 3) el “loop”; el programa propiamente dicho se almacena en el “loop”, que se ejecuta continuamente con una periodicidad –para un programa de tamaño medio- de decenas de microsegundos o menos. (de ahí, lo breve del loop, la cuasi inmediatez de la respuesta.
El programa (en este ejemplo) tiene que responder a los siguientes eventos:

  1. Requerimiento del usuario vía teclado de PC (o aplicación de móvil; ambas entran por “serial”) de arranque/parada de procesos externos.
  2. Finalización de las temporizaciones de los aparatos puestos en marcha por el usuario y de los semiperíodos del LED del arduino para parar los procesos y encender/apagar el LED.
    La técnica consiste en utilizar las funciones de tiempo (habitualmente “millis()”) junto con algunas variables asociadas a cada uno de los procesos (arranque/parada de aparatos; LED) para conseguir la correspondiente temporización. Evidentemente hay que actualizar las variables y compararlas con los tiempos requeridos para controlar los procesos. De esta forma, al ejecutar continuamente el loop, el uC escanea continuamente los eventuales comandos del usuario, modificando, si procede, el comportamiento del sistema.
    (Para sistemas muy complejos se recomienda implementar lo anterior mediante la técnica de “automata de estados finito” –tambien conocido como “autómata de estados”, “autómata de estados finitos”, “finite estate automata”, FEA ó, incluso “finite estate automaton” (no es coña)-. En este ejemplo se usará una especie de “subconjunto” de esta técnica; se irá explicando sobre la marcha cuándo y qué forma parte de esto.