Përmbajtje:

Metodat e kohës Arduino me Millis (): 4 hapa
Metodat e kohës Arduino me Millis (): 4 hapa

Video: Metodat e kohës Arduino me Millis (): 4 hapa

Video: Metodat e kohës Arduino me Millis (): 4 hapa
Video: VL53L1X Лазерный дистанционный датчик времени полета 400 см 2024, Korrik
Anonim
Metodat e kohës Arduino me Millis ()
Metodat e kohës Arduino me Millis ()

Në këtë artikull ne prezantojmë millis (); funksionojë dhe vihet në përdorim për të krijuar shembuj të ndryshëm të kohës.

Millis? Asgjë që ka të bëjë me buzët … s'presojmë që ju e keni njohur milli-n si parashtesë numerike për një të mijtat; që shumëzon një njësi matëse me 0.001 (ose dhjetë në fuqinë e negativit 3).

Inglyshtë interesante që sistemet tona Arduino do të numërojnë numrin e milisekondave (mijëra sekonda) nga fillimi i një skicimi derisa numërimi të arrijë numrin maksimal të aftë për tu ruajtur në llojin e ndryshueshëm të panënshkruar gjatë (një numër i plotë 32-bit [katër bajt] -që shkon nga zero në (2^32) -1. (2^32) -1, ose 4294967295 milisekonda shndërrohet në ditë 49.71027-tek.

Numëruesi rivendoset kur Arduino rivendoset, arrin vlerën maksimale ose ngarkohet një skicë e re. Për të marrë vlerën e numëruesit në një moment të veçantë, thjesht telefononi funksionin - për shembull:

fillimi = millis ();

Aty ku fillimi është një ndryshore e gjatë pa shenjë. Këtu është një shembull shumë i thjeshtë për t'ju treguar millis () në veprim:

/ * milis () demonstrim */

fillimi i gjatë i panënshkruar, i përfunduar, i kaluar;

void setup ()

{Serial.fillo (9600); }

lak void ()

{Serial.println ("Fillo …"); fillimi = millis (); vonesa (1000); përfunduar = millis (); Serial.println ("Përfunduar"); i kaluar = përfunduar-fillimi; Serial.print (ka kaluar); Serial.println ("kaluan milisekonda"); Serial.println (); vonesë (500); }

Skica ruan numërimin aktual të mililit në fillim, pastaj pret një sekondë, pastaj ruan vlerën e mililit përsëri në përfunduar. Më në fund llogarit kohën e kaluar të vonesës. Në deponinë e mëposhtme të ekranit të monitorit serik, mund të shihni se kohëzgjatja nuk ishte gjithmonë saktësisht 1000 milisekonda, siç tregohet në imazh.

Hapi 1:

Imazhi
Imazhi

Për ta thënë thjesht, funksioni millis përdor një numërues të brendshëm brenda mikrokontrolluesit ATmega në zemër të Arduino tuaj. Ky numërues rrit çdo cikël të orës - i cili ndodh (në Arduino standarde dhe të pajtueshëm) me një shpejtësi sahati prej 16 Mhz. Kjo shpejtësi kontrollohet nga kristali në tabelën Arduino (sendi i argjendtë me vulën T16.000 në të).

Hapi 2:

Imazhi
Imazhi

Saktësia e kristalit mund të ndryshojë në varësi të temperaturës së jashtme dhe tolerancës së vetë kristalit. Kjo nga ana tjetër do të ndikojë në saktësinë e rezultatit tuaj millis. Përvoja anekdotike ka raportuar se ndryshimi në saktësinë e kohës mund të jetë rreth tre ose katër sekonda për një periudhë njëzet e katër orësh.

Nëse jeni duke përdorur një tabelë ose versionin tuaj që përdorni një rezonator qeramik në vend të një kristali, vini re se ato nuk janë aq të sakta dhe do të prezantojnë mundësinë e niveleve më të larta të domethënies. Nëse keni nevojë për një nivel shumë më të lartë të saktësisë së kohës, merrni parasysh IC të caktuara të kohëmatësit, siç është Maxim DS3231.

Tani ne mund të përdorim millis për funksione të ndryshme kohore. Siç u demonstrua në skicën e shembullit të mëparshëm, ne mund të llogarisim kohën e kaluar. Për ta çuar këtë ide përpara, le të bëjmë një kronometër të thjeshtë. Të bësh kështu mund të jetë aq e thjeshtë ose aq komplekse sa është e nevojshme, por për këtë rast ne do të devijojmë drejt së thjeshtës.

Nga pikëpamja e harduerit, ne do të kemi dy butona-Fillimi dhe Ndalimi-me rezistencat tërheqëse 10km të lidhura me kunjat dixhitale 2 dhe 3 respektivisht. Kur përdoruesi të shtypë, skica do të shënojë vlerën për milis - atëherë pasi të shtypet ndalesa, skica përsëri do të shënojë vlerën për milis, do të llogarisë dhe shfaqë kohën e kaluar. Përdoruesi mund të shtypë fillimin për të përsëritur procesin, ose të ndalojë për të dhënat e përditësuara. Këtu është skica:

/* Kronometri super-bazë duke përdorur millis (); */

fillimi i gjatë i panënshkruar, i përfunduar, i kaluar;

void setup ()

{Serial.fillo (9600); pinMode (2, INPUT); // butoni i fillimit pinMode (3, INPUT); // butoni i ndalimit Serial.println ("Shtypni 1 për Start/reset, 2 për kohën e kaluar"); }

void displayResult ()

{noton h, m, s, ms; i panënshkruar prej kohësh; i kaluar = përfunduar-fillimi; h = int (ka kaluar/3600000); mbi = kaluar%3600000; m = int (mbi/60000); mbi = mbi 6000000; s = int (mbi/1000); ms = mbi%1000; Serial.print ("Koha e papërpunuar e kaluar:"); Serial.println (ka kaluar); Serial.print ("Koha e kaluar:"); Serial.print (h, 0); Serial.print ("h"); Serial.print (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

lak void ()

{if (digitalRead (2) == LART) {fillimi = milis (); vonesë (200); // për debounce Serial.println ("Filloi …"); } if (digitalRead (3) == HIGH) {përfunduar = millis (); vonesë (200); // për debounce displayResult (); }}

Thirrjet për të vonuar () përdoren për të anuluar çelsat - këto janë opsionale dhe përdorimi i tyre do të varet nga pajisja juaj. Imazhi është një shembull i daljes serike të skicës së monitorit - kronometri ka filluar, dhe pastaj butoni dy shtypet gjashtë herë gjatë periudhave kohore.

Hapi 3: Speedometër…

Image
Image

Nëse keni pasur një sensor në fillim dhe në fund të një distance fikse, shpejtësia mund të llogaritet: shpejtësia = distanca ÷ koha.

Ju gjithashtu mund të bëni një shpejtësimatës për një formë lëvizjeje me rrota, për shembull një biçikletë. Për momentin ne nuk kemi një biçikletë për tu ngatërruar, megjithatë mund ta përshkruajmë procesin për ta bërë këtë - është fare e thjeshtë. (Disclaimer - bëjeni këtë në rrezikun tuaj, etj.)

Para së gjithash, le të rishikojmë matematikën e nevojshme. Ju do të duhet të dini perimetrin e rrotës. Pajisje kompjuterike - do t'ju duhet një sensor. Për shembull - një kaloni kallam dhe magnet. Konsideroni çelësin e kallamit të jetë një buton normalisht i hapur dhe lidheni si zakonisht me një rezistencë tërheqëse prej 10khm.

Të tjerët mund të përdorin një sensor të efektit të sallës-secili për veten e tij). Mos harroni nga klasa e matematikës, për të llogaritur perimetrin - përdorni formulën: perimetri = 2πr ku r është rrezja e rrethit.

Tani që keni perimetrin e rrotës, kjo vlerë mund të konsiderohet si 'distanca jonë fikse', dhe për këtë arsye shpejtësia mund të llogaritet duke matur kohën e kaluar midis një rrotullimi të plotë.

Sensori juaj-pasi të jetë i pajisur-duhet të veprojë në të njëjtën metodë si një buton normalisht i hapur që shtyhet çdo rrotullim. Skica jonë do të masë kohën e kaluar midis çdo pulsi nga sensori.

Për ta bërë këtë, shembulli ynë do të ketë daljen e sensorit të lidhur me pinin dixhital 2 - pasi do të shkaktojë një ndërprerje për të llogaritur shpejtësinë. Skica përndryshe do të shfaq shpejtësinë në një modul normal të ndërfaqes LCD I2C. Ndërfaqja I2C sugjerohet pasi kjo kërkon vetëm 4 tela nga bordi Arduino në LCD - sa më pak tela aq më mirë.

Këtu është skica për leximin tuaj:

/*Shpejtësimatës bazë duke përdorur millis (); */

#përfshi "Wire.h" // për LCD me autobus I2C

#përfshi "LiquidCrystal_I2C.h" // për modulin LCD të autobusit I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // vendosni adresën LCD në 0x27 për një ekran me 16 karaktere dhe 2 rreshta

fillimi i notimit, i përfunduar;

nota e kaluar, koha; float qarkMetrike = 1.2; // perimetri i rrotës në lidhje me pozicionin e sensorit (në metra) noton qarkImperial; // duke përdorur 1 kilometër = 0.621371192 milje noton speedk, speedm; // mban vale të shpejtësisë së llogaritur në metrikë dhe perandorake

void setup ()

{attachInterrupt (0, speedCalc, RISING); // ndërprerja e thirrur kur sensorët dërgon dixhital 2 të lartë (çdo rrotullim i rrotave) start = millis (); // konfiguroni LCD lcd.init (); // inicializoni lcd lcd.lightlight (); // ndizni LCD backlight lcd.clear (); lcd.println ("Vish një përkrenare!"); vonesë (3000); lcd.qartë (); Serial.filloj (115200); circImperial = circMetric*.62137; // konvertoni metrikën në perandorake për llogaritjet MPH}

void speedCalc ()

{elapsed = millis ()-fillimi; fillimi = millis (); speedk = (3600*rrethMetrik)/e kaluar; // km/h shpejtësia = (3600*rrethImperial)/e kaluar; // Milje per ore }

lak void ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km/h"); lcd.print (int (shpejtësi)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (e kaluar)); lcd.print ("ms/rev"); vonesa (1000); // rregullo për preferencat personale për të minimizuar dridhjen}

Nuk po ndodh aq shumë - sa herë që rrota përfundon një rrotullim, sinjali nga sensori do të shkojë nga i ulët në i lartë - duke shkaktuar një ndërprerje e cila thërret funksionin speedCalc ().

Kjo merr një lexim të millis () dhe më pas llogarit ndryshimin midis leximit aktual dhe leximit të mëparshëm - kjo vlerë bëhet koha për të mbuluar distancën (e cila është perimetri i rrotës në krahasim me sensorin - e ruajtur në

float qarkMetrike = 1.2;

dhe matet në metra). Më në fund llogarit shpejtësinë në km/orë dhe MPH. Midis ndërprerjeve skica shfaq të dhënat e përditësuara të shpejtësisë në LCD si dhe vlerën e papërpunuar të kohës për çdo revolucion për hir të kuriozitetit. Në jetën reale nuk mendoj se dikush do të montonte një LCD në një biçikletë, mbase një ekran LED do të ishte më i rëndësishëm.

Ndërkohë, mund të shihni se si funksionon ky shembull në videoklipin e shkurtër të mëposhtëm. Në vend të një kombinimi të rrotave të biçikletave dhe kallamit/kallamit/magnetit, unë kam lidhur daljen e valës katrore nga një gjenerator funksioni në kunjin e ndërprerjes për të simuluar impulset nga sensori, kështu që ju mund të merrni një ide se si funksionon.

Hapi 4:

Kjo përmbledh përdorimin e millis () për momentin. Ekziston edhe mikroskodi (); funksion i cili numëron mikrosekonda.

Pra, ju e keni atë - një funksion tjetër praktik që mund të lejojë që më shumë probleme të zgjidhen përmes botës së Arduino. Si gjithmonë, tani ju takon juve dhe imagjinatës tuaj për të gjetur diçka për të kontrolluar ose për të arritur deri në mashtrimet e tjera.

Ky postim ju është sjellë nga pmdway.com - gjithçka për prodhuesit dhe entuziastët e elektronikës, me shpërndarje falas në të gjithë botën.

Recommended: