Étape 4: Description Code
Remarque : quand je dis « l’horloge » je veux dire l’horloge ensemble comme un système. Quand je dis « real time clock », je veux dire seulement la puce de l’horloge.
Pour la date hébraïque, j’ai utilisé le code de domaine public suivants :
"Calculs calendaires '' par Nachum Dershowitz et Edward M. Reingold, logiciel---pratique et expérience, vol. 20, n ° 9 (septembre 1990), p. 899--928.
Le code ci-dessus convertit entre la date grégorienne qui fournit de l’horloge temps réel à la date hébraïque. Il actualy contient également des conversions calendrier Julian, musulman et ISO, donc vous pouvez les utiliser si vous le souhaitez. Ou vous pouvez l’utiliser sans conversion du tout.
Parce que la conversion est très lente j’ai dû changer quelques lignes de code, afin qu’il ne démarre pas la recherche des toutes dernières années maintes et maintes. Avant le changement, conversion de la date a pris près de 4 secondes, et les secondes de l’horloge ont été irréguliers. Parce qu’il s’agit d’une horloge, le chiffre de l’année change une fois par an (bien sûr). Le code d’origine est plus générique, il est utilisé pour convertir des dates différentes, non liés. Mais dans une horloge comme je le disais, l’année est presque constante, donc j’ai changé le code donc au début il convertit une fois à l’aide de la méthode lente, mais dans les conversions suivantes, il utilise le passé rapprochement de conversion de l’année pour lancer la recherche.
Autres bibliothèques sont incluses dans le fichier zip.
Pour empêcher l’utilisation des variables globales, toutes les classes qui leur valeur doit être enregistrée et variables sont statiques. Aussi, les classes que leur temps d’instanciation est longue ont été définies comme static. Le problème avec cette méthode, c’est que votre fonction setup() ne peuvent pas accéder aux variables dans la fonction loop() afin d’avoir à redéfinir leur. Pour éviter cette redondance, on introduite la notion de machine d’État.
Le code est construit comme une machine à États. Chaque fois que la fonction de boucle est appelée, l’horloge est dans un certain état. Transition entre États sont élaborés selon des règles bien définies. Par exemple, lorsque l’horloge démarre, il pénètre dans INIT_STATE. Cet État est utilisé au lieu d’utiliser la fonction setup(), alors les variables loop() sont accessibles.
Après INIT_STATE l’horloge entre IDLE_STATE. Cet État est la position de départ pour tous les autre transition d’État. Le récepteur IR est vérifié chaque fois que l’horloge est en état de repos. Ce n’est pas optimal, car si l’horloge est dans un autre État, la télécommande ne répondra pas. Par exemple, le capteur de température est l’accès est relativement lent. Au cours de la lecture de la température, le récepteur IR sera inactif. Une meilleure façon consiste à utiliser les interruptions (comme je suis un newbie, je ne connaissais pas interruptions jusqu’au plus tard).
La température est lu dans READ_TEMP_STATE, et le temps est lu dans READ_TIME_STATE. Le taux de cette États est défini au début du programme. L’heure est lue chaque 120milliseconds et température est lu toutes les 2 secondes.
Une autre chose à noter est que la mise à jour de temps devrait être très synchrone. Toutes les actions de votre temps doivent avoir lieu après l’actualisation de la figure de secondes. Donc lecture de température se fait immédiatement après l’actualisation de l’époque. Il laisse l’horloge une seconde à faire d’autres choses, jusqu'à la prochaine mise à jour de temps. Si nous allons à READ_TEMP_STATE de IDLE_STATE, la lecture de la température pourrait survenir lorsque nous devons mettre à jour l’heure et la figure de seconde horloge ne changera pas dans un rythme constant. Dans ce cas, les secondes ne cocher à un regulat rythme et c’est inquiétant, que l’horloge semble très amature.
Liste des bibliothèques nécessaires :
- Bibliothèque de capteur DHT
- LCD-I2C
- IRremote Arduino
- Bibliothèque de DS1302 - incluse dans mon fichier zip et là : DS1302 OOP
- Bibliothèque de MP3 de voiture - incluse dans mon fichier zip
- bibliothèque de conversion temps - incluse dans mon fichier zip
Notez que la bibliothèque de DS1302 n’est pas le fichier d’origine, je l’ai changé pour une structure de classe.