Stap 6: Basic Scripts
Normale klok indicatie:
Het script kan worden verdeeld in enkele grote delen:
1. praat met de timer-module, met behulp van protocoles zoals I2C
2. talking naar het display
3. interactie, uur, minuten, dagen in de maand instellen
4. add-ons, zoals een LDR te regelen van de helderheid, misschien een temperatuursensor
5. grappige dingen, zoals patronen en tekst
1. praat met de timer-module
De protocoles kan worden gevonden op het internet.
Ik heb in de scripts een protocole gebruikt voor de DS1307 en een andere voor de DS1302. U kunt de voorbeeldscripts als zwarte dozen. U moet begrijpen de indeling van de gegevens die uit of in te gaan op deze zwarte dozen.
Dus de DS1307 maakt gebruik van de DateTime-indeling van de RTC.lib. Voor de DS1302 heb je een struct (C programming ding) met verschillende type formaten voor dezelfde gegevens.
2. talking naar het display
Ik heb een "pratende naar de timer-module" en de gegevens in de DateTime-variabele overgebracht naar een matrix "myNumber". Deze matrix werd gebruikt om de cijfers twee aan twee overbrengen in het display.
dus:
DateTime now = 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;
U ziet dat ik heb om te scheiden van de ten's en de lidstaten, met behulp van de modulo en de exploitanten van de divisie.
(Voor de ds1302 ik had de zelfde truc, maar met behulp van de rtc struct.)
Dan gebruikte ik een timer om de nummer cijfers naar het display één voor één, maar zo snel dat je oog deze cijfers allemaal op hetzelfde moment ziet:
de timer instellen:
noInterrupts(); // disable all interrupts TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 5; //10 - 200 // compare match register 16MHz/256/2Hz TCCR1B |= (1 << WGM12); // CTC mode TCCR1B |= (1 << CS12); // 256 prescaler TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt interrupts(); // enable all interrupts
In de timer routine overbrengen ik naar de cijfers:
ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine { ledCounter++;// counting from 0 to 7 ledCounter = (ledCounter)%8; digitalWrite(slaveSelectPin,LOW); SPI.transfer(1<<(ledCounter)); unsigned char num = myNumber[ledCounter];//getting the array member letterTransfer(num); //using the coding and doing the transfer digitalWrite(slaveSelectPin,HIGH); }