Мазмұны:

Millis () көмегімен Arduino хронометраждық әдістері: 4 қадам
Millis () көмегімен Arduino хронометраждық әдістері: 4 қадам

Бейне: Millis () көмегімен Arduino хронометраждық әдістері: 4 қадам

Бейне: Millis () көмегімен Arduino хронометраждық әдістері: 4 қадам
Бейне: Уроки Arduino #4 - функции времени 2024, Шілде
Anonim
Millis көмегімен Arduino хронометраждық әдістері ()
Millis көмегімен Arduino хронометраждық әдістері ()

Бұл мақалада біз millis () енгіземіз; функциясын қолданыңыз және оны әр түрлі уақыт мысалдарын жасау үшін қолданыңыз.

Милис? Ерін синхрондауыштармен ешқандай байланысы жоқ … сіз мыңды мыңдық сандық префикс ретінде таныдыңыз деп үміттенемін; бұл өлшем бірлігін 0,001 -ге көбейту (немесе ондықтың теріс мәніне он).

Бір қызығы, біздің Arduino жүйелері эскиздің басынан бастап белгісіз ұзын (32-биттік [төрт байт] бүтін санды сақтауға болатын максималды санға жеткенге дейін миллисекунд санын (мың секунд) есептейді. -бұл нөлден (2^32) -1-ге дейін. (2^32) -1 немесе 4294967295 миллисекунд 49.71027-тақ күндерге түрлендіріледі.

Есептегіш Arduino қалпына келтірілгенде, ол максималды мәнге жетеді немесе жаңа эскиз жүктеледі. Белгілі бір уақытта есептегіштің мәнін алу үшін функцияға қоңырау шалыңыз - мысалы:

бастау = millis ();

Мұндағы бастау - белгісіз ұзақ айнымалы. Милис () әрекетін көрсететін өте қарапайым мысал:

/ * millis () демонстрация */

қол қойылмаған ұзақ бастау, аяқталған, өткен;

жарамсыз орнату ()

{Serial.begin (9600); }

бос цикл ()

{Serial.println («Бастау …»); бастау = millis (); кешіктіру (1000); дайын = millis (); Serial.println («Аяқталды»); elapsed = аяқтау-бастау; Serial.print (өткен); Serial.println («миллисекундтар өтті»); Serial.println (); кешіктіру (500); }

Эскизде ағымдағы миллиллердің саны сақталады, содан кейін бір секунд күтеді, содан кейін миллис мәні дайын күйінде сақталады. Соңында ол кідірістің өткен уақытын есептейді. Сериялық монитордың келесі экрандық үйіндісінде сіз суретте көрсетілгендей ұзақтығы әрқашан дәл 1000 миллисекунд емес екенін көре аласыз.

1 -қадам:

Кескін
Кескін

Қарапайым тілмен айтқанда, millis функциясы ATmega микроконтроллерінің ішкі есептегішін сіздің Arduino орталығында қолданады. Бұл есептегіш әр сағаттық циклді жоғарылатады - бұл стандартты Arduino мен үйлесімділерде 16 МГц жиілігінде болады. Бұл жылдамдықты Arduino тақтасындағы кристал басқарады (күміс заттаңбада T16.000 бар).

2 -қадам:

Кескін
Кескін

Кристалл дәлдігі сыртқы температураға және кристалдың төзімділігіне байланысты өзгеруі мүмкін. Бұл өз кезегінде миллис нәтиженің дәлдігіне әсер етеді. Анекдоттық тәжірибе уақыт дәлдігінің өзгеруі жиырма төрт сағат ішінде шамамен үш-төрт секунд болуы мүмкін екенін көрсетті.

Егер сіз тақтаны немесе кристалдың орнына керамикалық резонаторды қолданатын өзіңіздің нұсқаңызды қолдансаңыз, олардың дәл емес екенін ескеріңіз және дрейф деңгейінің жоғарылау мүмкіндігін көрсетеді. Егер сізге уақыт дәлдігінің әлдеқайда жоғары деңгейі қажет болса, Maxim DS3231 сияқты арнайы таймер IC -лерін қарастырыңыз.

Енді біз миллиллерді әр түрлі уақыт функциялары үшін пайдалана аламыз. Алдыңғы мысалда көрсетілгендей, біз өткен уақытты есептей аламыз. Бұл идеяны алға жылжыту үшін қарапайым секундомер жасайық. Бұл қарапайым немесе қажет болғанша күрделі болуы мүмкін, бірақ бұл жағдайда біз қарапайымға қарай бет бұрамыз.

Аппараттық перспективада бізде екі түйме болады-Іске қосу және Тоқтату-тиісінше цифрлық 2 және 3 түйреуіштеріне қосылған 10к Ом тартылатын резисторлар. Пайдаланушы басуды басқан кезде эскиз миллис мәніне назар аударады, содан кейін тоқтау басылғаннан кейін эскиз миллис мәнін қайтадан еске түсіреді, өткен уақытты есептейді және көрсетеді. Пайдаланушы процесті қайталау немесе жаңартылған деректерді тоқтату үшін бастау түймесін басуы мүмкін. Міне нобай:

/* Millis () көмегімен супер негізгі секундомер; */

қол қойылмаған ұзақ бастау, аяқталған, өткен;

жарамсыз орнату ()

{Serial.begin (9600); pinMode (2, INPUT); // бастау батырмасы pinMode (3, INPUT); // тоқтату түймесі Serial.println («Бастау/қалпына келтіру үшін 1 басыңыз, өткен уақыт үшін 2 басыңыз»); }

void displayResult ()

{float h, m, s, ms; ұзақ қол қойылмаған; elapsed = аяқтау-бастау; h = int (өткен/3600000); артық = өткен%3600000; m = int (60000 -ден жоғары); артық =%60000 -ден жоғары; s = int (1000 -нан жоғары); ms =%1000 -нан жоғары; Serial.print («Өткен уақыт:»); Serial.println (өткен); Serial.print («Өткен уақыт:»); 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 (); }

бос цикл ()

{if (digitalRead (2) == HIGH) {start = millis (); кешіктіру (200); // шығару үшін Serial.println («Басталды…»); } if (digitalRead (3) == HIGH) {done = millis (); кешіктіру (200); // дисплейден шығару DisplayResult (); }}

Delay () қоңыраулары қосқыштарды өшіру үшін қолданылады - бұл міндетті емес және оларды қолдану сіздің аппараттық құралыңызға байланысты болады. Бұл сурет эскиздің сериялық мониторының мысалы болып табылады - секундомер басталды, содан кейін екі түйме уақыт аралығында алты рет басылды.

3 -қадам: Спидометр …

Image
Image

Егер сізде белгіленген қашықтықтың басында және соңында сенсор болса, жылдамдықты есептеуге болады: жылдамдық = қашықтық ÷ уақыт.

Дөңгелекті қозғалыс түріне, мысалы, велосипедке спидометр жасауға болады. Қазіргі уақытта бізде велосипед жоқ, бірақ біз бұл процесті сипаттай аламыз - бұл өте қарапайым. (Жауапкершіліктен бас тарту - мұны өз тәуекеліңізге және т.б.)

Алдымен қажетті математиканы қарастырайық. Сіз дөңгелектің айналасын білуіңіз керек. Аппараттық құрал - сенсор қажет болады. Мысалы - қамыс қосқышы мен магнит. Қамысты қосқышты қалыпты ашылатын түйме деп есептеп, әдеттегідей 10км тартылатын резистормен қосыңыз.

Басқалары холл-сенсорды қолдана алады-әрқайсысы жеке). Математика сабағынан шеңберді есептеу үшін есте сақтаңыз - формуланы қолданыңыз: шеңбер = 2πr, мұнда r - шеңбердің радиусы.

Енді сізде дөңгелектің айналасы бар, бұл мәнді «тұрақты қашықтық» деп санауға болады, сондықтан жылдамдықты толық айналу арасындағы өткен уақытты өлшеу арқылы есептеуге болады.

Сіздің датчик-бір рет орнатылған кезде-әр айналдырылатын қалыпты ашылатын түйме сияқты әрекет етуі керек. Біздің эскиз сенсордан әрбір импульстің арасындағы уақытты өлшейді.

Бұл үшін біздің мысалда сенсорлық шығыс 2 цифрлық түйреуішке қосылады, себебі ол жылдамдықты есептеу үшін үзіліс тудырады. Әйтпесе эскиз I2C интерфейсінің қалыпты СКД модулінде жылдамдықты көрсетеді. I2C интерфейсі ұсынылады, себебі Arduino тақтасынан СКД -ге тек 4 сым қажет - сымдар аз болған сайын жақсы.

Міне, сіздің қарауыңыздың эскизі:

/*Миллис () көмегімен негізгі спидометр; */

#қосу «Wire.h» // I2C шинасы үшін

#қосу «LiquidCrystal_I2C.h» // I2C шинасының СКД модулі үшін - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // 16 таңба мен 2 жолды дисплей үшін СКД мекенжайын 0x27 етіп орнатыңыз

өзгермелі старт, аяқталды;

қалқып шығу, уақыт; float circMetric = 1.2; // доңғалақтың шеңбері сенсордың орналасуына қатысты (метрмен) өзгермелі айналымImperial; // 1 километрді пайдалану = 0.621371192 миль жүзу жылдамдығы, speedm; // метрикалық және империялық жылдамдықтардың есептік мәндерін ұстайды

жарамсыз орнату ()

{attachInterrupt (0, speedCalc, RISING); // сенсорлар цифрлық 2 жоғары жіберген кезде шақырылатын үзіліс (дөңгелектің әр айналуы) старт = миллис (); // LCD lcd.init () орнату; // lcd lcd.backlight () инициализациялау; // LCD артқы жарығын қосу lcd.clear (); lcd.println («дулыға киіңіз!»); кешіктіру (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // MPH есептеулері үшін метриканы империяға түрлендіру}

бос жылдамдықCalc ()

{elapsed = millis ()-бастау; бастау = millis (); speedk = (3600*circMetric)/өткен; // км/сағ жылдамдық = (3600*circImperial)/өткен; // миль сағатына}

бос цикл ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print («км/сағ»); lcd.print (int (speedm)); lcd.print («MPH»); lcd.setCursor (0, 1); lcd.print (int (өткен)); lcd.print («ms/rev»); кешіктіру (1000); // жыпылықтауды азайту үшін жеке қалауыңызды реттеңіз}

Бұл көп нәрсе емес - дөңгелек бір айналымды аяқтаған сайын сенсордан сигнал төменнен жоғарыға ауысады, бұл speedCalc () функциясын шақыратын үзілісті тудырады.

Бұл миллис () көрсеткішін алады, содан кейін ағымдағы көрсеткіш пен алдыңғы көрсеткіш арасындағы айырмашылықты есептейді - бұл мән қашықтықты жабу уақытына айналады (бұл сенсорға қатысты дөңгелектің шеңбері)

float circMetric = 1.2;

және метрмен өлшенеді). Ол ақырында км/сағ және MPH жылдамдығын есептейді. Үзіліс арасындағы эскизде СКД -де жаңартылған жылдамдық деректері, сондай -ақ қызығушылық үшін әр революцияның бастапқы уақыты көрсетіледі. Нақты өмірде мен LCD дисплейді велосипедке ешкім орнатпайды деп ойлаймын, мүмкін жарықдиодты дисплей маңызды болар.

Бұл арада сіз бұл мысалдың қалай жұмыс істейтінін келесі қысқа бейнеклиптен көре аласыз. Велосипед дөңгелегі мен қамыс қосқышы/магнит комбинациясының орнына мен сенсордан импульсті имитациялау үшін функция генераторынан квадрат толқынды шығуды үзу түйреуішіне жалғадым, осылайша сіз оның қалай жұмыс істейтіні туралы түсінік ала аласыз.

4 -қадам:

Бұл әзірше millis () қолданылуын қорытындылайды. Сонымен қатар micros () бар; микросекундтарды есептейтін функция.

Міне, сізде - бұл басқа проблемалар Arduino әлемі арқылы шешуге мүмкіндік беретін тағы бір практикалық функция. Әдеттегідей, енді сіздің бақылауыңызда бір нәрсе табу немесе сіздің қиялыңызға байланысты.

Бұл хабарламаны pmdway.com сізге жеткізді - бұл өндірушілер мен электроникаға әуесқойлар үшін, бүкіл әлем бойынша ақысыз жеткізу.

Ұсынылған: