sunnuntai 16. huhtikuuta 2017

AIKA – harmia!

Mikä on oikea aika? Sen kysymyksen kuulee usein. Ei sitä kukaan kutenkaan tiedä! Edes sitä, mikä on aika, tietää tuskin kukaan. Ajan määritelmän meistä luonnollisesti tietää melkein jokainen. Tarkimpia ovat parhaat atomikellot, mutta heittoa on hiukan niissäkin. Meille ihmisille riittää arjessa hyvin väljempikin tarkkuus. Ainoastaan seisova kello näyttää oikeaa aikaa; ja sekin vain kaksi kertaa vuorokaudessa (paitsi tuo oikealla ylhäällä oleva, jos se seisoisi, näyttäisi neljä kertaa oikeaa aikaa, koska siinä on kaksi tuntiviisaria). Nuo minunkin kuvassa olevat kellot näyttävät ihan omaa aikaansa.
    Mutta ei tuo ajan epätarkkuus minua harmita, vaan se jäi viime toukokuussa tehdyssä UT-kellossa harmittamaan, että ajan korjaus tehtiin vain kerran vuorokaudessa. Sain nimittäin idean: jos kello edistää hiukan, niin kutsuttaessa kerran minutissa pientä viivettä (delay(nn) tai delayMicroseconds(nn)) ja täten viivästettäessä suoritusta, saataisiin kello käymään yksinkertaisesti (lähes) oikein. Moni varmaan huomaa heti, että ajatus on tyhmä. Minun piti oppia se kantapään kautta. Tuo siirtää tuonnemmaksi toki lukeman siirtoa näyttöön, koska käsky pysäyttää muun ohjeman suorituksen viiveen ajaksi, mutta ei se taustalla pyörivään ajan mittaukseen (millis();) mitään vaikuta.
    Ilman korjausta tämä kello (Arduino yksilöiden kideoskillaattorit varmaankin vaikuttavat ajan mittaukseen) jätätti hiukan vertailuarvolla const long CoL_EroSekunti = 999;. Tuo on vakio, mutta muutettaessa uuden ajan hetken muuttujaa (Ulo_UusiMilliSek), lyhentämällä sitä, voidaan käynti trimmata kohdalleen.
    Olen toteuttanut sen siten, että sekuntien ollessa 30, vähennetään muuttujasta tietty osa, jolloin seuraava vertailu aikaistuu. Se pitää voida tehdä vain kerran, joten apuna on pitomuuttuja (boolean Kep_Korjaus = false;), mikä saa arvon true, kun korjaus on tehty, ja tässä minun tapauksessani vapautan sen kahden (2) sekunnin kuluttua uuteen korjaukseen minuutin kuluttua. Oikean vähennysarvon hain interpoloimalla: Ulo_UusiMilliSek – 0; jätätti luonnollisesti edelleen, Ulo_UusiMilliSek – 100; edisti, Ulo_UusiMilliSek – 50; jätätti ja -75 edisti enää noin 1s per 10h. Vähensin tuosta arvosta vielä kaksi millisekuntia (=73) ja jäin seuraamaan kellon käyntiä.
    Kuten alussa viittasin ”oikeaan aikaan”, konkretisoitui ongelma tässäkin. Mihin verrata? Jos lähdetään siitä, että radion aikamerkki on tarkin (= pitkän piippauksen alkuhetki), niin kännykän kello on pari sekuntia jäljessä, tämän tietokoneen (automaattinen päivitys) vielä pari llisää ja television tekstisivujen kello vielä enemmän.
    Jos näillä korjauksilla pääsee noin 1sekunnin heittoon viikossa, niin se lienee riittävä käytännön tarkoituksiin. Se on myös helppo synkata radion aikamerkin kanssa. Tällä tarkkuudella todennäköisesti esim. lämpötilan muutokset alkavat jo vaikuttaa tarkkuuteen. Jos pitää päästä vielä parempaan, oikea ratkaisu lienee hankkia GPS – laite liitettäväksi Arduinoon.

 
Ohjelmasta tässä vain muutama oleellinen muutoskohta:

const long CoL_EroSekunti = 999;
boolean Kep_Korjaus = false;

//Ajan hallintasekvenssi
switch (Seq_Aika){
case 1:
…................
if(Int_Sekunti == 30 && Kep_Korjaus == false){
Kep_Korjaus = true;
Ulo_UusiMilliSek = Ulo_UusiMilliSek - 73;
if(Int_Sekunti == 32){Kep_Korjaus = false;}
…................
case 3:
if(Int_Tunti > 23){
Int_Tunti = 0;
Seq_Aika = 0;
}
break;