Paso 1: Funcionalidad diseño y programación
La idea de la funcionalidad de la escritura de Arduino puede verse en este gráfico.
- Después de conectar la alimentación el motor servo se mueve a la posición inicial y espera a que un té
bolsa para fijarse. - A continuación, pulse el botón varias veces – una vez por cada minuto de elaboración de la cerveza.
- Cuando el botón no está pulsado más de 2 segundos el motor servo se mueve para la elaboración de la cerveza
posición y el conteo comienza. - Cuando el tiempo de preparación es sobre el motor servo retrocede poner fin a posición (igual que la posición de partida) y puede ser desconectado la alimentación.
He proporcionado 2 versiones de la secuencia de comandos.
La primera se implementa para una placa Arduino estándar y estaba en uso por algún tiempo y es ideal para la fabricación de
cambios en el programa sin un programador. El otro está implementado para el uso de un procesador ATtiny85.
Comenzó como una simple versión muy similar a las secuencias de comandos de software que usted puede encontrar en los otros ejemplos. Pero resultó que tenía que haber algunas adiciones para que sea realmente útil para el uso diario se que tenía varios requisitos más a implementarse. Estas versiones mejoradas están disponibles aquí.
Una máquina de Estados pequeños
El programa siempre debe conocer la situación actual de la hora cuando se enciende, hasta que el tiempo de elaboración de la cerveza. Por lo tanto es una variable global llamada Estado que puede tomar el valor apropiado correspondiente a la situación:
Estado de uint8_t;
En la imagen superior puedes ver cómo se utilizan los Estados. Es una implementación directa excepto de la repetición cuando se pulse el botón varias veces durante la fase de programación.
Para tener una buena legibilidad de los posibles valores de estado se definen en la sección constante de la secuencia de comandos:
#define STATE_INIT 0 x 00 / / / < esperando el primer botón hacia abajo
#define STATE_DOWN 0 x 10 / / / < se presiona el botón
#define STATE_UP 0x11 / / / < soltarlo así incrementar la hora del té por uno.
#define STATE_ENTER 0x21 / / / < entrar en la preparación de la fase mostrando el número de minutos
#define STATE_BREW 0x22 / / / < entra el bolso de té y esperar hasta el final del tiempo de preparación
#define STATE_END 0x99 / / / < Preparación tiempo terminada.
Servo posiciones de bolsa de té
Las posiciones que necesitamos para el servo tienen que encontrar por ensayo y error, ya que dependen del diseño concreto del temporizador de té y el servo. Para un diseño simple 2 posiciones son suficientes (inicial y ENTER). Se definen en la sección constante de la secuencia de comandos:
#define TEABAG_INITIAL 95
#define TEABAG_ENTER 65
#define TEABAG_DIP 70
#define TEABAG_OUT 83
Estas son las posiciones para el estado inicial sujetar una bolsa de té, la posición de preparación, un pequeño movimiento que fue solicitado por algunos usuarios y la posición de fuera, no demasiado alta para que las últimas gotas pueden caer en la jarra de té. Al final se mueve el servo a la posición inicial para soltar la bolsa de té.
El servo en movimiento lentamente
La mayoría deseaba mejora desde la primera versión era hacer el servo mueve lentamente en lugar de la simple "tan rápido como sea posible" versión en primera versión. Por lo tanto, el método tbSetPosition no mueve el servo directamente pero en cambio registra la posición de destino en una variable global. Luego de vez en cuando mediante una llamada a la función tbCheckPosition la posición actual del servo es modificada por 1 en la dirección deseada. Por último, cuando el servo ha alcanzado la posición de destino se separa el servo para ahorrar energía.
Las variables tbPosition y tbPositionNext almacenan la corriente y la posición deseada.
Mover el servo bajo carga pesada
La primera versión independiente el servo inmediatamente después de la mudanza a la nueva posición. Sin embargo con carga pesada el servo no llegar a su destino de manera confiable. Esto fue solucionado mediante el uso de la variable timer específicos tbLastMove que siempre se establece en el momento actual después de mover el servo.
El servo es independiente 400 mseg. después del último movimiento.
Ver el tiempo
La forma más fácil para el control de las funciones dependientes del tiempo es utilizar la función millis() que devuelve el número de milisegundos transcurrido desde el inicio.
Utilizo esta función para obtener la "hora actual" y se compara con la última vez cuando algo interesante ha sucedido.
Cada vez que inicie la función loop(), la variable ya está definida y la duración de la fase actual se calcula utilizando las variables:
sin firmar largo ahora;
sin firmar largo comenzó;
duración largo sin firmar;
Este enfoque es por mucho mejor que usar la función delay() de aplicación general mecanismo de sincronización. Sin embargo, a veces es simplemente más fácil de usar por ejemplo delay() para encender el LED y algunos milisegundos en espera hasta que consiguió mover el servo.
Hay algunas constantes de tiempo definidos en el encabezado del boceto que se puede ajustar a sus necesidades:
#define MSECS_TO_START 2000 / / / < cuando botón no está pulsado desde 2 segundos, el inicio de elaboración de la cerveza.
#define MSECS_FOR_DROPS 10000 / / < el número de segundos que la bolsa está cerca sobre la jarra de té.
#define MSECS_TO_DETACH 400 / / / < después de 400 milisegundos de ningún movimiento del servo se separa para ahorrar energía.
El mínimo tiempo en milisegundos que una pulsación tiene que durar tomando serias está programado como 50. Sucede a menudo que un botón no cambia la señal en forma adecuada pero rebota una vez o dos veces antes de cerrar completamente. Estas pequeñas secuencias rápidas sólo se omiten.
Antes de encender el LED parpadea una vez por cada minuto de tiempo de elaboración de la cerveza.
RESET e inténtalo de nuevo
A veces sucede que los TTT no arranca correctamente porque el bolso de té salta o no le gusta ir el número de minutos programados de buceo estaba equivocado. En este caso tienes que apagar y volver a conectar.
He incluido más comentarios en el código fuente. Leer y modificar...