LCD klocka med hebreiska kalendern daterar, och en termometer (4 / 7 steg)
Steg 4: Beskrivning
Obs: när jag säger "klockan" menar jag hela klockan som ett system. När jag säger "real time clock", menar jag bara klocka chip.
För det hebreiska datumet använde jag följande offentliga kod:
"Calendrical beräkningar '' av Nachum Dershowitz och Edward M. Reingold, programvara---praxis & erfarenhet, vol. 20, nr 9 (September 1990), s. 899--928.
Ovanstående kod konverterar mellan det gregorianska datum då realtidsklockan levererar hebreiska hittills. Det faktiskt innehåller också Julian, Muslim och ISO kalender konverteringar, så du kan använda dessa om du vill. Eller du kan använda det utan konvertering alls.
Eftersom omvandlingen är mycket långsam tvungen jag att ändra några rader kod, så att det inte börjar söka alla de senaste åren över och över. Innan förändringen, Datumkonverteringen tog nästan 4 sekunder och klocka sekunder var ojämna. Eftersom det är en klocka år siffran ändras en gång under ett år (naturligtvis). Den ursprungliga koden är mer allmän, det används för att konvertera olika, icke-relaterade datum. Men i en klocka som jag nämnde, året är nästan konstant, så jag ändrade koden så i början den konverterar en gång med långsam metod, men i följande konverteringar använder det tidigare året konvertering tillnärmning att börja söka.
Andra bibliotek ingår i zip-filen.
För att förhindra användningen av globala variabler, är alla variabler och klasser som deras värde ska sparas statiska. Dessutom definierades klasser att deras instansiering tid är lång som statisk. Problemet med denna metod är att din setup() funktion inte kommer åt variabler i funktionen loop() så måste du omdefiniera dem. För att förhindra denna redundans, introduceras den statliga maskin aningen.
Koden är byggd som en tillståndsdator. Varje gång loop funktion kallas, är klockan i ett visst tillstånd. Övergången mellan staterna sker enligt fastställda regler. Till exempel när klockan börjar, går INIT_STATE. Detta tillstånd används i stället för att använda funktionen setup(), så loop() variabler kan nås.
Efter INIT_STATE in klockan IDLE_STATE. Detta tillstånd är startpositionen för alla andra statligt övergång. IR-mottagaren kontrolleras varje gång klockan är i viloläge. Detta är inte optimal, eftersom om klockan är i någon annan stat, fjärrkontrollen kommer inte att svara. Temperaturgivaren är exempelvis tillgång är relativt långsam. Under temperatur behandlingen, kommer att IR-mottagaren vara inaktiv. Ett bättre sätt är att använda avbrott (som jag är en nybörjare, jag visste inte om avbrott till senare).
Temperaturen har lästs i READ_TEMP_STATE, och tiden läses i READ_TIME_STATE. De här staterna definieras i början av programmet. -Tiden är läst varje 120milliseconds och temperatur avläses var 2 sekunder.
En annan sak att notera är att tiden uppdateringen bör vara mycket synkron. Alla tidskrävande åtgärder måste ske efter sekunder siffran uppdaterades. Så görs temperatur behandlingen omedelbart efter tiden uppdaterades. Det lämnar klockan en sekund att göra andra saker, tills nästa gång uppdatering. Om vi går till READ_TEMP_STATE från IDLE_STATE, kan den temperatur behandlingen uppstå när vi behöver uppdatera tiden och klockan sekunder siffran kommer inte att ändra i en konstant hastighet. I sådana fall understöder kryssa inte på ett påverka takten och det är störande, klockan ser mycket armatur.
Krävs bibliotekslistan:
- DHT sensor bibliotek
- LCD-I2C
- Arduino IRremote
- DS1302 bibliotek - ingår i min zip-fil, och här: DS1302 OOP
- Bil MP3 bibliotek - ingår i zipfilen
- tid konvertering bibliotek - ingår i zipfilen
Observera att DS1302 biblioteket är inte den ursprungliga filen, jag ändrade det till en klass struktur.