Stap 4: Code Beschrijving
Opmerking: als ik zeg "de klok" bedoel ik de gehele klok als een systeem. Als ik zeg "real timerklok", bedoel ik alleen de klok chip.
Voor de Hebreeuwse datum gebruikte ik de volgende code van het publieke domein:
"Kalendrische berekeningen '' van Nachum Dershowitz en Edward M. Reingold, Software---praktijk & ervaring, vol. 20, no. 9 (September 1990), pp. 899--928.
De bovenstaande code converteert tussen de Gregoriaanse datum dat de real-time klok levert Hebreeuwse toe. Het daadwerkelijk bevat ook Julian, moslim en ISO kalender conversies, zodat u deze als je wilt gebruiken kunt. Of u kunt het zonder conversie helemaal.
Omdat de conversie erg traag is moest ik veranderen enkele coderegels geplaatst, zodat het niet beginnen met het zoeken van alle van de afgelopen jaren over en over. Vóór de verandering, datum conversie duurde bijna 4 seconden en de klok seconden waren jaggy. Want het is een klok die de figuur van het jaar eens in een jaar verandert (natuurlijk). De oorspronkelijke code is algemener, het wordt gebruikt om verschillende, niet-gerelateerde datums converteren. Maar in een klok zoals ik al zei, het jaar is vrijwel constant, dus ik de code veranderde dus in het begin zet het eens met de langzame methode, maar in de volgende conversies het het verleden gebruikt jaar conversie aanpassing aan te beginnen met zoeken.
Andere bibliotheken zijn opgenomen in het zip-bestand.
Om te voorkomen dat het gebruik van globale variabelen, zijn alle variabelen en klassen die hun waarde moet worden opgeslagen statisch. Tevens werden klassen dat hun instantiëren lang is gedefinieerd als statische. Het probleem met deze methode is dat uw Setup-functie geen toegang de variabelen in de loop functie tot dus je moet ze opnieuw te definiëren. Voorkom dit redundantie en is het begrip van de machine staat ingevoerd.
De code is gebouwd als een statusmachine. Telkens wanneer de lus-functie wordt aangeroepen, wordt de klok is in een bepaalde toestand. Overgang tussen staten zijn gemaakt volgens de gedefinieerde regels. Bijvoorbeeld, wanneer de klok begint, voert het INIT_STATE. Deze toestand wordt gebruikt in plaats van met de Setup-functie, zodat de loop variabelen kunnen worden benaderd.
Nadat INIT_STATE de klok in IDLE_STATE. Deze stand is de beginpositie voor alle andere staat overgang. De IR ontvanger wordt gecontroleerd telkens wanneer de klok in idle toestand is. Dit is niet optimaal, omdat als de klok in een andere staat is, de afstandsbediening zal niet reageren. Temperatuursensor is bijvoorbeeld toegang is relatief traag. Tijdens de temperatuurmeting zullen de IR ontvanger inactief. Een betere manier is het gebruik van interrupts (zoals ik een newbie ben, ik wist niet over interrupts pas later).
De temperatuur wordt gelezen in READ_TEMP_STATE, en de tijd in READ_TIME_STATE wordt gelezen. Het tarief van deze Staten is gedefinieerd in het begin van het programma. Tijd is het lezen van elke 120milliseconds en temperatuur is het lezen van elke 2 seconden.
Een ander ding om op te merken is dat de tijd-update zeer synchroon moet. Alle tijdrovend acties moeten plaatsvinden nadat de seconden figuur werd bijgewerkt. Temperatuurmeting gebeurt dus onmiddellijk nadat de tijd is bijgewerkt. Het laat de klok een tweede andere om dingen te doen, tot de volgende update van de tijd. Als we naar de READ_TEMP_STATE van IDLE_STATE, optreden de temperatuur lezing wanneer we moeten de tijd bijwerken en de klok seconden figuur niet in een constante snelheid veranderen zal. In een dergelijk geval de seconden geen tik op een VOO tempo en het is verontrustend, dat de klok kijkt zeer anker.
Lijst van de vereiste library:
- DHT sensor bibliotheek
- LCD-I2C
- Arduino IRremote
- DS1302 bibliotheek - opgenomen in mijn zip-bestand, en hier: DS1302 OOP
- Auto MP3-bibliotheek - opgenomen in mijn zip-bestand
- de bibliotheek van de documentomzetting van het tijd - opgenomen in mijn zip-bestand
Merk op dat de DS1302-bibliotheek is niet het oorspronkelijke bestand, mij gewijzigde op voor een klassenstructuur.