Stap 2: Code - algemeen
Alle code, met uitzondering van de kleine availableMemory()-routine, kleine werd volledig van kras door mij geschreven.
Ik aanvankelijk dacht dat de Tetris-deel van de code zou ingewikkelder dan de tijdwaarneming deel. Ik kon niet zijn geweest meer mis. Schrijven van dat Tetris voor de Arduino was een taart lopen in vergelijking met een wekker met alle functies die wilde ik. Beschrijvingen van een aantal van de programmering problemen zijn in de volgende paar stappen.
Veel parameters zijn instelbaar in de code. Ze zijn allemaal op de top van het hoofdbestand en omvatten:
-Alle toewijzingen van de draad/pin
-Standaard-tijd en beide alarmen
-Constanten de frequentie van de zoemer definiëren (standaard 4 kHz)
-Tijd die het alarm wordt gedempt telkens wanneer een knop wordt ingedrukt (standaard 30 s)
-Standaard backlight helderheid 0-128 (standaard 128)
Veel parameters zijn instelbaar via de klok zelf:
-Of dikker of kleinere stukjes worden gebruikt
-Als 2 aangepaste tekens worden gebruikt voor de stukken en 6 voor het puin hieronder of 4 personen en 4 worden gebruikt.
-Lengte van de snooze in minuten (standaard 7 min)
-Lengte van de snooze in seconden (standaard 30 seconden voor een totaal van 7 min 30 sec)
-Aantal keren uitstellen kan worden getroffen voordat u moet wakker worden (standaard 2)
-Of het raken van de snooze is absoluut of relatief, als de snooze-tijd wordt toegevoegd aan de oorspronkelijke alarmtijd of de knop wordt geraakt
-Hoeveel regels van Tetris moeten worden weggewerkt worden verklaard wakker (standaard 4)
-De klok zijn u standaardinstellingen wilt herstellen
-Sla extras zoals am/pm, dag van de week en die alarm is ingesteld in- en uitschakelen
-De huidige softwareversie display
-Opslaan en herstellen EEPROM
Veel parameters worden opgeslagen in EEPROM te overleven als macht ooit verloren volledig is. Dit wordt elke dag om middernacht opgeslagen als een van de parameters hebt gewijzigd. Zij omvatten:
-Huidige tijd (inclusief de dag van de week), en beide alarmen
-Backlight waarde
-Tetris werkmodus (zie stap 3 voor de beschrijving)
-Snooze variabelen
-Of de extra's zijn in- of uitschakelen
-Hoeveel regels duurt het wissen in Tetris verklaar jezelf wakker
Tijd bijhouden is gemaakt eenvoudig dankzij de goede mensen van Arduino van uitstekende uitvoering van de millis() functie. Die functie wordt uitgevoerd in een interrupt en is gemaakt om niet te missen een teek. Alles wat ik heb te doen is regelmatig toevoegen de tijd die is verstreken sinds de laatste aanroep van millis() van de huidige tijd. Makkelijk als pie.
Ik trek een interessante manoeuvre om te zorgen voor het probleem van de roll-over millis(). De functie millis() gebruikt een niet-ondertekende long-variabele en de 32 bits betekent het tot 4294967295 kan gaan. Maar aangezien het het bijhouden van milliseconden dat betekent het zal rollen over elke 50 dagen of zo. Dit is meestal geen probleem, maar aangezien dit project voortdurend loopt en is afhankelijk van de functie van dat millis() moeten we rekening dat overloop. Wat ik doe is het controleren van de millis()-functie en wanneer het de halverwege nemen sommige actie overgaat. Wanneer het uitkomt in de code (niets tijdkritisch gebeurt) aftrekken ik de helft van de totale waarde van de millis()-functie, zowel vanuit de functie zelf mijn eigen variabelen voor tijdwaarneming. Op die manier het kan rollen rechts voorbij dit halverwege wijs en wanneer het veilig halfvol tijd van alles aftrekken en rol op. Het is een beetje moeilijk uit te leggen, onderzoekt de code zou kunnen helpen, maar het werkt als een charme.