0,00 €

V košarici ni izdelkov.

0,00 €

V košarici ni izdelkov.

More
    DomovBaza znanjaProgramiranje z Arduino (4)

    Merjenje časa je zelo verjetno ena prvih stvari, ki jih boste merili z vašim Arduinom. Tudi ko nimamo priklopljenega nobenega senzorja ali aktuatorja je malo verjetno, da bomo lahko shajali brez meritve časa. Že samo izpisovanje spremenljivk na zaslon je treba z merjenjem časa pravilno “dozirati”, sicer nas Arduino dobesedno zasuje s podatki preko serijskih vrat. V tem delu si bomo torej ogledali kako Arduino meri čas in na kakšne načine so še uporabne njegove notranje ure.

    Zapravljanje časa z Arduinom

    Arduino razvojno okolje ima za merjenje in odmerjanje časa pripravljene 4 lične funkcije:

    delay(unsigned long)
    delayMicroseconds(unsigned int)
    unsigned long millis()
    unsigned long micros()

    Slike niUporaba je sila enostavna: delay() in delayMicroseconds() povzročita, da se naš program ustavi za toliko milisekund ali mikrosekund, kot določimo s parametrom. Med tem časom program ne izvaja skoraj ničesar drugega. Izvajajo se lahko prekinitvene funkcije (delay funkcija namreč ne izklopi prekinitev), pa tudi na serijskih vratih ne bomo zamudili ničesar, če le ne počivamo predolgo. Millis() in micros() vrneta število milisekund oziroma mikrosekund, ki so pretekle od zadnjega reseta čipa.

    Da ne bomo tako suhoparni, si poglejmo funkciji delay() in millis() na primeru. Uporaba delayMicroseconds() in micros() je povsem podobna, upoštevamo le, da je pri delayMicroseconds maksimalna vrednost čakanja 16383 mikrosekund, saj je parameter tipa signed int. Recimo, da merimo temperaturo iz analognega temperaturnega senzorja kot je LM35. Pri tem senzorju merimo temperaturo preko merjenja napetosti srednjem priključku senzorja (Slika 1), napaja pa se lahko iz 5V priključka Arduina. Ena stopinja predstavlja 10mV in ker je 5V ustreza 1023 razdelkov, merjeno vrednost pomnožimo z 0.448 (5V/(1023*0.01V)) in dobimo temperaturo v stopinjah Celzija. Za merjenje napetosti uporabimo funkcijo analogRead().

    Preprost program, ki odčituje temperaturo in jo vsako sekundo izpisuje preko serijskih vrat bi izgledal takole kot kaže program. Dokler je merjenje temperature vse, kar Arduino počne, je vse v redu. A v teh kriznih časih si še mikrokontrolerji ne morejo več privoščiti zapravljanja časa, ampak morajo med posameznimi meritvami temperature delati kaj koristnega, recimo komunicirati s kako drugo napravo, preračunavati, ipd.

    V tem primeru bi na prvo žogo (ali LEDico) zgornji program prepisali takole, kot kaže program. Tako, sedaj se bo večino časa izvajala funkcija delajKajKoristnega(), le približno vsako sekundo bo millis() vrnila število, ki je večje od casMeritve. Takrat se bo izmerila temperatura in casMeritve se bo postavil eno sekundo v prihodnost. Preprosto. No, gornja funkcija ima majho napakico, ki lahko povzroča težave, čeprav se redko pojavijo. Napaka izhaja iz dejstva, da ima millis() procedura omejen obseg, ki je tipa unsigned long. To so štirje bajti oziroma 2^32 vrednosti (desetiško 4294967296). Ogromna številka, a vsega lepega je enkrat konec. Ko millis() pride do konca obsega enostavno preskoči na 0. Za millis() je to približno 49,7dni za micros() pa približno 70 minut.

    Celotni članek

    Programiranje z Arduino (4)

    Tempero s.p.

    Lokavec 1g, 5270 Ajdovščina

    T: 068 158320

    www.tehnologija.biz

    2013_SE214_25