Att göra en Maya Tzolkin kalendern (5 / 5 steg)
Steg 5: Arduino kod
Slutligen, den kod som använder en RTC chip för att ställa in tiden i styrelsen, sedan julianska datumet beräknas och från det funkar där i de två Tzolkin rotationer infaller. Det skriver sedan lämplig bit sekvensen till de SKIFT register. Detta är min första Arduino program jag förlitade sig tungt på de refererade källorna och Arduino kokboken att sätta ihop.
Kod:
/ * Tack till följande källor för delar av denna kod och resurser:
Lekplats tid bibliotek: http://www.arduino.cc/playground/Code/Time
RTC chip: https://www.sparkfun.com/products/99
beräkna dagar: http://arduino.cc/forum/index.php?topic=94925.0
Definition: Julianskt datum (JD) är en kontinuerlig räkna dagar från 1 januari 4713 F.Kr.
*/
#include < Time.h > //include bibliotek som behövs för tidberäkning av
#include < Wire.h >
#include < DS1307RTC.h > / / grundläggande DS1307 bibliotek som returnerar tid som en tid
int dataPin = 2; definiera Pins för skiftregister
int clockPin = 3;
int latchPin = 4;
int seqtzn1 [] = {128,64,32,16,8,4,2,1,0,0,0,0,0}; //arrays kontrollera lysdioderna
int seqtzn2 [] = {0,0,0,0,0,0,0,0,128,64,32,16,8}.
int seqtzds1 [] = {128,64,32,16,8,4,2,1,0,0,0,0,0,0,0,0,0,0,0,0}.
int seqtzds2 [] = {0,0,0,0,0,0,0,0,128,64,32,16,8,4,2,1,0,0,0,0}.
int seqtzds3 [] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,64,32,16}.
void setup()
{
Serial.BEGIN(9600); Ställ in seriell kommunikation till dator
pinMode (dataPin, produktionen); Ställ in pinkodsskydd lägen
pinMode (latchPin, produktionen);
pinMode (clockPin, produktionen);
setSyncProvider(RTC.get); funktionen för att få tiden från RTC
IF(timeStatus()! = tidInställning)
Serial.println ("kan inte synkronisera med RTC");
annat
Serial.println ("RTC har angett systemtiden");
}
void loop()
{
beräkna Julian Date och de två Tzolkin tal med hjälp av funktionerna nedan
långa jd = JulianDate();
int tzn = TzolkinNumber(jd);
int tzds = TzolkinDaysign(jd);
Serial.println(JD);
Serial.println(tzn);
Serial.println(tzds);
Skicka data till SKIFT register
digitalWrite (latchPin, låg); dra spärren låg börja skicka data
shiftOut (dataPin, clockPin, LSBFIRST, seqtzds3[tzds]);
shiftOut (dataPin, clockPin, LSBFIRST, seqtzds2[tzds]);
shiftOut (dataPin, clockPin, LSBFIRST, seqtzds1[tzds]);
shiftOut (dataPin, clockPin, LSBFIRST, seqtzn2[tzn]); Skicka data
shiftOut (dataPin, clockPin, LSBFIRST, seqtzn1[tzn]);
digitalWrite (latchPin, hög); dra spärren högt sluta skicka data
Delay(300000); vänta ett tag innan du upprepar
}
beräkning av Julian datum jd
lång JulianDate() {
tid t = now(); lagra aktuell tid i tid variabel t
int todayDay = day(t); dagen för viss tid t
int todayMonth = month(t); månaden för givna tiden t
int todayYear = year(t); året för den angivna tid t
långa århundraden = todayYear/100.
långa språng = århundraden/4;
lång leapDays = 2 - århundraden + språng; Obs är negativa!
lång yearDays = 365.25 * (todayYear + 4716); dagar kvar till 1 jan i år
lång monthDays = 30.6001* (todayMonth + 1); dagar till 1 månad
långa leda = leapDays + todayDay + monthDays + yearDays-1524.5;
returnera resultat;
}
beräkning av de två Tzolkin nummer som ger position i Tzolkin rotation
int TzolkinNumber (lång jd) {
int resultatet = (jd - 2456214) % 13. Tzolkin day numrera beräknas som 0 till 12
returnera resultat;
}
int TzolkinDaysign (lång jd) {
int resultatet = (jd - 2456203) % 20; beräkna Tzolkin day tecken 0 till 19 från 10.3.12 och nummer 0 wikipedia ordning
returnera resultat;
}