Kazalo:

Arduino časovne metode z Millisom (): 4 koraki
Arduino časovne metode z Millisom (): 4 koraki

Video: Arduino časovne metode z Millisom (): 4 koraki

Video: Arduino časovne metode z Millisom (): 4 koraki
Video: Использование плат Digispark Attiny85 Mini Arduino: Урок 108 2024, November
Anonim
Arduino metode merjenja časa z Millisom ()
Arduino metode merjenja časa z Millisom ()

V tem članku predstavljamo millis (); funkcijo in jo uporabite za ustvarjanje različnih primerov merjenja časa.

Millis? Nič skupnega s sinhronizatorji za ustnice … upajmo, da ste milli prepoznali kot numerično predpono za tisočinko; to je množenje merske enote z 0,001 (ali deset na stopnjo minus 3).

Zanimivo je, da bodo naši sistemi Arduino šteli število milisekund (tisoč sekund) od začetka izvajanja skice, dokler število ne doseže največjega števila, ki ga je mogoče shraniti v spremenljivko unsigned long (32-bitno [štiri bajtno] celo število -to se giblje od nič do (2^32) -1. (2^32) -1 ali 4294967295 milisekund se pretvori v 49,71027-ak dni.

Števec se ponastavi, ko se Arduino ponastavi, doseže največjo vrednost ali se naloži nova skica. Če želite dobiti vrednost števca na določenem stičišču, samo pokličite funkcijo - na primer:

start = millis ();

Kjer je start nepodpisana dolga spremenljivka. Tukaj je zelo preprost primer, ki vam prikazuje millis () v akciji:

/ * demonstracija millis () */

dolgo podpisan podpis, končan, pretekel;

void setup ()

{Serial.begin (9600); }

void loop ()

{Serial.println ("Začni …"); start = millis (); zamuda (1000); končano = millis (); Serial.println ("Končano"); preteklo = končan zagon; Serial.print (preteklo); Serial.println ("pretekle milisekunde"); Serial.println (); zamuda (500); }

Skica shrani trenutno število milis na začetku, nato počaka eno sekundo in nato vrednost milis shrani v dokončano. Na koncu izračuna pretečeni čas zamude. Na naslednjem izpisu zaslona serijskega monitorja lahko vidite, da trajanje ni bilo vedno točno 1000 milisekund, kot je prikazano na sliki.

Korak 1:

Slika
Slika

Poenostavljeno povedano, funkcija millis uporablja notranji števec v mikrokrmilniku ATmega v osrčju vašega Arduina. Ta števec povečuje vsak cikel ure - kar se zgodi (v standardnem Arduinu in združljivih) pri taktu 16 Mhz. To hitrost nadzira kristal na plošči Arduino (srebrna stvar z vtisnjenim T16.000).

2. korak:

Slika
Slika

Natančnost kristala se lahko razlikuje glede na zunanjo temperaturo in toleranco samega kristala. To pa bo vplivalo na natančnost vašega rezultata milis. Nenavadne izkušnje poročajo, da je premik v časovni natančnosti lahko približno tri ali štiri sekunde na štiriindvajset ur.

Če uporabljate ploščo ali svojo različico, ki namesto kristala uporablja keramični resonator, upoštevajte, da niso tako natančni in bodo uvedli možnost višjih ravni odnašanja. Če potrebujete veliko višjo raven natančnosti merjenja časa, razmislite o posebnih merilnih sklopih časovnika, kot je Maxim DS3231.

Zdaj lahko milise uporabljamo za različne časovne funkcije. Kot je prikazano v skici prejšnjega primera, lahko izračunamo pretečeni čas. Za nadaljevanje te ideje naredimo preprosto štoparico. To je lahko tako preprosto ali tako zapleteno, kot je potrebno, vendar se bomo v tem primeru obrnili k preprostemu.

Kar zadeva strojno opremo, bomo imeli dva gumba-Start in Stop-s 10k ohmskimi uporovnimi upori, priključenimi na digitalne zatiče 2 in 3. Ko uporabnik pritisne start, bo skica zabeležila vrednost za milise - potem ko bo pritisnjen stop, bo skica spet zabeležila vrednost za milise, izračunala in prikazala pretečeni čas. Uporabnik lahko nato pritisne start, da ponovi postopek, ali pa ustavi za posodobljene podatke. Tukaj je skica:

/* Super-osnovna štoparica z uporabo millis (); */

dolgo podpisan podpis, končan, pretekel;

void setup ()

{Serial.begin (9600); pinMode (2, INPUT); // gumb za zagon pinMode (3, INPUT); // gumb za zaustavitev Serial.println ("Pritisnite 1 za zagon/ponastavitev, 2 za pretečeni čas"); }

void displayResult ()

{float h, m, s, ms; dolgo podpisan; preteklo = končan zagon; h = int (preteklo/3600000); nad = preteklo%3600000; m = int (več kot/60000); več kot = nad 6000000; s = int (več kot/1000); ms = več kot%1000; Serial.print ("Surovi pretečeni čas:"); Serial.println (preteklo); Serial.print ("Pretekli čas:"); Serijski.tisk (h, 0); Serial.print ("h"); Serijski.tisk (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

void loop ()

{if (digitalRead (2) == HIGH) {start = millis (); zamuda (200); // za debounce Serial.println ("Začetek …"); } if (digitalRead (3) == HIGH) {končano = millis (); zamuda (200); // za debounce displayResult (); }}

Klici na delay () se uporabljajo za odvračanje stikal - ti so neobvezni in njihova uporaba bo odvisna od vaše strojne opreme. Slika je primer izhoda serijskega monitorja skice - štoparica se je zagnala in nato šestkrat pritisnila gumb dva v časovnih obdobjih.

3. korak: Merilnik hitrosti…

Image
Image

Če bi imeli senzor na začetku in koncu fiksne razdalje, bi lahko izračunali hitrost: hitrost = razdalja ÷ čas.

Merilnik hitrosti lahko naredite tudi za gibanje na kolesih, na primer kolo. Trenutno nimamo kolesa, s katerim bi se lahko pogovarjali, vendar lahko opišemo, kako to storiti - to je precej preprosto. (Zavrnitev odgovornosti - to storite na lastno odgovornost itd.)

Najprej poglejmo potrebno matematiko. Morali boste poznati obseg kolesa. Strojna oprema - potrebovali boste senzor. Na primer - trstično stikalo in magnet. Smatrajte, da je trstično stikalo normalno odprt gumb in ga kot običajno povežite z 10 k ohmskim uporovnim uporom.

Drugi lahko uporabljajo senzor hodnega učinka-vsak zase). Zapomnite si iz matematičnega razreda, da za izračun obsega uporabite formulo: obseg = 2πr, kjer je r polmer kroga.

Zdaj, ko imate obseg kolesa, lahko to vrednost štejemo za našo "fiksno razdaljo", zato je mogoče hitrost izračunati z merjenjem pretečenega časa med celotnim vrtenjem.

Ko je senzor nameščen, bi moral delovati na enak način kot običajno odprt gumb, ki ga pritisnete ob vsakem vrtenju. Naša skica bo merila čas, ki je pretekel med vsakim impulzom iz senzorja.

Če želite to narediti, bo naš primer povezal izhod senzorja z digitalnim zatičem 2 - saj bo sprožil prekinitev za izračun hitrosti. Skica bo sicer prikazala hitrost na običajnem LCD modulu z vmesnikom I2C. Predlagan je vmesnik I2C, saj za to potrebujete le 4 žice od plošče Arduino do LCD -ja - manj žic, tem bolje.

Tu je skica za vaš vpogled:

/*Osnovni merilnik hitrosti z uporabo millis (); */

#include "Wire.h" // za LCD vodilo I2C

#include "LiquidCrystal_I2C.h" // za LCD modul vodila I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // nastavite naslov LCD na 0x27 za 16 -mestni in 2 -vrstni prikaz

plavajoči zagon, končan;

plovec pretekel, čas; float circMetric = 1,2; // obseg kolesa glede na položaj senzorja (v metrih) float circImperial; // z uporabo 1 kilometra = 0,621371192 milj float speedk, speedm; // vsebuje izračunane vrednosti hitrosti v metričnih in imperialnih vrednostih

void setup ()

{attachInterrupt (0, speedCalc, RISING); // preklic, poklican, ko senzorji pošljejo digitalno 2 visoko (pri vsakem vrtenju kolesa) start = millis (); // nastavitev LCD lcd.init (); // inicializiramo lcd lcd.backlight (); // vklop osvetlitve ozadja LCD lcd.clear (); lcd.println ("Nosite čelado!"); zamuda (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // pretvorimo metriko v imperialno za izračune MPH}

void speedCalc ()

{elapsed = millis ()-začetek; start = millis (); speedk = (3600*circMetric)/preteklo; // km/h hitrostm = (3600*circImperial)/preteklo; // Mili na uro}

void loop ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km/h"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (preteklo)); lcd.print ("ms/rev"); zamuda (1000); // prilagajanje po osebnih željah za zmanjšanje utripanja}

Ne dogaja se toliko - vsakič, ko kolo opravi en obrat, signal senzorja preide iz nizkega v visoko - sproži prekinitev, ki pokliče funkcijo speedCalc ().

S tem se odčita milis () in nato izračuna razlika med trenutnim odčitkom in prejšnjim odčitkom - ta vrednost postane čas za prehod razdalje (ki je obseg kolesa glede na senzor) - shranjen v

float circMetric = 1,2;

in se meri v metrih). Končno izračuna hitrost v km/h in MPH. Med prekinitvami skica prikazuje radovednost na LCD -prikazovalniku posodobljene podatke o hitrosti, pa tudi surovo vrednost časa za vsak obrat. V resnici mislim, da nihče ne bi namestil LCD -ja na kolo, morda bi bil bolj primeren LED zaslon.

Medtem si lahko ogledate, kako ta primer deluje, v naslednjem kratkem video posnetku. Namesto kolesnega kolesa in trstičnega stikala/magneta sem priključil izhod kvadratnega vala iz funkcijskega generatorja na prekinitveni zatič, da simuliram impulze s senzorja, tako da lahko dobite predstavo o njegovem delovanju.

4. korak:

To zaenkrat povzema uporabo millis (). Obstaja tudi mikroskop (); funkcija, ki šteje mikrosekunde.

Torej, tukaj je še ena praktična funkcija, ki omogoča, da se v svetu Arduino reši več težav. Kot vedno, zdaj je na vas in vaši domišljiji, da poiščete nekaj, kar bi lahko obvladali ali se dotaknili drugih prevarantov.

To objavo vam je predstavil pmdway.com - vse za ustvarjalce in navdušence nad elektroniko z brezplačno dostavo po vsem svetu.

Priporočena: