I din egen tid! (6 / 11 steg)
Steg 6: Grundläggande skript
Normal klocka indikation:
Skriptet kan delas in i några huvuddelar:
1. prata med modulen timer, med hjälp av protokoll som I2C
2. tala till displayen
3. samverkan, ställa in timmar, minuter, dagar i månaden
4. tillägg, som en LDR att reglera ljusstyrkan, kanske en temperaturgivare
5. roliga saker, som mönster och text
1. prata med modulen timer
Protokoll kan hittas på internet.
I skripten har jag använt en protocole för DS1307 och en annan för DS1302. Du kan använda exempelmanus som svarta lådor. Du måste förstå formatet på data kommer ut eller gå in på dessa svarta lådor.
Så använder DS1307 DateTime-format för RTC.lib. För DS1302 har du en struct (C programmering sak) med olika typer av format för samma data.
2. tala till displayen
Jag gjorde en "talande till modulen timer" och överförde data i variabeln DateTime till en array "myNumber". Denna matris användes till att överföra siffrorna två och två till displayen.
så:
DateTime nu = rtc.now();
myNumber [2] = now.hour () / 10;
myNumber [3] = now.hour () % 10.
myNumber [0] = now.day () / 10;
myNumber [1] = now.day () % 10.
myNumber [4] = now.minute () / 10;
myNumber [5] = now.minute() % 10.
myNumber [6] = now.second () / 10;
myNumber [7] = now.second() % 10.
Du ser jag har att separera de transeuropeiska näten och som använder den modulo och division operatörerna.
(För ds1302 jag fick göra samma trick, men med rtc struct.)
Då Använd jag en timer för att få antalet siffror till displayen en efter en, men så snabbt som ögat ser dessa siffror på samma gång:
ställa in timern:
noInterrupts(); Inaktivera alla avbrott
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 5; 10 - 200 / / jämför match register 16MHz/256 / 2Hz
TCCR1B | = (1 << WGM12); CTC-läge
TCCR1B | = (1 << CS12); 256 prescaler
TIMSK1 | = (1 << OCIE1A); Aktivera timern jämför avbrott
interrupts(); Aktivera alla avbrott
I rutinen timer överföra jag siffrorna:
ISR(TIMER1_COMPA_vect) / / timer jämföra avbryta tjänsten rutinmässiga {
ledCounter ++; / / räknar från 0 till 7
ledCounter = (ledCounter) %8;
digitalWrite(slaveSelectPin,LOW);
SPI.transfer (1 << (ledCounter));
unsigned char num = myNumber [ledCounter]; //getting matrismedlemmen
letterTransfer(num); med hjälp av kodning och gör överföringen
digitalWrite(slaveSelectPin,HIGH);
}