Turinys:

„Arduino“laiko nustatymo metodai su „Millis“(): 4 žingsniai
„Arduino“laiko nustatymo metodai su „Millis“(): 4 žingsniai

Video: „Arduino“laiko nustatymo metodai su „Millis“(): 4 žingsniai

Video: „Arduino“laiko nustatymo metodai su „Millis“(): 4 žingsniai
Video: Real time clock module (RTC) #arduino #diy #tech 2024, Lapkritis
Anonim
„Arduino“laiko nustatymo metodai su „Millis“()
„Arduino“laiko nustatymo metodai su „Millis“()

Šiame straipsnyje pristatome milis (); funkciją ir ją panaudoti kuriant įvairius laiko pavyzdžius.

Millis? Nieko bendro su lūpų siurbliais … tikiuosi, kad atpažinote milli kaip tūkstantosios dalies skaitinį priešdėlį; tai matavimo vienetas padauginamas iš 0,001 (arba dešimt iki neigiamo 3 laipsnio).

Įdomu tai, kad mūsų „Arduino“sistemos skaičiuos milisekundžių (tūkstančių sekundžių) skaičių nuo eskizo pradžios iki skaičiaus pasiekia didžiausią skaičių, kurį galima išsaugoti kintamojo tipo nepasirašytu ilgu (32 bitų [keturių baitų] sveiku skaičiumi) -kuris svyruoja nuo nulio iki (2^32) -1. (2^32) -1 arba 4294967295 milisekundžių konvertuoja į nelygines dienas 49,71027.

Skaitiklis atstatomas, kai „Arduino“iš naujo nustatomas, jis pasiekia didžiausią vertę arba įkeliamas naujas eskizas. Norėdami gauti skaitiklio vertę tam tikru momentu, tiesiog iškvieskite funkciją - pavyzdžiui:

pradžia = milis ();

Kur prasideda nepasirašytas ilgas kintamasis. Čia yra labai paprastas pavyzdys, parodantis, kaip veikia milis ():

/ * milis () demonstracija */

nepasirašyta ilga pradžia, baigta, praėjo;

negaliojanti sąranka ()

{Serial.begin (9600); }

tuštumos kilpa ()

{Serial.println („Pradėti…“); pradžia = milis (); vėlavimas (1000); baigta = milis (); Serial.println („Baigta“); praėjo = baigtas startas; Serial.print (praėjo); Serial.println („praėjo milisekundės“); Serial.println (); vėlavimas (500); }

Eskizas pradžioje išsaugo dabartinį milisų skaičių, tada palaukia vieną sekundę, tada vėl išsaugo milisų vertę. Galiausiai jis apskaičiuoja vėlavimo laiką. Kitame serijinio monitoriaus ekrano iškėlime galite pamatyti, kad trukmė ne visada buvo tiksliai 1000 milisekundžių, kaip parodyta paveikslėlyje.

1 žingsnis:

Vaizdas
Vaizdas

Paprasčiau tariant, „millis“funkcija naudoja vidinį skaitiklį „ATmega“mikrovaldiklyje, esančiame jūsų „Arduino“centre. Šis skaitiklis didėja kiekvieną laikrodžio ciklą, kuris vyksta (standartiniame „Arduino“ir suderinamuose įrenginiuose) esant 16 Mhz laikrodžio dažniui. Šį greitį valdo „Arduino“plokštės kristalas (sidabrinis daiktas su T166.000 įspaudu).

2 žingsnis:

Vaizdas
Vaizdas

Kristalų tikslumas gali skirtis priklausomai nuo išorinės temperatūros ir paties kristalo tolerancijos. Tai savo ruožtu turės įtakos jūsų milis rezultato tikslumui. Anekdotinė patirtis rodo, kad laiko tikslumo nukrypimas gali būti maždaug trys ar keturios sekundės per dvidešimt keturias valandas.

Jei naudojate plokštę ar savo versiją, kurioje vietoj kristalo naudojamas keraminis rezonatorius, atkreipkite dėmesį, kad jie nėra tokie tikslūs ir suteiks galimybę didesniam dreifo lygiui. Jei jums reikia daug didesnio laiko tikslumo, apsvarstykite konkrečius laikmačio IC, tokius kaip „Maxim DS3231“.

Dabar mes galime naudoti milis įvairioms laiko funkcijoms. Kaip parodyta ankstesniame eskizo pavyzdyje, galime apskaičiuoti praėjusį laiką. Norėdami įgyvendinti šią idėją, padarykime paprastą chronometrą. Tai padaryti gali būti taip paprasta ar sudėtinga, kaip būtina, tačiau šiuo atveju mes pasuksime į paprastą.

Aparatinės įrangos požiūriu turėsime du mygtukus-„Start“ir „Stop“-su 10k omų ištraukiamaisiais rezistoriais, prijungtais prie atitinkamai 2 ir 3 skaitmeninių kaiščių. Kai vartotojas paspaudžia paleidimą, eskizas užrašo milisų reikšmę, o paspaudus sustabdymą, eskizas vėl pažymės milisą, apskaičiuos ir parodys prabėgusį laiką. Tada vartotojas gali paspausti pradėti, kad pakartotų procesą, arba sustabdyti, kad gautų atnaujintus duomenis. Štai eskizas:

/* Super-paprastas chronometras naudojant milis (); */

nepasirašyta ilga pradžia, baigta, praėjo;

negaliojanti sąranka ()

{Serial.begin (9600); pinMode (2, INPUT); // pradžios mygtukas pinMode (3, INPUT); // sustabdymo mygtukas Serial.println ("Paspauskite 1, jei norite pradėti/atkurti, 2 - praėjusį laiką"); }

tuščias ekranasResult ()

{plūdė h, m, s, ms; nepasirašytas ilgai; praėjo = baigtas startas; h = int (praėjo/3600000); per = praėjo%3600000; m = int (daugiau nei 60000); daugiau = daugiau nei%60000; s = int (daugiau/1000); ms = daugiau kaip%1000; Serial.print („Neapdorotas laikas:“); Serial.println (praėjo); Serial.print („Praėjęs laikas:“); Serijinis atspaudas (h, 0); Serial.print ("h"); Serijinis atspaudas (m, 0); Serijinis atspaudas („m“); Serijos.spaudas (s, 0); Serial.print ("s"); Serijinis atspaudas (ms, 0); Serial.println ("ms"); Serial.println (); }

tuštumos kilpa ()

{if (digitalRead (2) == HIGH) {start = milis (); vėlavimas (200); // debounce Serial.println ("Pradėta …"); } if (digitalRead (3) == HIGH) {baigtas = milis (); vėlavimas (200); // debounce displayResult (); }}

Skambučiai atidėti () naudojami jungikliams atjungti - tai neprivaloma ir jų naudojimas priklausys nuo jūsų aparatūros. Vaizdas yra eskizo serijinio monitoriaus išvesties pavyzdys - įsijungė chronometras, o po to du mygtukai buvo nuspausti šešis kartus per tam tikrą laikotarpį.

3 žingsnis: spidometras…

Image
Image

Jei fiksuoto atstumo pradžioje ir pabaigoje turėtumėte jutiklį, greitį būtų galima apskaičiuoti: greitis = atstumas ÷ laikas.

Taip pat galite sukurti spidometrą, skirtą judėti ratukais, pavyzdžiui, dviračiu. Šiuo metu neturime dviračio, su kuriuo galėtume kištis, tačiau galime aprašyti, kaip tai padaryti - tai gana paprasta. (Atsisakymas - darykite tai savo rizika ir pan.)

Pirmiausia apžvelkime būtiną matematiką. Turite žinoti rato perimetrą. Techninė įranga - jums reikės jutiklio. Pavyzdžiui - nendrinis jungiklis ir magnetas. Manykite, kad nendrių jungiklis yra paprastai atidaromas mygtukas, ir kaip įprasta prijunkite 10k omų ištraukiamą rezistorių.

Kiti gali naudoti salės efekto jutiklį-kiekvienas savo). Prisiminkite iš matematikos pamokos, norėdami apskaičiuoti apskritimą - naudokite formulę: apskritimas = 2πr, kur r yra apskritimo spindulys.

Dabar, kai turite rato perimetrą, šią vertę galima laikyti mūsų „fiksuotu atstumu“, todėl greitį galima apskaičiuoti matuojant praleistą laiką tarp viso sukimosi.

Kai jutiklis bus sumontuotas, jis turėtų veikti tuo pačiu būdu, kaip ir paprastai atidaromas mygtukas, kuris paspaudžiamas kiekvieną kartą. Mūsų eskizas išmatuos laiką, praleistą tarp kiekvieno impulsų iš jutiklio.

Norėdami tai padaryti, mūsų pavyzdyje jutiklio išvestis bus prijungta prie 2 skaitmeninio kaiščio, nes tai sukels pertrauką, kad būtų galima apskaičiuoti greitį. Priešingu atveju eskizas rodys greitį įprastame I2C sąsajos LCD modulyje. Siūloma I2C sąsaja, nes tam reikia tik 4 laidų iš „Arduino“plokštės į skystųjų kristalų ekraną - kuo mažiau laidų, tuo geriau.

Čia yra eskizas, kurį galite perskaityti:

/*Pagrindinis spidometras naudojant milis (); */

#include "Wire.h" // I2C magistralės LCD

#include "LiquidCrystal_I2C.h" // I2C magistralės LCD moduliui - https://bit.ly/m7K5wt LiquidCrystal_I2C LCD (0x27, 16, 2); // nustatykite LCD adresą į 0x27, jei norite rodyti 16 simbolių ir 2 eilutes

plūdės pradžia, baigta;

plūdė praėjo, laikas; plūdė circMetric = 1,2; // rato apimtis jutiklio padėties atžvilgiu (metrais) float circImperial; // naudojant 1 kilometrą = 0.621371192 mylių plūdės speedk, speedm; // laiko apskaičiuotus greičio rodiklius metriniais ir imperiniais

negaliojanti sąranka ()

{attachInterrupt (0, speedCalc, RISING); // pertraukimas vadinamas, kai jutikliai siunčia skaitmeninį 2 aukštą (kiekvieną rato sukimąsi) start = millis (); // LCD sąranka lcd.init (); // inicijuoti lcd lcd.backlight (); // įjungti LCD apšvietimą lcd.clear (); lcd.println ("Dėvėkite šalmą!"); vėlavimas (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // konvertuoti metriką į imperinę MPH skaičiavimams}

void speedCalc ()

{elapsed = millis ()-pradžia; pradžia = milis (); speedk = (3600*circMetric)/praėjo; // km/h speedm = (3600*circImperial)/praėjo; // Mylios per valandą }

tuštumos kilpa ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km/h"); lcd.print (int (greitis)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (praėjo)); lcd.print ("ms/rev"); vėlavimas (1000); // koreguokite pagal asmenines nuostatas, kad sumažintumėte mirgėjimą}

Vyksta ne tiek jau daug - kiekvieną kartą, kai ratas užbaigia vieną apsisukimą, jutiklio signalas pereina nuo žemo iki aukšto lygio, sukeldamas pertrauką, kuri iškviečia funkciją speedCalc ().

Tai parodo milis () ir tada apskaičiuoja skirtumą tarp dabartinio rodmens ir ankstesnio rodmens - ši vertė tampa laiku įveikti atstumą (kuris yra rato perimetras, palyginti su jutikliu)

plūdė circMetric = 1,2;

ir matuojamas metrais). Galiausiai jis apskaičiuoja greitį km/h ir MPH. Tarp pertraukų eskizas rodo atnaujintus greičio duomenis skystųjų kristalų ekrane ir neapdorotą laiko vertę kiekvienam apsisukimui dėl smalsumo. Realiame gyvenime nemanau, kad kas nors montuotų LCD ant dviračio, galbūt LED ekranas būtų tinkamesnis.

Tuo tarpu, kaip veikia šis pavyzdys, galite pamatyti šiame trumpame vaizdo įraše. Vietoj dviračio rato ir nendrinio jungiklio/magneto derinio aš prijungiau kvadratinių bangų išvestį iš funkcijų generatoriaus prie pertraukimo kaiščio, kad imituotų impulsus iš jutiklio, kad galėtumėte suprasti, kaip jis veikia.

4 žingsnis:

Tai beveik apibendrina naudojimą milis () kol kas. Taip pat yra micros (); funkcija, kuri skaičiuoja mikrosekundes.

Taigi jūs turite tai - dar viena praktinė funkcija, leidžianti išspręsti daugiau problemų per „Arduino“pasaulį. Kaip visada, dabar jūs ir jūsų vaizduotė turite surasti ką nors, ką suvaldytumėte ar pasikliautumėte kitais nuodėmiais.

Šį įrašą jums pateikė pmdway.com - viskas gamintojams ir elektronikos entuziastams, nemokamas pristatymas visame pasaulyje.

Rekomenduojamas: