Paso 4: Descripción de código
Nota: cuando digo "el reloj" me refiero al reloj entero como un sistema. Cuando digo "reloj de tiempo real", me refiero a solo el chip de reloj.
Para la fecha hebrea he utilizado el siguiente código de dominio público:
"Cálculos de calendario '' por Nachum Dershowitz y Edward M. Reingold, Software---práctica y experiencia, vol. 20, no. 9 (septiembre de 1990), págs. 899-928.
El código anterior se convierte entre la fecha Gregoriana que alimenta el reloj de tiempo real hasta la fecha hebrea. Actualmente contiene también las conversiones de calendario Julian, la musulmana y la ISO, así que usted puede utilizar estas si quieres. O se puede utilizar sin la conversión en todo.
Porque la conversión es muy lenta tuve que cambiar algunas líneas de código, para que no empieza a buscar los últimos años una y otra. Antes del cambio, conversión de la fecha tuvo casi 4 segundos y los segundos de reloj dentados. Porque es un reloj de la figura del año cambia una vez en un año (por supuesto). El código original es más genérico, se utiliza para convertir fechas diferentes, no relacionados. Pero en un reloj como mencioné, el año es casi constante, por lo que cambié el código por lo que en principio convierte una vez utilizando el método lento, pero en las siguientes conversiones utiliza el pasado aproximación de conversión del año para comenzar la búsqueda.
Otras bibliotecas se incluyen en el archivo zip.
Para evitar el uso de variables globales, las variables y clases que se salvaría su valor son estáticas. También, las clases que su tiempo de ejecución es largo fueron definidas como estáticos. El problema con este método es que la función setup() no puede acceder a las variables en la función loop() para tener que redefinirlos. Para evitar esta redundancia, se introduce la noción de máquina de estado.
El código está construido como una máquina de estado. Cada vez que se llama la función de bucle, el reloj está en un determinado Estado. Transición entre Estados se hacen según las reglas definidas. Por ejemplo, cuando el reloj se inicia, entra en INIT_STATE. Este estado se utiliza en lugar de utilizar la función setup(), por lo que pueden accederse a las variables loop().
Después de INIT_STATE el reloj entra en IDLE_STATE. Este estado es la posición inicial para todos otra transición de estado. El receptor IR se comprueba cada vez que el reloj está en estado inactivo. Esto no es óptimo, ya que si el reloj está en algún otro Estado, el control remoto no responde. Por ejemplo, el sensor de temperatura es acceso es relativamente lento. Durante la lectura de la temperatura, el receptor IR estará inactivo. Una mejor manera es utilizar interrupciones (como soy un novato, yo no sabía acerca de interrupciones hasta más tarde).
La temperatura se lee en READ_TEMP_STATE, y el tiempo se lee en READ_TIME_STATE. La tasa de este Estados está definida en el inicio del programa. Tiempo se lee cada 120milliseconds y temperatura se lee cada 2 segundos.
Otra cosa a notar es que la actualización de tiempo debe ser muy sincrónica. Todas las acciones mucho tiempo deben ocurrir después de que la figura de segundos fue actualizada. Lectura de la temperatura se hiciera inmediatamente después de la hora se actualiza. Deja el reloj un segundo a hacer otras cosas, hasta la próxima actualización del tiempo. Si vamos a READ_TEMP_STATE de IDLE_STATE, la lectura de temperatura podría ocurrir cuando necesitamos actualizar el tiempo y no va a cambiar la figura de segundos de reloj en un ritmo constante. En tal caso los segundos no marque en un regulat ritmo y resulta preocupante, que el reloj se ve muy agradable.
Lista de la biblioteca requiere:
- Biblioteca de sensor DHT
- LCD-I2C
- Arduino IRremote
- Biblioteca del DS1302 - incluido en mi archivo zip y aquí: Programación orientada a objetos DS1302
- Biblioteca de MP3 de coche - incluido en mi archivo zip
- Biblioteca de conversión de tiempo - incluido en mi archivo zip
Tenga en cuenta que la biblioteca DS1302 no es el archivo original, que lo cambié a una estructura de clase.