lauantai 9. huhtikuuta 2016

Tarkka aika millis()

Käsky millis() palauttaa kuluneen ajan millisekunneissa käynnistyshetkestä lähtien. Lause on muodoltaan sijoitus; muuttuja = millis(); Muuttuja on tyyppiä (unsigned long) eli etumerkitön pitkä integer. Tuo muuttuja varaa muistista 32 bitin alueen. Lasketaanpa eppabasicilla.

1 Dim SuurinLuku = 2 ^ 32 - 1
2 Print SuurinLuku
3 Dim Vuorokausi = 1000 * 60 * 60 * 24
4 Dim Aika = SuurinLuku / Vuorokausi
5 Print Aika

Tulostus: 4294967295
              49,71026962

Ylempi tulostus on suurin luku, mitä 32 bittinen muistipaikka voi sisältää (pienin on nolla). Alempi luku on vuorokausien määrä. Lähes 50 vuorokauden välein luku palaa nollaan ja kasvatus alkaa taas alusta.

Ohjelma 6
/***************************************
 *  Ohjelma 6: millis()
 *  09.04.2016
 *  Tarkka aika
 **************************************/
// Kellon määrittely
unsigned long Ulo_MilliSek = 0;
unsigned long Ulo_UusiMilliSek = 0;
const long CoL_EroSekunti = 999;
int Int_Sekunti = 0;
const int Con_LEDkel = 3;
boolean Bol_LEDkel = true;

// ASETUKSET: kertasuoritus
void setup(){
 Serial.begin(9600);  // Alustetaan sarjaliikenne   
 pinMode(Con_LEDkel, OUTPUT);
}// Asetuksen loppu

// PÄÄLOOPPI:  varsinainen suoritusosa. Jatkuva suoritus
void loop(){
// Sisäisen kellon käyttö
Ulo_MilliSek = millis();
  if(Ulo_MilliSek - Ulo_UusiMilliSek > CoL_EroSekunti){
    Ulo_UusiMilliSek = Ulo_MilliSek;
    Int_Sekunti++;
    Fun_Tulostus();
    Fun_LEDkel(Bol_LEDkel); // Aliohjelmakutsu
    Bol_LEDkel = !Bol_LEDkel; //Tilan kääntö
  }
delay(1);
} // Pääohjelman LOPPU

// FUNKTIOT
void Fun_Tulostus(){
Serial.print("Sekunnit :");  Serial.println(Int_Sekunti);
Serial.print("Millis arvo :");  Serial.println(Ulo_MilliSek);
} // Tulostuksen loppu
void Fun_LEDkel(boolean Tila){
    digitalWrite(Con_LEDkel, Tila);
}// Keltaisen LEDin funktion loppu

Olen huomannut, että tämä aika on hyvin tarkka. Joissakin sovelluksissani, joissa käyntiaika on useita vuorokausia, pysyy vuorokausiheitto alle sekunnin. Varmaankin eri yksilöiden kohdalla on vaihtelua. Jos seuraa pidemmän aikaa, voi tietysti tehdä ohjelmallisen korjauksen vaikka viikon välein. Jos tarvitsee todella tarkkaa aikaa, on tarjolla GPS-moduleita Arduinoihin.

Aluksi on tuohon millis()-käskyyn liittyvät määrittelyt. Keltaiseen LEDiin liittyvät ovat kopioitu edellisestä ohjelmasta. Asetuksissa on rivi: Serial.begin(9600); millä määritellään sarjaliikenne tietokoneen ohjelmatyökalun ja Arduinon välillä. Työkalun oikealla sivulla ylhäällä on pieni neliö, mitä klikkaamalla avautuu uusi ikkuna, mihin Arduino kirjoittaa tulostettavia asioita.


Pääohjelmassa kutsutaan tulostusaliohjelmaa Fun_Tulostus() ja siellä määritellään, mitä halutaan tulostaa. Käsky Serial.print() ei tee rivinvaihtoa, kun taas .println() suorittaa rivinvaihdon. Tämä on erittäin tärkeä ominaisuus etsittäessä virheitä. 

Ei kommentteja:

Lähetä kommentti