Kazalo:
Video: Arduino časovne metode z Millisom (): 4 koraki
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:04
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:
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:
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…
Č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:
Učinek časovne manipulacije z diferencialnim stroboskopom (natančno podrobno): 10 korakov
Učinek časovne manipulacije z diferencialnim stroboskopom (temeljito podrobno): Danes se bomo naučili izdelati diferencialni stroboskop, s katerim se lahko občasno premikajoči se predmeti pojavljajo v očeh. Še vedno dovolj, da upoštevamo manjše podrobnosti v predilnem predmetu, ki je sicer v bistvu neviden. Lahko prikaže tudi bea
Vodotesna spletna kamera Wi -Fi DSLR z napajanjem Raspberry Pi za časovne presledke: 3 koraki (s slikami)
Vodotesna spletna kamera Wi -Fi DSLR z napajanjem Raspberry Pi za časovne presledke: nagajam pri gledanju sončnih zahodov od doma. Tako zelo, da dobim malo FOMO, ko je dober sončni zahod in nisem doma, da bi ga videl. Spletne kamere IP so prinesle razočaranje kakovosti slike. Začel sem iskati načine, kako preurediti svoj prvi DSLR: Cano iz leta 2007
Mehanizem pomika in nagiba za časovne presledke DSLR: 7 korakov (s slikami)
Mehanizem pomika in nagiba za časovne presledke DSLR: Nekaj koračnih motorjev je ležalo naokoli in res sem jih želel uporabiti, da naredim nekaj kul. Odločil sem se, da bom za svoj fotoaparat DSLR naredil sistem Pan and Tilt, da bom lahko ustvarjal hladne časovne zamike. Predmeti, ki jih potrebujete: 2x koračni motorji -htt
Kako dati stenski uri svetleče roke in časovne intervale: 14 korakov (s slikami)
Kako dati stenski uri svetleče kazalce in časovne intervale: želeli smo stensko uro v spalnici s svetlečimi kazalci in prikazom petih minut in četrt ure. Moral je biti brez težav berljiv iz postelje, svetilnost pa je morala trajati celo noč
Metode odkrivanja nivoja vode Arduino z uporabo ultrazvočnega senzorja in senzorja vode Funduino: 4 koraki
Metode odkrivanja nivoja vode Arduino z uporabo ultrazvočnega senzorja in senzorja vode Funduino: V tem projektu vam bom pokazal, kako z dvema metodama ustvarite poceni detektor vode: 1. Ultrazvočni senzor (HC-SR04) .2. Senzor vode Funduino