Hold tiden med Arduino

Hold tiden med Arduino

I tidligere kapitler har vi brukt delay-funksjonen for å få ting til å skje med forsinkelse. Arduino Uno er imidlertid i seg selv dårlig til å holde styr på tiden. I dette kapittelet skal vi derfor se nærmere på hvordan vi kan få den til å holde tiden på en pålitelig måte.

Behovet av RTC-modul

Arduino Uno har ingen intern klokke. Den eneste måten Arduino noenlunde kan holde tiden på, er å bruke prosessorens klokkefrekvens som referanse. Det fungerer bra for å få ting til å skje med omtrentlig forsinkelse, men det kan ikke brukes i sammenhenger der nøyaktig tid er vesentlig.

Tidsproblematikken kan løses på to måter. Enten kan tiden hentes fra en nettleser, eller så kan utviklingskortet kompletteres med en RTC-modul (Real Time Clock). Det er en modul som holder tiden med samme type kvartskrystall som finnes i armbåndsur og veggklokker.

I bokens medfølgende komponentpakke er det en RTC-modul. Den drives av en vanlig CR2032-knappcelle og har et avvik på ca. ett minutt per år.

Bygge en digital klokke

I følgende eksempel skal vi bygge en digital klokke ved hjelp av en RTC-modul og et OLED-display. Den fysiske koblingen ser slik ut: 

Illustrasjon laget med komponenter fra Fritzing (fritzing.org). CC BY-SA 3.0

Legg merke til at både displayet og RTC-modulen er koblet til I²C-porten! Dette er mulig fordi I²C-tilbehøret har ulike adresser, og I²C-protokollen er smart nok til å kunne adressere tilbehøret individuelt.

Vi må skrive to skisser: en for å stille inn klokken og en for å vise klokken. Programmet som stiller inn klokken, skal bare kjøres én gang (og ved endring fra f.eks. sommertid til normaltid).

Før vi skriver skissene, må vi installere biblioteket Rtc by Makuna. Vi innleder derfor tidsinnstillingsskissen med å importere det biblioteket og Wire-biblioteket. Vi lager en ny RTC-modul og bruker setup-funksjonen til å skrive tiden da koden ble kompilert, til RTC-modulen. På den måten synkroniseres RTC-modulens tid med datamaskinens tid.

RtcOledSetTime.ino

Obs! Vi får ingen tilbakemelding om at tiden har blitt stilt om. Hvis vi vil få det, kan vi be Arduinoen om å informere om det i Seriell overvåker.

Skissen for å vise klokken er litt lenger, men baseres i stor grad på skissen vi skrev i Vise tekst og grafikk på displayer. Vi importerer nødvendige biblioteker og lager både et nytt display og en ny RTC-modul. Vi deklarerer variabler som vi skal bruke til å lagre timer, minutter og sekunder.

Del 1/3 av RtcOledClock.ino

Setup-funksjonen er tom, og loop-funksjonen ser helt lik ut som i tidligere eksempel. Vi avslutter bare loop-funksjonen med å kalle opp funksjonen updateTime, som vi bruker til å hente tiden fra RTC-modulen.

Del 2/3 av RtcOledClock.ino

Draw-funksjonen skriver vi helt fra begynnelsen av. Vi velger skrifttypen vi vil ha og lager et char-array for tegnene som skal skrives ut. Funksjonen sprintf lar oss formatere om dataene fra variablene hours, minutes og seconds, slik at tidspunktet alltid skrives på samme måte (med to sifre for timer, to sifre for minutter og to sifre for sekunder). Avslutningsvis skriver vi ut tegnene fra char-arrayet på displayet.

Del 3/3 av RtcOledClock.ino

Sist endret: 2017-09-08