Väckarklocka med Tetris att bevisa att du är vaken (2 / 16 steg)
Steg 2: Kod - allmänt
All kod, med mindre undantag för små availableMemory() rutin, skrevs helt från grunden av mig.
Jag trodde först det Tetris med koden skulle vara mer komplicerat än tiden att hålla del. Jag kunde inte ha varit mer fel. Skriver Tetris för Arduino var en kaka promenad jämfört med en väckarklocka med alla funktioner ville jag. Beskrivningar av några av frågorna som programmering är i nästa några steg.
Många parametrar är justerbara i koden. De är alla överst i huvudfilen och inkluderar:
-Alla wire/Stifttilldelningar
-Standard tid och både larm
-Konstanter definiera Summer frekvens (standard 4 kHz)
-Tiden som larmet tystas varje gång en knapp trycks (standard 30 s)
-Standard bakgrundsbelysningens ljusstyrka 0-128 (standard 128)
Många parametrar är justerbara genom klockan själv:
-Huruvida tjockare eller mindre bitar används
-Om 2 anpassade tecken används för delar och 6 för spillrorna nedan eller 4 och 4 används.
-Längden på snooze i minuter (standard 7 min)
-Längden på snooze i sekunder (standard 30 sek för sammanlagt 7 min 30 SEK)
-Många gånger snooze kan drabbas innan du måste vakna (standard 2)
-Huruvida slå snooze är absolut eller relativ, om den snooze-tid läggs till den ursprungliga alarmtiden eller tiden knappen är hit
-Hur många rader av Tetris måste rensas deklarerade vaken (standard 4)
-Återställa klockan att det är standardinställningarna
-Stäng extras som am/pm, veckodag och vilka alarm är inställt på och av
-Visa aktuell programversion
-Spara och återställa EEPROM
Många parametrar sparas i EEPROM att överleva om power någonsin försvinner helt. Varje dag vid midnatt sparas om någon av parametrarna har ändrats. De omfattar:
-Aktuell tid (inklusive dag i veckan), och båda larm
-Bakgrundsbelysning värde
-Tetris driftläge (se steg 3 beskrivning)
-Snooze variabler
-Om extramaterialet är på eller av
-Hur många rader som behövs för att rensa i Tetris att deklarera själv vaken
Tidhållning görs lätt tack till bra folk på Arduinos utmärkta genomförandet av millis() funktion. Att funktionen körs i ett avbrott och görs för att inte missa en fästing. Allt jag måste göra är att regelbundet lägga tid som förflutit sedan det senaste anropet av millis() till aktuell tid. Lätt som en plätt.
Jag drar en intressant manöver för att ta hand om millis() vältning problemet. Funktionen millis() används en osignerade långa variabel och 32 bitar innebär det kan gå upp till 4294967295. Men eftersom det att hålla reda på millisekunder som innebär att det kommer rulla över varje 50 dagar eller så. Detta är oftast inte ett problem men eftersom detta projekt körs kontinuerligt och förlitar sig på att millis() funktion vi behöva ta hänsyn till att spill. Vad jag gör är att övervaka funktionen millis() och när den passerar halvvägs ta några åtgärder. När det passar i koden (inget tid kritiska sker) subtrahera jag halva det totala värdet av funktionen millis() både från själva funktionen och från min egen tid att hålla variabler. Sätt det kan rulla rätt förbi detta halvvägs pekar och när det är säkert subtrahera halvfulla tid från allt och rulla på. Det är lite svårt att förklara, granska koden kan hjälpa, men det fungerar som smort.