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