Håll tiden med Arduino

Håll tiden med Arduino

I tidigare kapitel har vi använt delay-funktionen för att få saker att ske med fördröjning. Arduino Uno i sig är dock dålig på att hålla tiden. I detta kapitel ska vi därför se närmare på hur vi kan få tillförlitlig tidshållning.

Behovet av RTC-modul

Arduino Uno har ingen intern klocka på sig. Det enda sättet för Arduinon att hålla tiden någorlunda är att använda processorns klockfrekvens som referens. Det fungerar bra för att få saker att hända med ungefärlig fördröjning, men det är oanvändbart i sammanhang då den exakta tiden är väsentlig. 

Tidsproblematiken kan lösas på två sätt. Antingen kan tiden hämtas från en webbserver eller så kan utvecklingskortet kompletteras med en RTC-modul (Real Time Clock). Det är en modul som håller tiden med samma typ av kvartskristall som sitter i våra armbandsur och väggklockor. 

I bokens tillhörande komponentkit finns en RTC-modul. Den drivs med en vanlig CR2032-knappcell och har en avvikelse på ungefär en minut per år.

Bygg en digital klocka

I följande exempel vill vi bygga en digital klocka med hjälp av en RTC-modul och en OLED-display. Den hårdvarumässiga kopplingen ser ut på följande vis. 

Illustration gjord med komponenter från Fritzing (fritzing.org). CC BY-SA 3.0

Lägg märke till att både displayen och RTC-modulen är kopplade till I²C-porten! Detta är möjligt eftersom I²C-tillbehören har olika adresser och I²C-protokollet är smart nog för att kunna adressera tillbehören individuellt. 

Vi behöver skriva två sketcher: en sketch för att ställa in klockan och en sketch för att visa klockan. Programmet som ställer in klockan ska enbart köras en inledande gång (och vid ändring från t.ex. sommartid till normaltid). 

Innan vi skriver sketcherna måste vi installera biblioteket Rtc by Makuna. Vi inleder sedan tidsinställningssketchen med att importera det biblioteket och Wire-biblioteket. Vi skapar en ny RTC-modul och använder setup-funktionen för att skriva tiden då koden kompilerades till RTC-modulen. På så sätt synkroniseras RTC-modulens tid med datorns tid. 

RtcOledSetTime.ino

Obs! Vi får ingen återkoppling om att tiden har ställts om. Om vi vill få det kan vi be Arduinon att informera om det i Serial monitor. 

Sketchen för att visa klockan är lite längre, men baseras i stor utsträckning på sketchen som vi skrev i Visa text och grafik på displayer. Vi importerar nödvändiga bibliotek och skapar både en ny display och en ny RTC-modul. Vi deklarerar variabler som vi ska använda för att lagra timmar, minuter och sekunder. 

Del 1/3 av RtcOledClock.ino

Setup-funktionen är tom och loop-funktionen ser likadan ut som i tidigare exempel. Vi avslutar bara loop-funktionen med att anropa funktionen updateTime som vi använder för att hämta tiden från RTC-modulen.

Del 2/3 av RtcOledClock.ino

Draw-funktionen skriver vi om från början. Vi väljer vilket typsnitt vi vill ha och skapar en char-array för tecknen som ska skrivas ut. Funktionen spritf låter oss formatera om datan från variablerna hours, minutes och seconds så att tidpunkten alltid skrivs på samma sätt (med två siffror för timmar, två siffror för minuter och två siffror för sekunder). Avslutningsvis skriver vi ut tecknen från char-arrayen på displayen.

Del 3/3 av RtcOledClock.ino

Senast ändrad: 2017-02-27