Arduino Tutorial: Millisin () käyttäminen viiveen sijaan()

tunnettu Arduino-funktio on delay(), joka keskeyttää ohjelman parametriksi määritellyn millisekunnin ajaksi.

millis(), toisaalta, on funktio, joka palauttaa millisekunnit, jotka ovat kuluneet ohjelman alusta.

ensi silmäyksellä saatat epäillä tämän toiminnon hyödyllisyyttä. Tosiasia on, että se on erittäin hyödyllinen monissa skenaarioissa, usein ”korvaa” delay() kokonaan. Katsotaan ensin, miten voimme käyttää millis() lähes täsmälleen samoin kuin delay().

Ajoituskysymykset ovat usein läsnä ohjelmoinnissa.

käyttäen milliä () muistuttavaa viivettä()

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {time_now = millis(); Serial.println("Hello"); while(millis() < time_now + period){//wait approx. ms}}

jos haluat koodisi pysähtyvän 1000 ms: n ajaksi jokaisen silmukan iteraation lopussa, yllä oleva koodi on hieman typerä. Sen sijaan voi käyttää vain delay(1000). Ainoa ero yllä olevan koodin ja koodin, jonka lopussa on delay(1000), välillä on se, että yllä olevan koodin silmukka kulkee melko tarkasti kerran sekunnissa. Koodissa delay(1000) silmukka suoritetaan hieman harvemmin, sillä myös Serial.println("Hello")suorittaminen kestää jonkin aikaa.

Miksi käyttää milliä () viiveen () sijaan?

tarkastelemme nyt kahta etua millis() verrattuna delay().

tarkka ajoitus

ensimmäinen etu, josta keskustelemme, on tarkka ajoitus. Käsittelimme tätä viimeisessä luvussa. millis() : llä voimme varmistaa, että silmukka kulkee niin usein kuin haluamme suoritusajasta riippumatta (tietenkin niin kauan kuin suoritusaika on vähemmän aikaa kuin halutaan). delay() tämä ei ole mahdollista, koska emme tiedä, kuinka pitkä silmukan suoritusaika on.

tämänkaltainen tarkka ajoitus on erittäin hyödyllinen muun muassa tietyllä taajuudella otettaessa näytteitä tai käytettäessä suodattimia.

estottomuus

toinen etu millis(): llä on se, että se ei estä meitä juoksemasta koodia ”odotellessa”.

sanotaan, että haluamme tulostaa ”Hello” – kappaleen sarjan päälle kerran sekunnissa tehden samalla muita juttuja. Tämä ei ole mahdollista delay(): llä, koska se keskeyttää koko koodin. Tässä on yksi tapa, jolla voimme tehdä tämän.:

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_now + period){time_now += period;Serial.println("Hello");} //Run other code}

tämä koodinpätkä on melko samanlainen kuin ensimmäinen kappale, paitsi että se ei estä ohjelman muuta osaa, kun sitä ei tulosteta sarjamuodossa.

esimerkki: yksinkertainen aikataulu

kirjoitetaan yksinkertainen esimerkki, jossa luodaan aikataulu, joka tulostaa tiettyjä tekstinpätkiä eri väliajoin.

#define INTERVAL_MESSAGE1 5000#define INTERVAL_MESSAGE2 7000#define INTERVAL_MESSAGE3 11000#define INTERVAL_MESSAGE4 13000unsigned long time_1 = 0;unsigned long time_2 = 0;unsigned long time_3 = 0;unsigned long time_4 = 0;void print_time(unsigned long time_millis);void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_1 + INTERVAL_MESSAGE1){time_1 +=INTERVAL_MESSAGE1;print_time(time_1);Serial.println("I'm message number one!");} if(millis() >= time_2 + INTERVAL_MESSAGE2){time_2 +=INTERVAL_MESSAGE2;print_time(time_2);Serial.println("Hello, I'm the second message.");} if(millis() >= time_3 + INTERVAL_MESSAGE3){time_3 +=INTERVAL_MESSAGE3;print_time(time_3);Serial.println("My name is Message the third.");} if(millis() >= time_4 + INTERVAL_MESSAGE4){time_4 += INTERVAL_MESSAGE4;print_time(time_4);Serial.println("Message four is in the house!");}}void print_time(unsigned long time_millis){Serial.print("Time: ");Serial.print(time_millis/1000);Serial.print("s - ");}

tältä näyttää sarjamonitorin ensimmäiset 60 sekuntia:

tämä on mukava ja helppo tapa synkronoida teloitukset koodiisi. Voit suorittaa muita koodia samanaikaisesti sekä.

Mikros () ja ylitsevuotava

aivan kuten delay() on mikrosekunnin versio nimeltään delayMicroseconds(), millis() on micros(). Jos tarvitaan parempaa resoluutiota, micros() voi olla oikea suunta.

Huomaa kuitenkin, että micros() ylivuoto alkaa noin 70 minuutin kuluttua, kun taas millis(): n 50 vuorokauden kuluttua. Tämä tarkoittaa, että funktioiden palautusarvot alkavat kokonaan nollasta.

vielä tärkeämpää: lue tämä blogikirjoitus, miten voit välttää ylivuodon kokonaan.

Yhteenveto

millis() ja micros() ovat todella käteviä funktioita, joita voi käyttää ajoitustehtävissä. Jos et ole tietoinen näistä, saatat päätyä käyttämään delay() sen sijaan, mikä ei aina toimi niin hyvin (jos ollenkaan).

lisää Arduino-vinkkejä & temppuja löydät Arduino-Tutorials-blogin kategoriasta. Pysy kuulolla lisää Arduino-aiheeseen liittyvää sisältöä myös tulevaisuudessa!

Vastaa

Sähköpostiosoitettasi ei julkaista.